六.Android的BroadCastReceiver

作者: KaelQ | 来源:发表于2016-07-29 10:11 被阅读206次

    1.BroadCastReceiver概述

    • 说起这个组件,就不得不提到广播了。广播是应用程序之间传输信息的机制。是为了方便数据的通信,例如监听一些广播,如来电、来短信等。
    • 广播的流程:发送—>接收。** 一个发送,多个接收。**
      如图


      broadcast

    2 流程

    2.1 发送

    普通广播、有序广播

    广播分类 发送方法
    普通广播 Context.sendBroadcast()
    有序广播 Context.sendOrderedBroadcast()
    • 普通广播有以下特性:
      1. 它是完全异步的。
      2. 所有的receivers接收器的执行顺序不确定。因此,所有的receivers接收器接收broadcast的顺序不确定。
      3. 这种方式效率更高!
        代码如下:
    Intent intent = new Intent(“com.app.bc.test”);  
    sendBroadcast(intent);//发送广播事件  
    
    • 有序广播有以下特性:
      1. BroadcastReceiver可以使用setResult系列函数来结果传给下一个 BroadcastReceiver,通过getResult系列函数来取得上个BroadcastReceiver返回的结果,并可以abort系列函数来让系统丢弃该广播让,使用该广播不再传送到别的BroadcastReceiver。
      2. BroadcastReceiver拥有优先级属性,即android:priority="100",取值范围为1000~-1000,数值越大,优先级别就越高。
    Intent intent = new Intent(“com.app.bc.test”);  
    sendOrderedBroadcast(intent,null);//发送广播事件  
    

    2.2 接收

    • 接收:BroadcastReceiver,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。onReceive()方法生命周期只有10秒,即不要在这里执行太长的任务。(这里确确实实是10秒,我专门翻墙看了官方文档0.0)
    class MyBroadcastReceiver extends BroadcastReceiver {  
         //接收到广播会被自动调用    
        @Override  
        public void onReceive (Context context, Intent intent) {  
            //从Intent中获取action  
            …your code here…  
        }  
    }  
    

    3 注册与过滤器

    • 注册:正如Activity使用一样,broadcast同样需要注册。
    • 过滤器:不可能所有的广播都要接收,所以便有了过滤器,区别所有的广播的就是aciton了,有官方和自定义的。

    静态注册、动态注册

    • 静态注册:在AndroidManifest.xml注册。因为它是四大组件之一,所以它的位置和Activity同级。
    <application>  
        <activity name=""/>  
        <receiver android:name=".MyBroadcastReceiver">  
            <!-- intent过滤器,指定可以匹配哪些intent, 一般需要定义action 可以是自定义的也可是系统的 -->   
            <intent-filter>  
                <action android:name="com.app.bc.test"/>  <!--action作为过滤的唯一判定标准-->
            </intent-filter>  
        </receiver>  
    </application>  
    
    • 动态注册:
    SMSReceiver  smsReceiver = new SMSReceiver();  
    IntentFilter filter = new IntentFilter();         //新建一个intent过滤器
    filter.addAction(“android.provider.Telephony.SMS_RECEIVED”);  //加入action
    TestBC1Activity.this.registerReceiver(smsReceiver, filter);   //注册
    
    • 区别
    1. 静态注册:在AndroidManifest.xml注册,android不能自动销毁广播接收器,也就是说当应用程序关闭后,还是会接收广播。
    2. 动态注册:在代码中通过registerReceiver()手工注册。当程序关闭时,该接收器也会随之销毁。当然,也可手工调用unregisterReceiver()进行销毁。

    4.总结

    方法 含义
    sendBroadcast 发送普通广播
    sendOrderedBroadcast 发送有序广播
    onReceive 接收广播后调用
    intent-filter 静态注册的过滤器
    priority 有序广播优先级
    filter.addAction 动态注册过滤器添加 action
    registerReceiver 动态注册
    unregisterReceiver() 手动销毁

    5.日常福利

    Github源码地址

    相关文章

      网友评论

      本文标题:六.Android的BroadCastReceiver

      本文链接:https://www.haomeiwen.com/subject/tnqzjttx.html