一、Broadcast简介
Broadcast是Android的四大组件之一。可分为:
1、普通广播 发送一个广播,所有监听该广播的广播接收者都可以监听到改广播。
2、异步广播 当处理完之后的Intent,依然存在,这时候registerReceiver(BroadcastReceiver,IntentFilter) 还能收到他的值,直到你把它去掉,不能将处理结果传给下一个接收者,无法终止广播。
3、有序广播 按照接收者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间,值越大,优先级越高.可以终止广播意图的继续传播.接收者可以篡改内容.
二、广播Broadcast实现过程
1、注册
a、配置文件注册
1 <!-- 注册自定义静态广播接收器 --> 2 <receiver android:name="com.example.androidtest.broadcast.MyReceiver"> 3 <intent-filter > 4 <action android:name="MyAction"/> 5 </intent-filter> 6</receiver>
b、代码注册
1 MyReceiver myReceiver = new MyReceiver(); 2 IntentFilter filter = new IntentFilter(); 3 filter.addAction("MyAction"); 4 registerReceiver(myReceiver,filter);
2、发送广播
1 Intent intent = new Intent(); 2 intent.setAction("MyAction"); 3 intent.putExtra("msg", "这是广播发送的消息"); 4 sendBroadcast(intent);
3、接收类的实现
继承BroadcastReceiver并重写onReceive方法。
1 public class MyReceiver extends BroadcastReceiver 2 { 3 public void onReceive(Context context, Intent intent) 4 { 5 Toast.makeText(context, "广播消息是:" + intent.getStringExtra("msg"), Toast.LENGTH_SHORT).show(); 6 } 7 8 }
三、若内部类作为广播接收类如何实现
1、注册
a、配置文件注册
1 <!-- 注册自定义静态广播接收器 --> 2 <receiver android:name="com.example.androidtest.broadcast.BroadcastTest$MyReceiver"> <!-- 注意内部类写法:普通类$内部类 --> 3 <intent-filter > 4 <action android:name="MyAction"/> 5 </intent-filter> 6</receiver>
b、代码注册
1 MyReceiver myReceiver = new MyReceiver();
2 IntentFilter filter = new IntentFilter();
3 filter.addAction("MyAction");
4 registerReceiver(myReceiver,filter);
2、发送广播
1 Intent intent = new Intent();
2 intent.setAction("MyAction");
3 intent.putExtra("msg", "这是广播发送的消息");
4 sendBroadcast(intent);
3、接收类的实现
注意:若在配置文件中注册则该类必须声明为static,否则找不到,若在代码中注册可省略static修饰
1 public static class MyReceiver extends BroadcastReceiver
2 {
3 public void onReceive(Context context, Intent intent)
4 {
5 Toast.makeText(context, "广播消息是:" + intent.getStringExtra("msg"), Toast.LENGTH_SHORT).show();
6 }
7
8 }
四、用途
开机、锁屏、电量低……
五、注意
生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报错 。
每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(Application NoResponse) 的对话框