本文内容的搜集、整理,主要参考了Android四大组件:BroadcastReceiver史上最全面解析,在此致谢!
1. 定义与原理
- 定义:全局监听器,用于监听/接收应用发出的广播消息并做出反应。
- 原理:采用了 观察者模型:基于消息的发布/订阅事件模型。
2. BroadcastReceiver 的注册
自定义 Receiver 类,并实现 BroadcastReceiver 基类
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
广播接收器接收到相应的广播后,就会自动调用 onReceive() 方法
在 onReceive() 方法中,会设计到组件之间的交互等逻辑
不要在 onReceive() 方法中进行耗时操作
1. 静态注册
注册方式:在 AndroidManifest.xml 中通过 <receiver> 标签注册
示例如下:
<receiver
android:name=".MyReceiver">
// 接收电池电量改变时的广播
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED"/>
</intent-filter>
</receiver>
2. 动态注册
注册方式:在代码中调用 context.regsterReceiver() 方法
private MyReceiver receiver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 第 1 步,实例化 BroadcastReceiver
receiver = new MyReceiver();
}
@Override
protected void onResume() {
super.onResume();
// 第 2 步,创建过滤器并添加过滤条件
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
// 第 3 步,动态注册
registerReceiver(receiver, filter);
}
@Override
protected void onPause() {
super.onPause();
// 第 4 步,注销
unregisterReceiver(receiver);
}
注意:
- 动态广播必须注销,否则会造成内存泄漏
- 不允许重复注册,也不允许重复注销
3. 广播的发送
广播通过 Intent 标识,广播的发送就是通过 sendBroacast() 方法将 Intent 发送出去。
广播分为五种类型,分别为:
- Normal Broadcast
- System Broadcast
- Ordered Broadcast
- Sticky Broadcast
- Local Broadcast
1. Normal Broadcast
最常用的广播,其基本使用方式如下:
Intent intent = new Intent();
// 对应 BroadcastReceiver 中 intentFilter 的 action
intent.setAction(BROADCAST_ACTION);
// 发送广播
sendBroadcast(intent);
- 若广播接收者中注册时的 <intent-filter></inten-filter> 中的 action 与上述 action 一致,则接收当前广播。
2. System Broadcast
当使用系统广播时,只需要在注册 receiver 时,在 <intent-filter></intent-filter> 中选取合适的 action 即可,不需要手动发送广播。
3. Ordered Broadcast
发送出去的广播,按照先后顺序被相应的 receiver 接收。
- receiver 接收广播的次序:
- 按照 priority 值,由大到小排序;
- priority 属性相同者,动态注册的广播优先。
- 特点
- 接收有序
- 可以拦截广播
- 可以修改广播
- 使用方式
sendOrderedBroadcast(intent);
4. Sticky Broadcast
已废弃
5. Local Broadcast
可以理解为一种局部广播,广播内容的收/发都是在同一个 App 内完成
相比于全局广播,具有安全性高 & 效率高的优势
- 使用方式 1 :将全局广播设置为局部广播
- 将注册 receiver 时的属性 exported 的值改为 false
- 在接收与发送广播时,增设相应的权限,用于权限验证
- 发送广播时,指定广播接收器所在的包:intent.setPackage(packageName)
- 使用方式 2:使用 LocalBroadcastManager 类
注:对于这种方式,只能通过 LocalBroadcastManager 动态注册
// 获取单例
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
// 注册
manager.registerReceiver(receiver, filter);
// 解除注册
manager.unregisterReceiver(receiver);
// 发送应用内广播
Intent intent = new Intent();
intent.setAction(Intent.ACTION_BATTERY_CHANGED);// 可自定义 action
manager.sendBroadcast(intent);