Broadcast和BroadCastReceiver

来源:互联网 发布:手机照片搞怪软件 编辑:程序博客网 时间:2024/06/07 11:57

Broadcast和BroadcastReceiver
1. 概念:
1)Broadcast一种广泛运用的在应用程序之间传输信息的机制
2)BroadcastReceiver,对发送出来的广播进行过滤接收并响应的一类组件,它可以用来接收来自系统和应用中的广播
3)用途
开机完成后系统会产生一条广播
网络状态改变时系统会产生一条广播
电量改变时系统产生一条广播
2. 为什么要设计广播
大大减少开发工作量和周期(程序员不需要关注底层如何实现,只需要掌握BroadcastReceiver就行了)
3. 使用方法:
1)发送:
将信息装入一个Intent对象,通过调用相应的方法将Intent对象以广播方式发送出去
sendBroadcast()\sendOrderBroadcast()\sendStickyBroadcast()
2)接收:
当Intent发送之后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,匹配成功的话就会调用BroadcastReceiver的onReceive()方法。
所以定义一个BroadcastReceiver的时候都需要实现onReceive()方法
4. 生命周期
生命周期只有5s左右,每次广播来的时候都会创建BroadcastReceiver对象,并调用onReceive()方法。
所以不能在onReceive()做一些耗时操作,可以通过发送Intent给service,由service完成耗时操作。
注意子线程也不行
5. 广播的种类(如图)
注意有序广播是可以终止的,且接收者可以篡改内容
BroadcastReceiver
5. 在java中动态注册一个BroadcastReceiver
在代码中动态注册BroadcastReceiver的方法:

IntentFilter inf = new IntentFilter(action_string);//设置过滤器BC bc = new BC(); // BC是继承了BroadcastReceiver这个类registerReceiver(bc, inf); // 完成注册,registerReceiver()是Context对象的方法

注意:
1)动态注册的BroadcastReceiver优先级要比静态注册的高
2)动态注册有个弊端:如果当前java的程序结束了,动态注册的接收者将不再能收到广播。所以类似于短信拦截的BroadcastReceiver不能用动态注册。
3)BroadcastReceiver的注册,我们大部分选择静态注册,即直接写在AndroidManifest.xml中。
4) 为broadcast receiver添加优先级,数字越大,优先级越高。静态添加的方法:在为intent-filter标签添加一个priority属性就可以了。
5) 如果是我们接受系统的broadcast,那么我们只需要在AndroidManifest.xml注册对应的receiver就可以了,或者我们动态注册也可以。

创建一个BroadcastReceiver,然后使用静态的方法进行注册。
1. 使用一个类继承BroadcastReceiver类,并且重写onReceive方法:注意这个方法里面不要做耗时操作;
2. 在AndroidManifest.xml中对BroadcastReceiver进行静态注册

<receiver android:name="继承了BroadcastReceiver的类的完整名称"><intent-filter><action android:name="这里要和Intent使用setAction()设置的字符串一样才行"></intent-filter></receiver>

Intent中的setAction是设置Intent被匹配的条件,只要这里设置的的action字符串匹配上BroadcastReceiver中相应的action的字符串就表示这个BroadcastReceiver接收到了这个broadcast。所以我们在将Intent通过广播broadcast出去的时候都要通过Intent的setAction来设置它的action字符串,否则这个被broadcast出去的Intent不会被任何的BroadcastReceiver接收到,那么这个broadcast就没有用了。

BroadcastReceiver——有序广播
1. 发送一个有序广播

Intent intent2 = new Intent();intent2.putExtra("msg", "this is a ordered broadcast");intent2.setAction("Broadcast_one"); //设置一个filtersendOrderedBroadcast(intent2, null); //发送一个有序广播
  1. 有序广播可以被截断,也可以在中间被处理
    利用Bundle类就可以处理广播
Bundle bundle = new Bundle();bundle.putString("xzhang76", "Broadcast has been processed in Receiver1"); //xzhang76是对应的key,后面是valuesetResultExtras(bundle);

下一个接收者接收前面已经处理的广播:

Bundle bundle = getResultExtras(true);String msg = bundle.getString("xzhang76"); //从对应的key中得到数据

BroadcastReceiver——异步广播

  1. 就是说接收广播是异步的,可以先发送广播,再注册接收者。
sendStickyBroadcast(intent3);动态注册一个接收者IntentFilter intentFilter = new IntentFilter("Broadcast_Three"); //设置过滤MyBroadcastReceiver3 receiver3 = new MyBroadcastReceiver3();registerReceiver(receiver3, intentFilter);

这就意味着广播是粘性的。
注意:异步广播也是不能截断的。
4. 注意一点
动态注册的接收者需要在程序结束时销毁掉
unregisterReceiver(receiver3);

多个按钮点击事件:可在各自的xml里配置OnClick属性,然后
在MainActivity()建立对应的方法。在方法里面用,switch(view v),来实现多个按钮的点击事件.

0 0
原创粉丝点击