Android引入广播机制的用意
- 从MVC的角度考虑
- 程序间互通消息(例如在自己的程序内中监听系统电话)
- 效率上(参考UDP的广播协议在局域网的方便性)
- 设计模式上(反转控件的一种应用,类你监听者模式)
广播发送的两种类型
普通广播:完全异步的,所有的广播接收者在同一时刻以未定义的顺序运行,消息传递的效率比较高。但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播
顺序广播:所有广播接收者按顺序执行,其中一个执行广播接收者可以将结果传递给下一个广播接收者,也可以退出广播以便于不将结果传递到下一个广播接收者,可以在清单文件使用android:priority属性来确定广播接收者的优先级,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播,同一优先级的接收者可以随机顺序执行。
Context.sendBroadcast():发送的是普通广播,所有订阅者都有机会获得并进行处理。
Context.sendOrderedBroadcast():发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(通过BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果存放进广播Intent,然后传给下一个接收者。
广播发送
使用ContextWrapper类中的public void sendBroadcast(Intent intent)发送广播,例如:
Intent intent=new Intent();
intent.setAction("com.example.boradcastreceive.MainActivity");
intent.putExtra("message", "你好");
sendBroadcast(intent);
广播注册的两种方式
动态注册:非长驻性广播,生命周期可控制
Activity的子类中使用registerReceiver()方法注册,如下:
MyBoradcastReceive receiver=new MyBoradcastReceive();
IntentFilter filter=new IntentFilter("com.example.boradcastreceive.MainActivity");
registerReceiver(receiver, filter);
静态注册:长驻性广播,一旦应用程序被安装就能接收到广播,生命周期不可控制
在清单文件中标记中进行注册,例如:
<receiver android:name="com.example.orderboradcastrecevie1.MyBordcast">
<intent-filter android:priority="1000">
<action android:name="com.example.orderboradcastrecevie1.MainActivity"/>
</intent-filter>
</receiver>
广播接收器(BroadcastReceiver)
通过继承BroadcastReceiver抽象类实现广播接收器,在广播接收器中可以通过 abortBroadcast()终止广播,用setResultExtras()来发送数据。