Android动态广播注册收发原理

一、动态广播的注册流程

1. ​​注册方式​

动态广播通过代码调用 Context.registerReceiver() 方法实现,需显式指定 IntentFilter 和接收器实例:

复制代码
// 示例:在 Activity 中注册监听网络变化的广播
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(networkChangeReceiver, filter);
  • ​生命周期绑定​ :动态注册的接收器仅在注册期间有效(如 Activity 处于 onResume() 状态时),需在 onPause()onDestroy() 中调用 unregisterReceiver() 释放资源。
  • ​优先级控制​ :通过 IntentFilter.setPriority(int) 设置接收器优先级,影响有序广播的分发顺序。
2. ​​系统级处理​
  • ​AMS 注册​ :调用 registerReceiver() 时,系统会通过 Binder 调用 AMS 的 registerReceiver() 方法,将接收器加入 ReceiverDispatcher 的监听列表。
  • ​进程绑定​:动态接收器与宿主进程(如 Activity 所在进程)强关联,进程终止后自动失效。

二、广播的发送与接收原理

1. ​​发送广播​
  • ​Intent 封装​ :通过 Intent 指定广播动作(action)、数据(extras)及目标接收器(setPackage())。
  • ​发送方式​
    • ​无序广播​sendBroadcast(),所有匹配接收器并行处理。
    • ​有序广播​sendOrderedBroadcast(),按优先级顺序处理,支持终止传播(abortBroadcast())。
2. ​​接收流程​
  1. ​AMS 分发​ :发送广播后,AMS 根据 IntentFilter 匹配动态注册的接收器列表。
  2. ​消息队列调度​ :AMS 将广播封装为 BroadcastRecord,加入 BroadcastQueue 队列。
  3. ​线程执行​ :通过 HandleronReceive() 调度至宿主进程的主线程执行(避免跨线程问题)。
3. ​​数据传递​
  • ​Intent 携带数据​ :发送方可通过 putExtra() 附加数据,接收方从 Intent 中提取。
  • ​跨进程通信​ :若接收器与发送方进程不同,AMS 通过 Binder 机制跨进程传递 Intent

三、系统级调度机制

1. ​​AMS 的核心作用​
  • ​广播队列管理​ :AMS 维护全局的 BroadcastQueue,按时间顺序或优先级调度广播。
  • ​权限校验​ :检查发送方与接收方的权限声明(如 android:permission),防止未授权广播。
  • ​进程状态维护​:若接收器所在进程未启动,AMS 会触发进程启动(仅限静态注册,动态注册需宿主进程存活)。
2. ​​有序广播的特殊处理​
  • ​优先级队列​ :接收器按 android:priority 排序,高优先级者先处理。
  • ​结果反馈​ :接收器可通过 setResultExtras() 传递数据给后续接收器,或调用 abortBroadcast() 终止传播。
3. ​​性能优化​
  • ​批量处理​:同一时间点到达的广播可能合并处理,减少上下文切换。
  • ​延迟分发​ :对耗时操作(如网络请求)自动延迟至 onReceive() 返回后执行。
相关推荐
雨白9 小时前
指针与数组的核心机制
android
黄林晴13 小时前
Room 3.0 正式发布!包名彻底重构,KMP 成为核心主线
android·android jetpack
三少爷的鞋14 小时前
Kotlin 协程环境下的 DCL 懒加载:别把线程时代的经验直接搬过来
android
plainGeekDev14 小时前
Gson → kotlinx.serialization
android·java·kotlin
CYY951 天前
Compose 入门篇
android·kotlin
杉氧1 天前
Compose 时代的 MVI 架构:如何用单向数据流驱动复杂 UI?
android·架构·android jetpack
杉氧1 天前
Modifier 的艺术:为什么链式调用的顺序决定了UI 的生命周期?
android·架构·android jetpack
李斯维1 天前
腾讯 XLog 日志框架 Android 端接入
android·android studio·android jetpack
黄林晴1 天前
Kotlin Toolchain 0.11 发布:Amper 正式更名,统一 kotlin 命令
android·kotlin