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() 返回后执行。
相关推荐
Kapaseker2 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴3 小时前
Android17 为什么重写 MessageQueue
android
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android