为了账号安全,请及时绑定邮箱和手机立即绑定

Android四大组件之Broadcast Receiver

标签:
Android

三、Broadcast Receiver

    1、注册方式

        a、静态注册

            在AndroidManifest中注册

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="命名规则一般建议为:包名.intent.类名"/>
    </intent-filter>
</receiver>

            静态广播是全局常驻广播

        b、动态注册

            使用代码注册

//filter是设置receiver的拦截器
IntentFilter filter = new IntentFilter("com.net168.testBcr.intent.mybroadcastreceiver");
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
//动态注册广播接收者
registerReceiver(receiver, filter);
//注销
unregisterReceiver(receiver);

    2、两种注册方式的区别

         a、静态注册的广播接收者一经安装就常驻在系统之中,不需要重新启动唤醒接收者;动态注册的广播接收者随着应用的生命周期,由registerReceiver开始监听,由unregisterReceiver撤销监听,另外需要注意的一点就是如果应用退出后,没有注销相对应的接收者应用应用将会报错。

        b、当广播接收者通过intent启动一个activity或者service时,如果intent中无法匹配到相应的组件。动态注册的广播接收者将会导致应用报错,而静态注册的广播接收者将不会有任何报错

    3、Broadcast Receiver生命周期只有10s,如果10秒内没执行结束onReceiver(),系统将会报错,onReceiver()执行完毕,该实例将会被销毁,所以不要在onReceiver()中执行耗时操作或创建子线程处理业务(因为可能子线程没处理完,接收者就被回收了);正确的处理方法就是通过intent调用activity或者service处理业务。

    4、广播的五种类型:

        a、普通广播

        完全异步执行的广播,广播发出后,所有的广播接收器都会收到,效率较高而且不能截断

Intent intent = new Intent();
//对应BroadcastReceiver中intentFilter的action
intent.setAction(BROADCAST_ACTION);
//发送广播
sendBroadcast(intent);
<receiver android:name=".MBroadcastReceiver" >    
        //用于接收网络状态改变时发出的广播
    <intent-filter>
        <action android:name="BROADCAST_ACTION" />
    </intent-filter>
</receiver>

        b、有序广播(orderedBroadcast)

            同步执行的广播,广播发出后,优先级高的广播接收器先接收,然后可以选择截断或继续传递当前广播,若截断,则之后的广播接收器将无法接收到此广播,发送方式为sendOrderedBroadcast()

  • 有序广播的接收者们将按照事先命的优先级依次接收,数越大优先级越高(取值范围:-1000~10000)

  • 优先级可以声明在<intent-filter android:priority="n"/>

<receiver 
    android:name=".MBroadcastReceiver" >
    <!-- priority优先级:数字越高优先级越高 -->
    <intent-filter android:priority="2">
        <action android:name="BROADCAST_ACTION2" />
    </intent-filter>
    <intent-filter android:priority="1">
        <action android:name="BROADCAST_ACTION1" />
    </intent-filter></receiver
  • 也可以调用IntentFilter对象的setPriority()设置。

IntentFilter intentFilter = new IntentFilter();
intentFilter.setAction(BROADCAST_ACTION2);
intentFilter.setPriority(2);
registerReceiver(mBroadcastReceiver, intentFilter);
  • 调用abortBroadcast()方法即可终止,一旦终止后面接收者就无法接受广播。

        c、系统广播(SystemBroadcast)

            比如监听来短信了,监听屏幕打开关闭等。此处不一一举例,具体对应的action可查看官方文档或百度。

            当使用系统广播时,只需要在注册广播接收者时定义相关的action即可,并不需要手动发送广播,当系统有相关操作时会自动进行系统广播

        d、应用内广播(LocalBroadcast)

    • Android中的广播可以跨进程甚至跨App直接通信,且注册是exported对于有intent-filter的情况下默认值是true,由此将可能出现安全隐患如下:

                1)、其他App可能会针对性的发出与当前App intent-filter相匹配的广播,由此导致当前App不断接收到广播并处理;
                2)、其他App可以注册与当前App一致的intent-filter用于接收广播,获取广播具体信息。

    • 处理安全隐患的方式有:

                1)、对于同一App内部发送和接收广播,将exported属性人为设置成false,使得非本App内部发出的此广播不被接收;
                2)、在广播发送和接收时,都增加上相应的permission,用于权限验证;
                3)、发送广播时,指定特定广播接收器所在的包名,具体是通过intent.setPackage(packageName)指定在,这样此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中

    • 使用方法

      使用方式上与通常的全局广播几乎相同,只是注册/取消注册广播接收器和发送广播时将主调context变成了LocalBroadcastManager的单一实例。

//注册应用内广播接收器
localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);
//注销
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);

Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
//发送应用内广播
localBroadcastManager.sendBroadcast(intent);
  • 对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager动态注册,不能静态注册,相比于普通广播,其安全性更贵,效率更高。

e、粘性广播(StickyBroadcast)

 官方不再推荐使用,不做赘述。



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
1
获赞与收藏
1

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消