background image

程就会被标记为一个空线程,根据

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。