Android廣播機制體系初識

Android廣播機制體系大白話

把Android的廣播機制想象成小區里的“大喇叭”

誰在喊話?

任何App或系統都能當“大喇叭”,比如喊一嗓子“電量不足啦!”(這就是發送廣播)

誰在聽?

其他App只要“豎起耳朵”(注冊BroadcastReceiver),就能聽到自己關心的廣播。比如外賣App專門監聽“網絡斷開”的廣播,一斷網就提醒你

有啥好處?

不用互相認識:喊話的不用管誰在聽,聽的也不用管誰喊的,各干各的,互不打擾(解耦)

隨叫隨到:靜態注冊的廣播(像24小時待命的保安)連App沒打開都能響應;動態注冊的(像臨時工)靈活但得手動關掉

注意點

別磨蹭:廣播處理要快,超過10秒系統會急眼(ANR)【只有有序廣播有超時機制】

安卓8.0后規矩多了:亂喊廣播會被限制,得用顯式廣播

0

廣播就是Android里的“喊話-聽響”機制,讓App之間既能默契配合,又不用互相綁死!對應設計模式中的觀察者模式

0

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

│ ? └─ 靜態接收者:獨立進程生命周期

0

廣播分發中心:SystemServer進程(中框,Android系統核心)

核心成員:

AMS(ActivityManagerService):總調度

BroadcastQueue:排隊管理(前臺/后臺隊列)

BroadcastDispatcher:類似快遞員,按名單派件

備注:由于廣播發送者一般都是位于不同的進程,故通信是基于binder

0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90918.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90918.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90918.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序點擊輸入框時,頂部導航欄被遮擋問題如何解決?

前言 不知道大家開發微信小程序的時候有沒有遇到這么一個問題,就是在表單頁面中,點擊輸入框后,輸入框頂起會把頂部欄給遮擋住,如下圖所示:遇到這種情況有沒有解決的辦法呢?能不能既將頁面頂起,同…

通過具有一致性嵌入的大語言模型(LMMs)實現端到端乳腺癌放射治療計劃制定|文獻速遞-醫學影像算法文獻分享

Title題目End-to-end breast cancer radiotherapy planning via LMMs with consistencyembedding通過具有一致性嵌入的大語言模型(LMMs)實現端到端乳腺癌放射治療計劃制定01文獻速遞介紹近年來,受大型語言模型(LLM)啟發…

vscode npm run build打包報ELIFECYCLE

npm run build打包報ELIFECYCLE 是內存溢出解決方案:修改build腳本 :"build": "node --max_old_space_size4096 node_modules/vue/cli-service/bin/vue-cli-service.js build",

【lucene】BlockMaxConjunctionScore

BlockMaxConjunctionScorer 是 Lucene 8.5 引入的一個高性能交集打分器(conjunction scorer),專門用于處理 多條件“與”查詢(AND 查詢) 的場景。它基于 Block-Max WAND(BMW)算法,可…

Androidstudio 上傳當前module 或本地jar包到maven服務器。

