程就会被标记为一个空线程,根据
Android 的内存管理策略,在系统内存紧张的时候,会
按照优先级,结束优先级低的线程,而空线程无异是优先级最低的,这样就可能导致
BroadcastReceiver 启动的子线程不能执行完成。
BroadcastReceiver 的种类
上面提到,当系统以一个
Intent 的形式发送一个 Broadcast 出去之后,所有与之匹配的
BroadcastReceiver 都会被实例化,但是这里是有区别的,根据 Broadcast 的传播方式区别,
在系统中有如下两种
Broadcast:
1 普通广播:Normal Broadcase,它是完全异步的,也就是说,在逻辑上,当一个
Broadcast 被发出之后,所有的与之匹配的 BroadcastReceiver 都同时接收到 Broadcast。
优点是传递效率比较高,但是也有缺点,就是一个
BroadcastReceiver 不能影响其他响
应这条
Broadcast 的 BroadcastReceiver。
2 有序广播:Ordered Broadcast,它是同步执行的,也就是说有序广播的接收器将会
按照预先声明的优先级依次接受
Broadcast,是链式结构,优先级越高(-
1000~1000),越先被执行。因为是顺序执行,所有优先级高的接收器,可以把执行结
果传入下一个接收器中,也可以终止
Broadcast 的传播(通过 abortBroadcast()方法),
一旦
Broadcast 的传播被终止,优先级低于它的接收器就不会再接收到这条 Broadcast
了。
虽然系统存在两种类型的
Broadcast,但是一般系统发送出来的 Broadcast 均是有序广
播,所以可以通过优先级的控制,在系统内置的程序响应前,对
Broadcast 提前进行响应。
这就是市场上一些拦截器类(如:短信拦截器、电话拦截器)的软件的原理。
如何发送一个广播
上面已经介绍了系统中两种不同的
Broadcast,而根据 Broadcast 传播的方式,Context
提供了不同的方法来发布它们:
3 sendBroadcast():发送普通广播。
4 sendOrderedBroadcast():发送有序广播。
以上两个方法都有多个重载方法,根据不同的场景使用,最简单的莫过于直接传递一
个
Intent 来发送一个广播。
如何使用
BroadcastReceiver
BroadcastReceiver 本质上还是一个监听器,所以使用 BroadcastReceiver 的方法也是非
常简单,只需要继承
BroadcastReceiver,在其中重写 onReceive(Context context,Intent intent)
即可。一旦实现了
BroadcastReceiver,并部署到系统中后,就可以在系统的任何位置,通过
sendBroadcast、sendOrderedBroadcast 方法发送 Broadcast 给这个 BroadcastReceiver。