Android广播机制体系大白话
把Android的广播机制想象成小区里的“大喇叭”
谁在喊话?
任何App或系统都能当“大喇叭”,比如喊一嗓子“电量不足啦!”(这就是发送广播)
谁在听?
其他App只要“竖起耳朵”(注册BroadcastReceiver),就能听到自己关心的广播。比如外卖App专门监听“网络断开”的广播,一断网就提醒你
有啥好处?
不用互相认识:喊话的不用管谁在听,听的也不用管谁喊的,各干各的,互不打扰(解耦)
随叫随到:静态注册的广播(像24小时待命的保安)连App没打开都能响应;动态注册的(像临时工)灵活但得手动关掉
注意点
别磨蹭:广播处理要快,超过10秒系统会急眼(ANR)【只有有序广播有超时机制】
安卓8.0后规矩多了:乱喊广播会被限制,得用显式广播
广播就是Android里的“喊话-听响”机制,让App之间既能默契配合,又不用互相绑死!对应设计模式中的观察者模式
1. 广播机制总览
├─ 定义:组件间通信的发布-订阅模型
└─ 特点:跨进程、松耦合、系统级事件通知
2. 广播机制原理
2.1 内核层
│ ├─ Binder驱动:跨进程通信基础
│ └─ 进程间通信(IPC)机制
2.2 框架原理
│ ├─ ActivityManagerService(AMS)中枢控制
│ ├─ IntentFilter匹配引擎
│ └─ 消息队列调度模型
3. 广播接收者
3.1 动态广播接收者
│ ├─ 注册方式
│ │ ├─ Context.registerReceiver()
│ │ └─ 需配对unregister
│ └─ 生命周期:与注册Context绑定
3.2 静态广播接收者
│ ├─ AndroidManifest.xml声明
│ └─ 全局监听(即使应用未运行)
4. 广播发送者
4.1 按有序性划分
│ ├─ 无序广播:sendBroadcast()
│ └─ 有序广播:sendOrderedBroadcast()
4.2 按系统属性划分
│ ├─ 普通广播:应用自定义
│ └─ 系统广播:Intent.ACTION_XXX
4.3 按前后台划分
│ ├─ 前台广播:带FLAG_RECEIVER_FOREGROUND
│ └─ 后台广播:默认类型
5. 广播分发中心(AMS)
5.1 注册模块
│ ├─ 存储结构
│ │ ├─ ReceiverList链表
│ │ └─ IntentResolver匹配树
│ └─ 检索优化:Hash索引+快速匹配
5.2 分发模块
│ ├─ 队列类型
│ │ ├─ 前台队列:parallelBroadcastQueue
│ │ └─ 后台队列:orderedBroadcastQueue
│ └─ 分发流程
│ ├─ 无序广播:并行触发
│ └─ 有序广播:串行+优先级处理
6. 广播接收全流程
6.1 发送阶段
│ └─ Context.sendBroadcast()调用链
6.2 收集与入队
│ ├─ 接收者收集
│ │ ├─ 静态接收者:PackageManager查询
│ │ └─ 动态接收者:AMS实时记录
│ └─ 队列策略
│ ├─ 无序广播:直接投递
│ └─ 有序广播:优先级排序
6.3 分发执行
│ ├─ 有序广播处理
│ │ ├─ 超时监控:BROADCAST_TIMEOUT_MSG
│ │ └─ 结果传递:setResultData
│ └─ 静态接收者:独立进程唤醒
6.4 接收处理
│ ├─ 动态接收者:主线程回调onReceive
│ └─ 静态接收者:独立进程生命周期
广播分发中心:SystemServer进程(中框,Android系统核心)
核心成员:
AMS(ActivityManagerService):总调度
BroadcastQueue:排队管理(前台/后台队列)
BroadcastDispatcher:类似快递员,按名单派件
备注:由于广播发送者一般都是位于不同的进程,故通信是基于binder