BroadcastReceiver本质是一种全局监听器,它可以监听全局的广播消息。
与Activity和Service不同的是,BroadcastReceiver在接收到匹配的Intent前并不会被激活。激活一个BroadcastReceiver需要以下步骤:
- 创建一个匹配的Intent
- 调用Context的sendBroadcast() 或 sendOrderedBroadcast()
当Context发出通知后,所有匹配该Intent的BroadcastReceiver都可能被启动。
要实现一个BroadcastReceiver,只需重写它的onReceive方法,同时注册到程序中。
有两种方式注册BroadcastReceiver:
- 在AndroidManifest.xml中注册:
<receiver android:name="...">
<intent-filter>
<action android:name="...." />
</intent-filter>
</receiver>
- 在程序中注册
IntentFilter filter = new IntentFilter("...");
Receiver receiver = new Receiver();
registerReceiver(receiver, filter);
当对应的广播发出后,系统就会创建对应的BroadcastReceiver实例,并调用它的onReceive方法,该方法执行完后,实例就会被销毁。如果onReceive不能在10秒内执行完成,会触发ANR。若要执行耗时操作,可以启动一个Service,不应启动新线程,很可能线程没执行完,BroadcastReceiver就已经退出了。
广播
广播有两种:
-
Normal Broadcast 普通广播:可以被所有对应的接收者接收到,缺点是不能链式传递且无法终止传播。
-
Ordered Broadcast 有序广播:按预设的优先级(-1000 ~ 1000)依次被接收。上一接收者可以调用setResultExtras(Bundle)将数据存入Broadcast,下一接受者可以调用getResultExtras()将数据取出。有序广播可以被接收者终止,优先级低的接收者将不会接收到该广播。
同样优先级有两种设置方式:
- AndroidManifest.xml:
<receiver android:name="...">
<intent-filter android:priority="0">
- 代码中:
intentFilter.setPriority(1000);
网友评论