BroadcastReceiver配置
//配置receiver的action匹配项,对应的activity类名(在activity中配置)
<activity>
<receiver andorid:name=".ReceiverClassName">
<intent-filter>
<action...../>
</intent-filter>
</receiver>
</activity>
BroadcastReceiver的执行
- 在广播消息到达时,系统会创建一个新的BroadcastRceiver实例并执行onReceive()方法处理广播响应,当处理完成后实例就会被销毁
- 在onReceive()中如果处理时间超过5秒会产生ANR(Application not response)的错误
- 在onReceive()中不能处理耗时的操作,如果需要进行耗时操作时,必须使用service,不可以使用子线程。这是由于使用子线程的话,onRecive()的处理时间很短,当创建子线程处理时,主线程已经处理被销毁,该子线程所在的进程即成为了空进程;当系统需要回收内存空间时,优先回收空进程,因此子线程可能无法完成就会被回收,这是不可靠的
发送广播
- sendBroadcast(),发送Normal Broadcast,完全异步,可以在同一时刻被所有接收者接收到传递效率高
- sendOrderedBroadcast(),发送Orderred Broadcast,按优先及依次接收广播并处理,可以将处理的结果传递给下一个接收者处理,效率比较低
//使用OrderedBroadcast优先接收的接收者可以终止广播的传递,使后面的接收者不再接收到该广播(拦截)
//优先接收的接收者可以通过setResultExtras(Bundle)将处理结果存入broadcast传递给下一个接收者
//重写接收者onReceive()方法
public void onReceive(Context context, Intent intent){
//传递新数据
Bundle data=new Bundle();
data.putString("key","vaule");
setResultExtras(data);
//取消broadcast传播
//abortBroadcast();
}
- 配置优先级
//在activity中注册的receiver中配置
<activity>
<!--注册receiver,指定该组件的类名-->
<receiver android:name=".ReceiverClassName">
<!--设置receiver的优先级,-1000到1000之间的值,值越大,优先级越高-->
<intent-filter android:priority="1000">
<!--设置receiver对应的action,用于匹配并启动receiver-->
<action.../>
</intent-filter>
</reciver>
</activity>
- 部分系统广播在发送时已经指定了必须接收的broadcastReceiver,此时终止广播并不能阻止该receiver接收到广播(如拨号程序)