一句话说透Android里面的广播的原理及注册方式

250 阅读3分钟

一句话总结

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)

四、广播的常见使用场景

  1. 监听系统事件

    • 开机启动(ACTION_BOOT_COMPLETED)。
    • 网络状态变化(ACTION_CONNECTIVITY_CHANGE)。
    • 电量低(ACTION_BATTERY_LOW)。
  2. 应用内通信

    • 通知界面更新数据(如数据库写入完成)。
    • 跨组件传递消息(如 Activity 通知 Service 停止任务)。

五、注意事项

  1. 动态注册必须注销
    在 Activity 的 onPause() 或 onDestroy() 中调用 unregisterReceiver(),否则内存泄漏。

  2. 隐式广播限制
    Android 8.0 后,大部分隐式广播(不指定包名的广播)禁止静态注册,需改用动态注册或 JobScheduler。

  3. 安全性

    • 全局广播需设置权限(android:permission)。
    • 本地广播更安全,优先使用 LocalBroadcastManager

总结

  • 广播原理:发布-订阅模式,系统居中调度。

  • 注册方式

    • 静态注册:常驻监听,但受系统限制。
    • 动态注册:灵活控制生命周期,需手动管理。
  • 口诀

    • “静态注册清单写,动态代码要记得卸”
    • “全局广播需谨慎,本地安全更省心”