1.設置gradle版本到8.0 gradle-wrapper.properties文件中設置: distributionUrlhttps\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.0-bin.zip 2.設置項目根目錄build.gradle 設置agp版本和maven插件版本(和gralde版本有對應關系&#xff…

Python動態規劃:從基礎到高階優化的全面指南

動態規劃(Dynamic Programming)是解決復雜優化問題的核心技術,也是算法領域的明珠。本文將深入探討Python實現動態規劃的全方位技術,涵蓋基礎概念、經典問題、優化技巧和實際工程應用,帶您掌握這一強大工具的精髓。一、…

視覺大模型部署實踐篇(Docker+dify+ollama安裝)

一、概述 目的:實現一個本地化部署的大模型,通過工作流對圖像進行一些處理。基于此,我選擇了Docker+Dify+Ollama的部署。 具體實現邏輯:Docker來運行dify,dify用來繪制大模型的工作流或者rag等,Ollama用來部署本地大模型,dify調用Ollama部署的大模型進行推理。 二、Dock…

服務器啟動日志等級

目錄 標準日志等級 服務器啟動階段常見日志 日志配置建議 常見服務器/工具的日志等級配置方式 ET框架 Apache/Nginx 等 Web 服務器 Docker 容器 服務器啟動過程中的日志等級是幫助開發者和運維人員理解系統狀態的重要工具。常見的日志等級及其含義如下: 標準…

linux_centos7安裝jdk8_采用jdk安裝包安裝

你問我為什么不用yum? 我yum安裝不了,我也解決不了qwq. 文章目錄一.下載安裝包1.找到安裝包下載位置2.上傳安裝包到linux3.解壓jdk安裝包4.配置環境一.下載安裝包 1.找到安裝包下載位置 去官網找到你要下載jdk版本: Oracle官網 下面演示安裝jdk8的&am…

Linux驅動23 --- RkMedia 使用

目錄 一、上電自動掛載 二、RkMedia 2.1 認識 RkMedia rtsp rtmp RTSP 和 RTMP 的選擇 2.2 安裝 VLC 2.2 RkMedia 例程使用 一、上電自動掛載 cd /etc/init.d/ vi Smyprofile.sh 添加這個內容 #!/bin/sh ifconfig eth0 192.168.66.88 mount -t nfs 192.168.66.66…

Linux:線程同步與線程互斥

線程互斥競態條件當多個線程(或進程)并發訪問和操作同一個共享資源(如變量、文件、數據庫記錄等)時,最終的結果依賴于這些線程執行的相對時序(即誰在什么時候執行了哪條指令)。 由于操作系統調度…

HTML 常用標簽速查表

HTML 常用標簽速查表 &#x1f9f1; 結構類標簽 標簽含義用途說明<html>HTML文檔根元素所有HTML內容的根節點<head>頭部信息放置元信息&#xff0c;如標題、引入CSS/JS等<body>頁面內容主體所有可視內容的容器&#x1f4dd; 文本與標題標簽 標簽含義用途說…

1.gradle安裝(mac)

1.下載二進制包 官網下載&#xff1a;Gradle Releases 國內鏡像&#xff08;騰訊云&#xff09;&#xff1a;https://mirrors.cloud.tencent.com/gradle/ 2.解壓并配置環境變量 解壓到指定目錄&#xff08;示例&#xff1a;/opt/gradle&#xff09; sudo mkdir -p /opt/gr…

Rust賦能土木工程數字化

基于Rust語言在數字化領域應用 基于Rust語言在土木工程數字 以下是基于Rust語言在土木工程數字化領域的30個實用案例,涵蓋結構分析、BIM、GIS、傳感器數據處理等方向。案例均采用Rust高性能、安全并發的特性實現,部分結合開源庫或算法。 結構分析與計算 有限元分析框架 使…

KTH5791——3D 霍爾位置傳感器--鼠標滾輪專用芯片

1 產品概述 KTH5791是一款基于3D霍爾磁感應原理的鼠標滾輪專用芯片&#xff0c;主要面向鼠標滾輪的旋轉的應用場景。兩個 專用的正交輸出使該產品可直接替代機械和光學旋轉編碼器的輸出方式&#xff0c;使得鼠標磁滾輪的應用開發工作極簡 化即兼容目前所有鼠標的滾輪輸出方式。…

決策樹(Decision Tree)完整解析:原理 + 數學推導 + 剪枝 + 實戰

1?? 什么是決策樹&#xff1f;決策樹&#xff08;Decision Tree&#xff09;是一種常見的監督學習方法&#xff0c;可用于分類和回歸。 其基本思想是&#xff1a;通過特征條件的逐層劃分&#xff0c;將數據集分割成越來越“純凈”的子集&#xff0c;直到子集中的樣本幾乎屬于…

C語言:20250728學習(指針)

回顧/*************************************************************************> File Name: demo01.c> Author: 阮> Description: > Created Time: 2025年07月28日 星期一 09時07分52秒**********************************************************…

esp32s3文心一言/豆包(即火山引擎)大模型實現智能語音對話--流式語音識別

一、引言 在之前的帖子《Esp32S3通過文心一言大模型實現智能語音對話》中&#xff0c;我們介紹了如何使用Esp32S3微控制器與文心一言大模型實現基本的智能語音對話功能&#xff0c;但受限于語音識別技術&#xff0c;只能處理2-3秒的音頻數據。為了提升用戶體驗&#xff0c;滿足…

面試150 最長遞增子序列

思路 定義 dp[i] 表示以第 i 個元素結尾的最長遞增子序列的長度&#xff0c;初始時每個位置的最長子序列長度為 1。然后通過雙重循環遍歷每一對元素 j < i&#xff0c;如果 nums[i] > nums[j]&#xff0c;說明 nums[i] 可以接在 nums[j] 的遞增序列之后&#xff0c;更新 …

TCP 套接字--服務器相關

1.創建 TCP 套接字int server_sockfd socket(AF_INET,SOCK_STREAM, 0);函數原型&#xff1a;#include <sys/socket.h>int socket(int domain, int type, int protocol);domain協議族&#xff08;地址族&#xff09;AF_INET&#xff08;IPv4&#xff09;type套接字類型SO…