一、简介
广播是一个典型的发布-订阅模式,也叫做观察者模式。最大的特点就是:发送方并不关心接收方是否接到数据,也不关心接收方如何处理数据。
可以说达到完全解耦。
二、基本要素
广播的整个过程有3个基本要素
- 发送广播的
Broadcast
- 接收广播的
BroadcastReceiver
- 传递数据的
Intent
三、广播分类
Android
的广播分为四类:普通广播、有序广播、本地广播和Stick
广播。
3.1 普通广播
普通广播是完全异步的,通过Context
的sendBroadcast()
函数来发送,消息的传递效率比较高,但所有的receiver
的执行顺序并不能确定。
缺点:接收者不能将处理结果传递给下一个接收者,并且无法终止广播的Intent
的传播,直到没有与之匹配的广播接收者为止。
示例:
第一步:定义一个广播接收者
// 接收者
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
第二步:注册广播
注册广播分为静态注册和动态注册。
静态注册:
<receiver android:name=".broadcast.MyBroadcastReceiver" >
<intent-filter>
<action android:name="my"/>
</intent-filter>
</receiver>
动态注册:
private void registerMyBroadcast() {
registerReceiver(new MyBroadcastReceiver(), new IntentFilter("my"));
}
第三步:发送广播
private void sendNormalBroadcast() {
sendBroadcast(new Intent("my"));
}
如果是在Activity或者Fragment中动态注册,那么必须在onDestroy()里取消注册。
@Override
protected void onDestroy() {
unregisterReceiver(myReceiver);
}
3.2 有序广播
有序广播,见名知意。发送一个广播,所有的广播接收者按其优先级从高到低按顺序接收。高优先级接收器接收后通过setResult()
将结果传给下一个广播接收者。下一个广播接收者通过getResult()
接收结果。
如果想要中止广播的传递,调用abortBroadcast()
函数来中止。系统会丢弃该广播。
- 设置优先级
<receiver android:name=".broadcast.MyBroadcastReceiver" >
<intent-filter>
<action android:name="my" android:priority="100"/>
</intent-filter>
</receiver>
优先级范围在-1000 - 10000
,数值越大,优先级越高。
但实际上可以设置优先级为int
的最高值:2147483647
。
发送有序广播:
private void sendOrderBroadcast() {
sendOrderedBroadcast(new Intent("my"), null);
}
3.3 本地广播
在Android 5.0
以后,v4
包中新增本地广播——LocalBroadcastManager
。它与其它广播的区别就是它的广播范围只在本app
中。
使用:
// 注册广播
LocalBroadcastManager().getInstance().registerReceiver(receiver, intentFilter);
// 注销广播
LocalBroadcastManager().getInstance().unregisterReceiver(receiver);
// 发送异步广播
LocalBroadcastManager().getInstance().sendBroadcast(new Intent("my"));
// 发送同步广播
LocalBroadcastManager().getInstance().sendBroadcastSync(new Intent("my"));
阿里的Android
规范也推荐使用本地广播!
3.4 stick广播
它的特殊之处在于它可以保留最后一条广播而不消失,会一直保留下去。即便有N多接收者接收它也一直存在。除非调用removeStickyBroadcast()
函数。
网友评论