简介
先了解一下广播的概念,然后从广播的类型、使用注意事项等几方面对广播做了简单的介绍,最后在对广播的使用做简单的封装;
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等;