特点:是一个典型的发布-订阅模式,发送方不关心接收方是否接到数据,也不关系接收方如何处理数据
注意:
- 安卓7以上系统,在清单中声明接收器通常不起作用
- 当BroadcastReceiver在onReceive()运行时会被视为前台进程。结束onReceive()时BroadcastReceiver将不再是活跃状态,会被设为低优先级进程非常容易被杀掉。通常不要对广播接收器进行耗时操作,如果非要进行耗时操作,那么可以开启子线程。
分类:普通广播、有序广播、本地广播、sticky广播
普通广播
优点:
- 消息传递效率高
缺点:
- 执行顺序不确定
- 接受者无法将处理的结果传递给下一个接受者
- 无法中断传播,直到没有与之匹配的广播接收器为止
广播接受者定义:
public class HelloBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = HelloBroadcastReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
Log.e(TAG,"hello");
}
}
当接受到广播时,会调用onReceive()方法。
广播接受者声明方式:
1、清单声明
<receiver
android:name=".components.broadcast.HelloBroadcastReceiver"
android:exported="false">
<!--intent过滤器指定接收者订阅的广播操作。-->
<intent-filter>
<action android:name="hello"/>
</intent-filter>
</receiver>
exported为false表示接收方不接受来自应用外的广播
2、上下文注册
registerReceiver(new HelloBroadcastReceiver(),new IntentFilter("hello"));
取消注册
unregisterReceiver(android.content.BroadcastReceiver)
发送广播:
sendBroadcast(new Intent("hello"));
有序广播
优点:
- 所有广播接收器按优先级顺序执行,通过intent-filer的android:priority属性
- 当前广播接收器可使用setResult()函数将结果传递给下一个广播接收器,通过getResult()函数获取上一个广播接收器返回的结果
- 可以调用abortBroadcast()函数丢弃该广播,使其不再传送给其他广播接收器
显然有序广播优化了普通广播的缺点
设置广播优先级
mHelloBroadcastReceiver = new HelloBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter("hello");
intentFilter.setPriority(50);
registerReceiver(mHelloBroadcastReceiver,intentFilter);
发送广播
sendOrderedBroadcast(new Intent("hello"),null);
讲解:
@Override
public void sendOrderedBroadcast(Intent intent,
String receiverPermission) {
mBase.sendOrderedBroadcast(intent, receiverPermission);
}
receiverPermission这个参数是接受权限,接受应用必须请求对应权限
本地广播
上述的广播都是全局的,如果不需要向应用程序外部的组件发起广播,可以使用本地广播,提高效率。
LocalBroadcastManager可以实现限于应用内的广播
//注册广播
LocalBroadcastManager.getInstance(this).registerReceiver(@NonNull BroadcastReceiver receiver,
@NonNull IntentFilter filter)
//注销广播
LocalBroadcastManager.getInstance(this).unregisterReceiver(@NonNull BroadcastReceiver receiver)
//发送异步广播
LocalBroadcastManager.getInstance(this).sendBroadcast(@NonNull Intent intent)
//发送本地广播
LocalBroadcastManager.getInstance(this).sendBroadcastSync(@NonNull Intent intent)
sticky广播
通过Context.sendStickyBroadcast(Intent intent)发送。发送粘性广播还需要BROADCAST_STICKY权限:
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
特点:
- 此广播会滞留,即使已经有广播接收器处理了该广播,此广播认可继续被接受。直到调用removeStickyBroadcast()函数
参考:https://developer.android.com/guide/components/broadcasts
网友评论