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