今天写下自己对广播的理解:
首先要知道什么是广播,引用书上的例子,高中的时候,每个班上都会有个喇叭,一旦有什么通知,就会播放广播来告诉我们,这个时候坐在教室的我们就收到了这条广播,然后去做对应的事情。这个和Android中的广播机制是很相似的。
安卓中的广播和上面的例子是类似的,而且Android还提供了一套完整的API允许应用程序自由的发送和接收广播。
Broadcast:广播是一种广泛运用于应用程序之间传输信息的机制;
BroadcastReceiver:广播接收器是对发送出来的广播进行过滤接收并响应的一类组件,用来接收系统或者应用程序中的广播
场景:
- 开机完成后会发出一条广播
- 网络状态改变会发出一条广播
- 电池电量改变时发出一条广播等。。。
广播的类型:
标准广播:也叫普通广播,特点如下
1、同级别接收先后是随机的(无序的)
2、级别低的后接收到广播
3、接收器不能截断广播的继续传播,也不能处理广播
4、同级别动态注册(代码中注册)高于静态注册(AndroidManifest中注册)有序广播
1、同级别接收是随机的
2、能截断广播的继续传播,高级别的接收到广播之后,可以截断传播,是通过intent-filter中的priority声明的,范围是-1000到1000
3、能接收广播。也可以处理广播
4、同级别动态注册(代码中注册)高于静态注册(AndroidManifest中注册)- 异步广播:不能将处理结果传给下一个广播,无法终止广播
先说如何发送广播:
- 把信息装进一个Intent对象(如action(一个)、category(多个))
- 使用相应的方法发送广播
1、发送标准广播:sendBroadcast(intent);
2、发送有序广播:sendOrderBroadcast(intent);
3、发送异步广播:sendStickyBroadcast(intent);
举例:发送标准广播
Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE");
sendBroadcast(intent);//发出一条广播
再说下如何接收广播:
- 动态注册
就是在代码中注册,比如注册一个广播需要以下代码
//定义一个可筛选的Intent
IntentFilter intentFilter = new IntentFilter();
//给可筛选的Intent即intentFilter设置action,用于判断接收哪个广播
intentFilter.addAction("com.example.broadcastdemo.SEND_TEST");
//sendStatusReceiver是一个广播接收器
SendStatusReceiver sendStatusReceiver = new SendStatusReceiver();
//注册广播接收器
registerReceiver(sendStatusReceiver, intentFilter);
- 静态注册
在AndroidManifest.xml中注册,如下:
和上面的动态注册时差不多的;
<receiver android:name=".SendStatusReceiver">
<intent-filter >
<action android:name="com.example.broadcastdemo.SEND_TEST"/>
</intent-filter>
</receiver>
上面说的都是一些全局广播,发出的广播可以被其他的程序接收到,我们也可以接收到其他程序的广播,这样容易导致安全问题,比如关键性数据在广播过程中被截获,或者其它程序不断向我们的接收器发送垃圾广播,为此Android中引入了一套本地广播机制;使广播只能在内部传递,解决了此问题;
主要是通过一个LocalBroadcastManager管理广播,提供了发送和注册广播接收器的方法,和前面的发送广播不同的是,本地广播要先通过
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
获得LocalBroadcastManager的实例,然后和前面的稍微不同,在sendBroadcast(intent);前面加上localBroadcastManager 即可。如下:
发送本地广播:
Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE");
localBroadcastManager.sendBroadcast(intent);//发出一条本地广播
注册本地广播接收器:
//定义一个可筛选的Intent
IntentFilter intentFilter = new IntentFilter();
//给可筛选的Intent即intentFilter设置action,用于判断接收哪个广播
intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE");
//sendStatusReceiver是一个广播接收器
SendStatusReceiver sendStatusReceiver = new SendStatusReceiver();
//注册本地广播接收器
localBroadcastManager.registerReceiver(sendStatusReceiver, intentFilter);
注意事项:
BroadcastReceiver的生命周期只有10秒左右,不能再里面做一些耗时的操作,如果要做耗时的操作,应该通过发送Intent给Service,由Service来完成耗时操作,并且不能在BroadcastReceiver中使用子线程
最后给出本章我的实践小例子,地址是我的博客园地址:http://www.cnblogs.com/csschn/p/5258535.html