一、Broadcast(广播)
是一种广泛运用在应用程序之间传输信息的机制。
二、BroadcastReceiver(广播接收者)
是对发送出来的广播进行过滤接收并响应的一类组件,它就是用来接收来自系统和应用中的广播。
用途:
1. 当开机完成后系统会产生一条广播;一些开机启动的app就会接收到该广播,并自启。
2. 当网络状态改变时系统会产生一条广播;
3. 当手机电量改变时,系统会产生一条广播
4. 。。。。。。
三、Android为什么要这样设计?
如果没有广播,app需要自己获取对应的信息并进行处理,比较麻烦。有了广播之后,只需等待广播然后去处理。
1. 大大减少开发的工作量和开发周期。
2. 作为应用开发者,只需掌握BroadcastReceiver
四、使用发送
发送: (1)把信息装入一个Intent对象(如Action、Category)
(2)通过调用相应的方法将Intent对象以广播方式发送出去
- sendBroadcast()
- sendOrderBroadcast()
- sendStickyBroadcast()
接收:当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。
BroadcastReceiver需要注册
-静态注册
-代码注册
注意!!
(1)BroadcastReceiver生命周期只有十秒左右,很短
(2)在BroadcastReceiver里不能做一些比较耗时的操作,如果比较耗时,可以发送给Service,由Service来完成。
(3)不能使用子线程,broadcastReceiver生命周期结束后,线程也可能被杀死。
五、广播的种类
1.普通广播(Normal broadcasts)
所有监听该广播的广播接收者都可以监听到该广播
(1)同级别接收先后是随机的(无序),是同时收到的
(2)级别低的后收到广播
(3)接收器不能截断广播的继续传播也不能处理广播
(4)同级别动态注册高于静态注册
//发送普通广播
Intent intent = new Intent();
intent.putExtra("msg","这是一条普通广播");
intent.setAction("cc.xxx.yy.ccc");//为了让接收器知道接收的是哪条广播,设置Action 或 Category,必须是唯一的,可以写成包名.类名
sendBroadcast(intent);
新建类继承抽象类BroadcastReceiver重写onReceive(Context context,Intent intent)方法
public void onReceive(Context context,Intent intent){
String str= intent.getStringExtra("msg");
}//在Manifest.xml的application标签内添加
//动态注册接收器,生命周期依赖于程序的生命周期
//在activity中的onCreate()方法中
public void onCreate(savedInstanceState){
IntentFilter intentFilter = new IntentFilter("action的名字如cc.xxx.yy.ccc");
BC bc = new BC(); //BC为BroadcastReciver的派生类
registerReceiver(bc,intentFilter);
}
2.有序广播(Ordered broadcasts)
按照接收者的优先级顺序接收广播,优先级别再intent-filter中的priority中声明,-1000到1000之间,值越大,优先级越高。可以终止广播意图的继续传播。接收者可以篡改内容。
(1)同级别接收顺序是随机的。
(2)能截断广播的继续传播,高级别的广播接收器收到该广播后,可以决定把该广播是否截断。l拦截广播:onReceive()中调用abortBroadcast()
(3)接收器能截断广播的继续传播,也能处理广播——处理:setResultExtras(bundle)、得到处理后的值Bundle Bundle= getResultExtras(true)
(4)同级别动态注册高于静态注册。
Intent intent = new Intent();
intent.putExtra("msg","这是一条有序广播");
intent.setAction("cc.xxx.yy.ccc");//为了让接收器知道接收的是哪条广播,设置Action 或 Category,必须是唯一的,可以写成包名.类名
sendOrderedBroadcast(intent,权限这里写为null);
3.异步广播(粘滞性滞留广播):需加权限BROADCAST_STICKY
不能将处理结果传给下一个接收者,无法终止广播。——与1、2不同,它可以先发广播、再注册接收器,同样能收到广播
sentStickyBroadcast(intent);
IntentFilter intentFilter = new IntentFilter("action的名字如cc.xxx.yy.ccc");
BC bc = new BC(); //BC为BroadcastReciver的派生类
registerReceiver(bc,intentFilter);
注意:如果是动态注册的Receiver,需要在最后销毁动态注册的接收器 unregisterReceiver(派生类BC);