组件 -- BroadcastReceiver

一、概念

BroadcastReceiver,广播接收者,它是一个系统全局的监听器,用于监听系统全局的Broadcast消息,所以它可以很方便地进行系统组件之间的通信。

二、生命周期

当在系统注册一个BroadcastReceiver之后,每次系统以一个Intent的形式发布Broadcast的时候,系统都会创建与之对应的BroadcastReceiver广播接收者实例,并自动触发它的onReceive()方法,当onReceive()方法被执行完成之后,BroadcastReceiver的实例就会被销毁。

如果onReceive()方法不能在10秒内执行完成,Android系统就会认为该BroadcastReceiver对象无响应,然后弹出ANR(Application No Response)对话框,所以不要在BroadcastReceiver.onReceive()方法内执行一些耗时的操作。如果需要根据广播内容完成一些耗时的操作,一般考虑通过Intent启动一个Service来完成该操作,而不应该在BroadcastReceiver中开启一个新线程完成耗时的操作,因为BroadcastReceiver本身的生命周期很短,可能出现的情况是子线程还没有结束,BroadcastReceiver就已经退出的情况,而如果BroadcastReceiver所在的进程结束了,该线程就会被标记为一个空线程,根据Android的内存管理策略,在系统内存紧张的时候,会按照优先级,结束优先级低的线程,而空线程无异是优先级最低的,这样就可能导致BroadcastReceiver启动的子线程不能执行完成。

三、种类

1.普通广播

当一个Broadcast被发出之后,所有与之匹配的BroadcastReceiver都同时接收到Broadcast。优点是传递效率比较高,但是也有缺点,就是一个BroadcastReceiver不能影响其他响应这条Broadcast的BroadcastReceiver。

2.有序广播

有序广播的接收器将会按照预先声明的优先级依次接收Broadcast,是链式结构,优先级越高(-1000~1000),越先被执行。因为是顺序执行,所有优先级高的接收器,可以把执行结果传入下一个接收器中,也可以终止Broadcast的传播(通过abortBroadcast()方法),一旦Broadcast的传播被终止,优先级低于它的接收器就不会再接收到这条Broadcast了。

虽然系统存在两种类型的Broadcast,但是一般系统发送出来的Broadcast均是有序广播,所以可以通过优先级的控制,在系统内置的程序响应前,对Broadcast提前进行响应。这就是市场上一些拦截器类(如:短信拦截器、电话拦截器)的软件的原理。

四、发送广播

sendBroadcast():发送普通广播。
sendOrderedBroadcast():发送有序广播。

//发送普通广播
Intent intent = new Intent("com.tomorrow.test.BROADCAST");
sendBroadcast(intent);

五、接收广播

1.实现BroadcastReceiver

BroadcastReceiver本质上还是一个监听器,所以使用BroadcastReceiver的方法也是非常简单,只需要继承BroadcastReceiver,在其中重写onReceive(Context context,Intent intent)即可。

2.注册BroadcastReceiver

静态注册:
使用清单文件AndroidManifest.xml注册,在节点中,使用节点注册,并用android:name属性中指定注册的BroadcastReceiver对象,一般还会通过指定,并在节点中通过android:priority属性设置BroadcastReceiver的优先级,在-1000~1000范围内,数值越大优先级越高。

动态注册:

Context#registerReceiver(BroadcastReceiver receiver, IntentFilter filter) //注册
Context#unregisterReceiver(BroadcastReceiver receiver) //解注册

虽然Android系统提供了两种方式注册BroadcastReceiver,但动态注册必须要在程序启动之后才能接收广播,如果想在程序未启动情况下就接收广播,就只能使用静态注册了。

六、相关链接

Android O 广播限制
BroadcastReceiver工作过程

你可能感兴趣的:(组件 -- BroadcastReceiver)