一句话总结:
Android 广播就像“校园广播站”,应用可以随时喊话(发送广播)或竖起耳朵听(接收广播)。不同的注册方式决定了你的耳朵能听多久、听什么内容。
一、广播的原理
1. 核心机制(发布-订阅模式)
- 发送者(发布) :任何应用或系统都可以通过“广播站”(
Context.sendBroadcast())发送一条广播(如“电量低啦!”)。 - 接收者(订阅) :应用通过“注册耳朵”(注册
BroadcastReceiver)来监听特定类型的广播(如“电量低”广播)。 - 中央调度:Android 系统负责将广播传递给所有符合条件的接收者。
2. 广播类型
- 全局广播:全手机都能听到(可能被其他应用监听,需注意安全)。
- 本地广播:仅限自己应用内传播(更安全,用
LocalBroadcastManager)。 - 有序广播:接收者按优先级排队处理,前面的可以“截断”广播。
- 普通广播:所有接收者同时收到,互不影响。
二、广播的注册方式
1. 静态注册(常驻耳朵)
-
注册位置:在
AndroidManifest.xml中声明。 -
特点:
- 应用未启动也能接收广播(如监听开机启动广播)。
- Android 8.0(API 26)后限制:大部分隐式广播(如
ACTION_BOOT_COMPLETED除外)无法静态注册,防止滥用。
-
代码示例:
<receiver android:name=".MyStaticReceiver" android:exported="false"> <!-- 仅接收自己应用内的广播 --> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>运行 HTML
2. 动态注册(临时耳朵)
-
注册位置:在代码中(如
Activity或Service)通过registerReceiver()注册。 -
特点:
- 灵活控制生命周期(如只在界面可见时监听)。
- 需手动注销(否则内存泄漏)。
-
代码示例:
class MyActivity : Activity() { private val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { // 处理广播(如收到“低电量”提示) } } override fun onResume() { super.onResume() // 注册广播(监听电量变化) val filter = IntentFilter(Intent.ACTION_BATTERY_LOW) registerReceiver(receiver, filter) } override fun onPause() { super.onPause() // 必须注销! unregisterReceiver(receiver) } }
三、广播的发送方式
1. 发送普通广播
val intent = Intent("com.example.MY_CUSTOM_ACTION")
intent.putExtra("data", "Hello!")
sendBroadcast(intent)
2. 发送有序广播
val intent = Intent("com.example.ORDERED_ACTION")
sendOrderedBroadcast(intent, null) // 接收者按优先级处理
3. 发送本地广播(仅限应用内)
val localBroadcastManager = LocalBroadcastManager.getInstance(this)
val intent = Intent("com.example.LOCAL_ACTION")
localBroadcastManager.sendBroadcast(intent)
四、广播的常见使用场景
-
监听系统事件:
- 开机启动(
ACTION_BOOT_COMPLETED)。 - 网络状态变化(
ACTION_CONNECTIVITY_CHANGE)。 - 电量低(
ACTION_BATTERY_LOW)。
- 开机启动(
-
应用内通信:
- 通知界面更新数据(如数据库写入完成)。
- 跨组件传递消息(如
Activity通知Service停止任务)。
五、注意事项
-
动态注册必须注销:
在Activity的onPause()或onDestroy()中调用unregisterReceiver(),否则内存泄漏。 -
隐式广播限制:
Android 8.0 后,大部分隐式广播(不指定包名的广播)禁止静态注册,需改用动态注册或 JobScheduler。 -
安全性:
- 全局广播需设置权限(
android:permission)。 - 本地广播更安全,优先使用
LocalBroadcastManager。
- 全局广播需设置权限(
总结
-
广播原理:发布-订阅模式,系统居中调度。
-
注册方式:
- 静态注册:常驻监听,但受系统限制。
- 动态注册:灵活控制生命周期,需手动管理。
-
口诀:
- “静态注册清单写,动态代码要记得卸” 。
- “全局广播需谨慎,本地安全更省心” 。