BroadcastReceiver,四大组件之一,本质上就是一种全局的监听器,用于监听系统全局的广播消息。由于BroadcastReceiver是一种全局的监听器,因此它可以非常方便地实现系统中不同组件之间的通信。
生命周期
它的生命周期不像Activity或者Service一样有一个完整的周期,广播注册之后,当触发onReceive()方法之后,就会被销毁。别以为你能在onReceive()方法内执行耗时的操作,如果onReceiver()方法不能在10秒内执行完成,Android会认为该程序无响应。Yeah,so 生命周期如此之短,so 不要在onReceiver()方法里执行一些耗时的操作,否则会弹出ANR(Application No Response)的对话框。那怎么办呢?
如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。而不是使用子线程的方法来解决,因为BroadcastReceiver的生命周期很短(在onReceive()执行后BroadcastReceiver 的实例就会被销毁),子线程可能还没有结束BroadcastReceiver就先结束了。如果BroadcastReceiver结束了,它的宿主进程还在运行,那么子线程还会继续执行。但宿主进程此时很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。
注册方法
BroadcastReceiver用于监听被广播的事件(Intent)为了达到这个目的,BroadcastReceiver必须进行注册,注册的方法有以下两种:
- 在应用程序的代码当中进行注册(动态注册)。
- 在AndroidManifest.xml当中进行注册(静态注册)。
记得:动态注册应在Activity或者Service销毁的时候unregisterBroadcast(撤销注册)
有序广播
普通的广播我就不啰嗦了,我们看看有序广播,没用过吧。
看看它的特点:
1.按优先级的不同,优先Receiver可对数据进行处理,并传给下一个Receiver
2.通过abortBroadcast可终止广播的传播
一看特点,我总会想起Java设计模式的责任链模式,呵呵。
使用方法:
优先接收到Broadcast的Receiver可通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,
下一个Receiver 通过 Bundle bundle=getResultExtras(true)方法获取上一个 Receiver传来的数据
我们也可以在某个广播用abortBroadcast()方法切断广播,不传到下一个广播。
优先级的设置,可以通过在intent-filter中设置android:priority属性来设置receiver的优先级,优先级相同的receiver其执行顺序不确定。
如果BroadcastReceiver是代码中注册的话,且其intent-filter拥有相同android:priority属性的话,先注册的将先收到广播。
使用场景
这里接收短信的广播是有序广播,因此可以设置你自己的广播接收器的级别高于系统原来的级别,就可以拦截短信,并且不存收件箱,也不会有来信提示音。
有序广播的缺点:效率比较低
网友评论