一、概述
1、Broadcast是一种在应用程序之间广泛运用的传输信息的机制。
2、BroadcastReceiver是对发送出来的广播进行过滤接收并响应的一类组件,它就是用来接收来自系统和应用中的广播。
二、用途和注意事项
1、用途:当开机完成后、网络状态改变、电池电量改变时系统会发送一条广播
2、注意:
(1)BroadcastReceiver需要注册(静态注册、代码注册上面已经介绍)
(2)BroadcastReceiver生命周期只有十秒左右
(3)在BroadcastReceiver里不能做一些比较耗时的操作
(4)应该通过发送Intent给Service,由Service来完成
(5)不能使用子线程
(6)在android-support-v4.jar包中提供一个LocalBroadcastManager类,顾名思义是用于应用内进行通信的。不会接收应用外的广播,提高应用内通信的安全性。
三、广播的种类
1、普通广播(Normal broadcasts,也叫无序广播)
(1)说明:所有监听该广播的广播接收者都可以监听到该广播。
(2)特点:
同级接接收先后是随机的
级别低的后收到广播
接收器不能截断广播的继续传播也不能处理广播
同级别动态注册高于静态注册
2、有序广播(Ordered broadcasts)
(1)说明:按照接收者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,在-1000到1000之间,值越大,优先级越高。可以终止广播意图的继续传播。接收者可以篡改内容。
(2)特点:
同级别接收顺序是随机的
能截断广播的继续传播,高级别的广播接收器收到该广播后可以决定是否把该广播截断。
接收器能截断广播的继续传播,也能处理广播。
同级别动态注册高于静态注册。
3、异步广播(粘滞性滞留广播)
发出的广播会一直滞留(等待),以便有人注册这则广播消息后能尽快的收到这条广播。其他功能与sendBroadcast相同。但是使用sendStickyBroadcast 发送广播需要获得BROADCAST_STICKY permission,如果没有这个permission则会抛出异常。
sendStickyBroadcast只保留最后一条广播,并且一直保留下去,这样即使已经处理了这条广播但当再一次注册这条广播后依然可以收到它。如果你只想处理一遍,removeStickyBroadcast方法可以帮你,处理完了后就将它删除吧。
四、广播注册和发送接收广播
1、两种广播的注册方式
(1)静态注册,在AndroidMainfest.xml中注册
<receiver android:name=”广播类的全路径” >
<intent-filter
android:priority=”优先级(-1000到1000)” >
<action android:name=”自己定义的字符串” />
</intent-filter>
</receiver>
注意:在AndroidManifest文件中进行配置的广播会随系统的启动而一直处于活跃状态,只要接收到感兴趣的广播就会触发,即使程序未运行。是常驻型广播,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
(2)动态注册,在代码中注册
//动态注册广播
BroadcastReceiver broadcast = new BroadcastReceiver();
Activity.registerReceiver(broadcastReceiver, new IntentFilter());
//动态取消广播
unregisterReceiver(broadcastReceiver);
注意:动态注册的需要在Activity的onDestory方法中进行取消注册,否则会抛出异常。不是常驻型广播,也就是说广播跟随程序的生命周期。
2、广播的发送方式
(1)把信息装入一个Intent对象(比如Action、Category)
(2)通过调用相应的方法将intent对象以广播方式发送出去
sendBroadcast() //发送无序广播
sendOrderBroadcast() //发送有序广播
sendStickyBroadcast() //发送(异步)粘滞性滞留广播
例如:
(1)无序广播
Intent intent = new Intent(action);
sendBroadcast(intent);
优点:异步发送效率高
缺点:无法将结果传递给下一个处理者并且终止广播
(2)有序广播
Intent intent = new Intent(action);
sendOrderBroadcast(intent , null);
优点:
<1>可以终止广播(BroadcastReceiver.abortBroadcast()),一旦终止后续不会再接收到广播。
<2>传递数据
优先级高的可以通过setResultExtras(Bundle)放置数据。
优先级低的可以通过Bundle bundle = getResultExtras(true)获取数据。
3、广播的接收方式
当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent匹配,若匹配则会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。
参考资料:
总结1:http://blog.csdn.net/androiddevelop/article/details/15018237
总结2:http://www.cnblogs.com/lwbqqyumidi/p/4168017.html
安卓广播类型大全:http://blog.csdn.net/hgl868/article/details/7444400