zoukankan      html  css  js  c++  java
  • Android学习笔记【07】【四大组件之广播接收者】

    一、为什么需要广播接收(BroadcastReceiver)

    话题外:互联网营销模式

    投资,向用户免费开发,积攒用户,然后出收费功能

    二、广播接收者案例:IP拨号器

    1、定义一个类继承BroadcastReceiver

    2、清单文件里配置广播接收者(需要接收的内容action)

    3、重写onReceive方法

    4、如果需要权限,添加对应的权限

    三、广播接收者案例:SD卡状态监听

    String action = intent.getAction()获取广播的事件(配置接收时的action)

    MEDIA_MOUNT和UNMOUNT需要配置data的scheme="file"

    四、广播接收者案例:短信监听器

    短信接收的广播可以配,没有自动提示

    1 <receiver android:name="com.xx.xx.xxReceiver">
    2     <intent-filter>
    3         <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    4     </intent-filter>
    5 </receiver>
    Object[] objects = (Object[]) intent.getExtras().get("pdus");//获取多条短信
    
    for(Object obj:objects){
    SmsManage smsManage = SmsManage.createFromPdu((byte[]) obj);
    String msgBody
    = smsManage.getMessageBody(); String address = smsManage.getOriginatingAddress(); }

    五、不同版本广播的特点

    1、4.0后,第一次安装应用的时候必须有界面,这样广播接收者才生效

    2、设置界面点击强行停止按钮,广播接收者也不会生效

    3、2.3手机上没有这样的安全设计

    六、广播接收者案例:卸载安装

    对应action:PACKAGE_INSTALL(没有使用)、PACKAGE_ADDED、PACKAGE_REMOVED

    配置data的scheme:package

    七、广播接收者案例:开机启动

    对应action:BOOT_COMPLETED

    需要权限:RECEIVE_BOOT_COMPLETED

    广播接收者中不能直接启动Activity

    如果要启动,对应intent需要设置FLAG:

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    八、有序广播和无序广播

    1、有序广播

    //Parameters
    //intent    The Intent to broadcast; all receivers matching this Intent will receive the broadcast.
    //receiverPermission    String naming a permissions that a receiver must hold in order to receive your broadcast. If null, no permission is required.
    //resultReceiver    Your own BroadcastReceiver to treat as the final receiver of the broadcast.
    //scheduler    A custom Handler with which to schedule the resultReceiver callback; if null it will be scheduled in the Context's main thread.
    //initialCode    An initial value for the result code. Often Activity.RESULT_OK.
    //initialData    An initial value for the result data. Often null.
    //initialExtras    An initial value for the result extras. Often null.
    public void sendOrderedBroadcast (Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, 
    Handler scheduler, int initialCode, String initialData, Bundle initialExtras);

    initialData获取:getResultData()

    接收者配置优先级(数字越大优先级越高):

    <intent-filter android:priority="1000">
        <action android:name="xxxx" />
    </intent-filter>

    优先级大的收到广播后可以操作:

    修改数据:setResultData();

    终止广播:abortBroadcast();

    2、无序广播

    intent.setAction("com.xxx.xxx");//用于接收广播者配置action
    intent.putExtra(key,value);
    sendBroadcast(intent);

    九、特殊广播接收者

    特别频繁的广播事件,在广播清单文件里注册无效,需要动态注册(事件:屏幕锁屏和解锁、电池电量变化)(普通广播也可以通过动态注册接收)

    ScreenReceiver receiver = new ScreenReceiver();
    IntentFilter filter = new IntentFilter();
    
    filter.addAction("android.intent.action.SCREEN_OFF");
    filter.addAction("android.intent.action.SCREEN_ON");
    
    //动态注册广播接收者(需要在onDestroy中取消注册)
    registerReceiver(receiver,filter);
    
    //取消注册
    unregisterReceiver(receiver);

    十、样式和主题

    1、样式:一般作用在控件上,作用范围小,styles(可以是其他jxml文件中定义,在values文件下即可)中自定义样式:

    <style name="my_style">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textSize">40sp</item>
        <item name="android:textColor">#00ff00</item>
    </style>

    布局中引用使用:

    <TextView
        style="@style/my_style"
        android:text="使用自定义的样式"/>

    2、主题:一般作用在activity或者Application节点下,作用范围大,定义方法与样式相同

    十一、国际化(i18n)

    中文目录:values-zh

    英文目录:values-en

    浏览器->nternet选项->语言->添加,可以查看对应名称(WIN7)

    十二、常见对话框

    对话框中上下文参数只能用this

    Toast

    普通对话框

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    
    builder.setTitle("标题");
    builder.setMessage("今天开心嘛");
    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
    
        }
    });
    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
    
        }
    });
    builder.show();

    单选对话框:

    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("请选择课程");
    final String[] items = new String[]{"Android","C#","Python","html"};
    builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //items[which] choosed
            dialog.dismiss();
        }
    });
    builder.show();

    多选对话框:

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("请选择爱好");
    final String[] items = new String[]{"游戏", "电影", "运动"};
    final boolean[] itemschecked = new boolean[]{false, true, false};
    
    builder.setMultiChoiceItems(items, itemschecked, new DialogInterface.OnMultiChoiceClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
            for (int i = 0; i < items.length; i++) {
                if (itemschecked[i]) {
                    //items[i] is checked
                }
            }
    
            dialog.dismiss();
        }
    });
    builder.show();

    进度条对话框(进度相关的控件,可以在子线程更新UI)

    ProgressDialog dialog =new ProgressDialog(this);
    dialog.setTitle("正在玩命加载中");
    //转圈
    dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    //水平,可以设置进度
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    
    dialog.show();

    十三、动画

    帧动画、属性动画、View动画(补间动画)

    帧动画:加载一系列的图片资源播放,形成的动画效果(一帧一帧的播放)

    final ImageView rocketImage = (ImageView) findViewById(R.id.iv);
    rocketImage.setBackgroundResource(R.drawable.my_anim);
    
    //低版本需要时间加载资源,写在线程中
    new Thread(){public void run(){
        SystemClock.sleep(20);
        AnimationDrawable rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
        rocketAnimation.start();
    };
    }.start();
  • 相关阅读:
    java的访问控制修饰符
    js将一个数组分割成二维子数组
    java的数组
    Java 变量类型
    java
    java的 %和 ^
    Python第三方库 -> 由于是ipynb格式,所以没有对应的输出结果
    获取浏览器历史记录 browserhistory
    虚拟机 CentOS 6.8 安装
    解决 django.db.utils.OperationalError: (1051, "Unknown table 'mydorm.users_studen t'")
  • 原文地址:https://www.cnblogs.com/leishoulin/p/7441355.html
Copyright © 2011-2022 走看看