简介
先了解一下广播的概念,然后从广播的类型、使用注意事项等几方面对广播做了简单的介绍,最后在对广播的使用做简单的封装;
1. 广播核心概念
- 定义:Android 广播(Broadcast)是一种 跨组件/跨进程通信机制,基于观察者模式实现,允许应用或系统发送全局消息。
- 典型场景:
- 系统事件(如网络变化、电量不足、屏幕亮灭)
- 应用内组件通信(如 Activity 通知 Service 更新数据)
- 跨应用通信(需权限控制)
2. 广播类型
类型 | 特点 | 示例场景 |
---|---|---|
普通广播 | 异步发送,所有接收器无序执行 | 自定义事件通知(无需处理顺序) |
有序广播 | 同步发送,接收器按优先级顺序处理,可中断传递 | 动态调整功能链(如拦截短信广播) |
本地广播 | 仅限应用内部通信,通过 LocalBroadcastManager 实现,安全高效 |
应用内组件间通信 |
3. 广播注册方式
动态注册(推荐)
生命周期绑定:在代码中通过
registerReceiver()
注册,需在组件销毁时调用unregisterReceiver()
。灵活性高:适合监听临时事件。
1
2
3// 示例:动态注册网络状态监听
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(networkReceiver, filter);
静态注册(谨慎使用)
AndroidManifest.xml 声明:应用未运行时也能接收广播(如开机启动)。
限制:Android 8.0+ 禁止大部分隐式广播静态注册(防止滥用耗电)。
1
2
3
4
5<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
4. 发送广播
发送普通广播
1 | Intent intent = new Intent("com.example.MY_ACTION"); |
发送有序广播
1 | Intent intent = new Intent("com.example.ORDERED_ACTION"); |
本地广播(高效安全)
1 | LocalBroadcastManager.getInstance(this).sendBroadcast(intent); |
5. 注意事项
- 性能优化:避免高频发送广播,优先使用
LocalBroadcastManager
或 EventBus 等替代方案。 - 权限控制:
- 发送时指定权限:
sendBroadcast(intent, "com.example.PERMISSION")
- 接收时声明权限:
<uses-permission>
或android:permission
- 发送时指定权限:
- ANR 规避:
onReceive()
方法需在 10秒内完成,复杂操作应交给 Service 或 WorkManager。
6. 源码机制简析
- AMS 中枢:广播的注册、发送和分发由
ActivityManagerService
统一管理。 - 跨进程通信:基于 Binder 机制实现,发送方通过
Intent
封装数据,接收方通过BroadcastReceiver
处理。 - 有序广播实现:通过优先级(
android:priority
)排序,高优先级接收器可调用abortBroadcast()
终止传递。
最佳实践
- 优先使用
LocalBroadcastManager
替代全局广播(减少安全风险)。 - 对敏感广播添加权限校验,防止恶意应用拦截。
- 在 Android 8.0+ 中,使用
JobScheduler
替代静态注册的后台广播监听。
简单封装的实现
定义一个BrodcastManager,用来管理应用中广播的注册、反注册,本地广播、系统广播的发送,各个方法包含异常捕获,增加代码的健壮性。具体实现如下:
1 | /** |
说明:
Utils.getApp()
返回的是Application Context
对象;使用LocalBroadcastManager需添加
androidx.legacy:legacy-support-v4:1.0.0
以来,因为最新的 androidx依赖包中已经将LocalBroadcastManager移除了,为什么移除呢,因为已经有更好的替代方案:如 LiveData、EventBus等;