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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…