组件篇—BroadcastReceiver 1. Boastcast(广播)是一种广泛运用的在应用程序之间传输信息的机制。 2. BroadcastReceiver(广播接受者)是对发送出来的广播进行过滤并响应的一类组件,它就是用来接收来自系统和应用中的广播。 3. 用途: * 当开机完成后系统会产生一条广播;有些程序会接收此广播而启动程序,这就是“自启动”。 * 当网络状态改变时系统会产生一条广播;一般用于提示用户。 * 当电池电量改变时,系统会产生一条广播; * 其他。 ---------------- 为什么需要广播? 假如没有广播,那么,很多事情都要自己做,需要自己想办法去获取数据。 有了广播,我们只需等待广播告诉我们信息。 广播的优点: 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 里面不能做一些耗时操作(就是因为生命周期短)
3. 耗时操作应该通过发送 Intent 给 Service,由Service来完成
4. 不能使用子线程。使用子线程不可靠!因为BroadcastReceiver生命周期太短,可能接收都结束了,子线程还没结束。接收器一旦结束了,Receiver所在的进程很容易在需要的时候被杀死,因为此时它是空进程(没有任何活动组件的进程就是空进程),一旦宿主进程被杀掉了,那么正在工作的子进程也会被杀死。
广播的种类:
1. 普通广播(Normal broadcasts)
所有监听该广播的广播接收者都可以监听到该广播。
2. 有序广播(Ordered broadcasts)
按照接收者的优先级顺序接收广播,优先级别在 intent-filter中的priority中声明,-1000到1000之间,值越大,优先级越高。可以终止广播意图的继续传播。接收者可以篡改内容。
3. 异步广播(粘滞性滞留广播)
不能将处理结果传给下一个接收者,无法终止广播。
-------------------------
普通广播的示例:
-------------------------------
1 普通广播的示例:
2 1. 先在主界面设置一个Button,设置点击事件doClick。
3 2. 在 MainActivity 中实现方法doClick():
4 public void doClick(View view){
5 switch (view.getId()){
6 case R.id.btn_send1: // 发送普通广播
7 Intent intent = new Intent(); // 发送信息就要创建一个Intent
8 intent.putExtra("msg","这是一条普通广播");
9 // 设置一个标识,用于过滤(会在注册的时候用到)
10 intent.setAction("BC_ONE");// 其实这里最好使用完整类名,但因为只是举个例子,所以写成“BC_ONE”
11 // 将intent发送出去
12 sendBroadcast(intent);
13 break;
14 }
15 }
16 然后新建一个类 BC1 ,继承 BroadcastReceiver 并实现方法 onReceive():
17 public void onReceive(Context context, Intent intent) {
18 String s = intent.getStringExtra("msg");
19 System.out.printf("receive1收到消息:"+s);
20 }
21 最后,在配置文件 AndroidManifest中注册接收者:
22 <receiver android:name=".BC1">
23 <intent-filter android:priority="100">
24 <action android:name="BC_ONE"></action>
25 </intent-filter>
26 </receiver>
27 其中 android:priority="100" 是把优先级设置为100,一般的范围是-1000到1000。
28 -----------------
29 截断广播: abortBroadcast();
30 普通广播之下,若在优先级较高的BC2的类里面添加:
31 abortBroadcast();
32 是不能截断广播的,BC1仍然会收到广播,并且系统会报错。
动态注册
在 MainActivity 的onCreate()方法里面直接注册:
IntentFilter intentFilter = new IntentFilter("BC_ONE"); // 动态注册所需的过滤器
BC3 bc3 = new BC3(); // 动态注册的对象
registerReceiver(bc3,intentFilter); // 接收器的动态注册
1 public class MainActivity extends Activity {
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.fragment_main);
7 // 动态注册
8
9 /*
10 IntentFilter filter = new IntentFilter("bc1");
11 BC1 bc1 = new BC1();
12 registerReceiver(bc1, filter);
13 */
14
15 }
16
17 public void doClick(View view) {
18 switch (view.getId()) {
19 case R.id.button1:// 发生普通广播
20 Intent intent = new Intent();
21 intent.putExtra("msg", "这是普通广播");
22 intent.setAction("bc1");
23 sendBroadcast(intent);
24 break;
25 case R.id.button2:// 发生有序广播
26 Intent intent2 = new Intent();
27 intent2.putExtra("msg", "这是有序广播");
28 intent2.setAction("bc1");
29 sendOrderedBroadcast(intent2, null);
30 break;
31
32 case R.id.button3:// 发生普通广播
33 Intent intent3 = new Intent();
34 intent3.putExtra("msg", "这是有序广播");
35 intent3.setAction("bc3");
36 sendStickyBroadcast(intent3);
37 IntentFilter filter = new IntentFilter("bc3");
38 BC3 bc3 = new BC3();
39 registerReceiver(bc3, filter);
40 break;
41 }
42 }
43 }
“粘滞性”是需要在配置文件中添加权限的:异步:
<uses-permission android:name="android.permission.BROADCAST_STICKY"></uses>
总结:
// 普通广播不能被截断,
// 同级别接收先后是随机的
// 可以由清单文件中android:priority="100" 优先级指定
// 同级别动态注册优先级高于静态注册
// 数据不能处理
// 有序广播能中断
// 有序广播数据能处理----