三、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)
官方不再推荐使用,不做赘述。
共同学习,写下你的评论
评论加载中...
作者其他优质文章