【学习】Android四大组件启动流程(3)——BroadcastReceiver的工作过程

SONOFF Dongle Plus MG24 Zigbee适配器开箱与配置指南 Zigbee作为低功耗、高可靠性的无线通信协议,在智能家居领域广泛应用。其基于IEEE 802.15.4标准,采用Mesh网络拓扑,能有效扩展覆盖范围。SONOFF Dongle Plus MG24 Zigbee适配器采用Silicon Labs EFR32MG24芯片,支持200米传输距离,适合构建稳定的智能家居网络。通过Home Assistant的ZHA集成,可以轻松管理Zigbee设备,实现温湿度监测、智能开关控制等功能。本文以SONOFF设备为例,详细介绍硬件配置、网络优化及故障排查技巧,助力打造 阅读详情

BroadcastReceiver的工作过程

1.广播的注册过程
2.广播的发送和接收过程

回顾广播的使用方法

1.定义广播接收者
继承BroadcastReceiver并重写onReceive方法

2.注册广播接收者
静态注册
在AndroidManifest文件中静态注册

在这里插入图片描述

动态注册(需要在合适的时机解注册)

在这里插入图片描述

3.通过send方法发送广播

在这里插入图片描述

广播注册、发送和接受的大致流程图

在这里插入图片描述

广播的注册过程

静态注册
在应用安装时由系统自动完成注册,具体来说是PMS(PackageManagerService)来完成整个注册过程,其他三大组件也是在应用安装时由PMS解析并注册的。

动态注册
从ContextWrapper的registerReceiver方法开始,它把注册过程交给了ContextImpl来完成
在这里插入图片描述

它又把注册过程交给registerReceiverInternal方法

在这里插入图片描述

registerReceiverInternal方法实现如下

在这里插入图片描述

系统首先从mPackageInfo获取IIntentReceiver对象rd,然后再采用跨进程的方式向AMS发送广播注册的请求。不采用BroadcastReceiver是因为上述注册过程是一个进程间通信的过程,而它作为一个安卓组件时不能直接跨进程传递的,所以要通过IIntentReceiver来中转。IIntentReceiver必须是一个Binder接口,它的具体实现是LoadApk.ReceiverDispatcher.InnerReceiver,ReceiveDispatcher的内部同时保存了BroadcastReceiver和InnerReceiver,这样当接收到广播时,ReceiverDispatcher可以很方便地调用BroadcaseReceiver的onReceive方法.可以发现BroadcastReceiver的这个过程和Service的实现原理类似,Service也有一个ServiceDispatcher的类,并且其内部类InnerConnection也是一个Binder接口,同样也是为了进程间通信。下面看一下ReceiveDispatcher的getIIntentReceiver的实现

在这里插入图片描述

getReceiveDispatcher方法重新创建了一个ReceiverDispatcher对象并将其保存的InnerReceiver对象作为返回值返回,其中InnerReceiver对象和BroadcastReceiver都是在ReceiverDispatcher的构造方法中被保存起来的。

注册广播的真正实现过程是在AMS中,所以我们需要看一下AMS的registerReceiver方法(太长,只看核心代码)
在这里插入图片描述

最终把远程的InnerReceiver对象以及IntentFilter对象存储起来,这样子整个广播的注册过程就完成了

广播的发送和接收过程

当通过send方法来发送广播时,AMS会查找出匹配的广播接收者并将广播发送给它们处理。广播的发送有几种类型:普通广播 有序广播 粘性广播(已经弃用),但他们流程是类似的,因此这里只分析普通广播

广播的发送
开始于ContextWrapper的sendBroadcast方法,不用Context中的send方法是因为Context的send方法是一个抽象方法。ContextWrapper同样把事情交给ContextImpl处理
在这里插入图片描述

它向AMS发起了一个异步请求用于发送广播,下面之间看AMS的broadcastIntent方法
在这里插入图片描述

它调用了broadcastIntentLocked方法(很长,截取部分了解)

在这里插入图片描述

这表示默认情况下广播不会发送给已经停止的应用

两个标签控制广播是否要对处于停止状态的应用起作用

FLAG_INCLUDE_STOPPED_PACKAGES
表示包含已经停止的应用,这个时候广播会发送给已经停止的应用

FLAG_EXCLUDE_STOPPED_PACKAGES
表示不包含已经停止的应用,这个时候广播不会发送给已经停止的应用

继续上面的方法解析
在这里插入图片描述

它会根据intent-filiter查找出匹配的广播接收者并经过一系列的条件过滤,最终会将满足条件的广播接收者添加到BroadcastQueue中,接着BroadcastQueue就会将广播发送给相应的广播接收者

看一下BroadcastQueue中广播的发送过程
在这里插入图片描述

它发送了一个BROADCAST_INTENT_MSG类型的消息,BroadcastQueue收到消息后会调用processNextBroadcast方法,BroadcastQueue的processNextBroadcast方法对普通广播的处理如下
在这里插入图片描述

无序广播存储在mParallelBroadcasts中,系统会遍历mParalledBroadcasts并将其中的广播发送给它们所有的接收者,具体的发送过程通过deliverToRegisteredReceiverLocked方法实现,它将一个广播发送给一个特定的接收者,它内部调用了performReceiveLocked方法来完成具体的发送过程

在这里插入图片描述

由于接收广播会调起应用程序,因此app.thread不为null,这里的app.thread仍然是ApplicationThread。它调用了scheduleRegisteredReceiver方法
在这里插入图片描述

IIntentrReceiver的performReceive方法会调用LoadedApk.ReceiverDispatcher的performReceive方法
在这里插入图片描述

它创建了一个Args对象并用mActivityThread的post方法来执行Args中的逻辑,而Args实现了Runnable接口。mActivityThread是一个Hnalder,它其实就是ActivityThread中的mH,mH就是ActivityThread的内部类H。

在Args的run方法中
在这里插入图片描述

这个时候Broadcast的onReceive方法被执行,也就是说应用已经收到广播了,同时onReceive是在广播接收者的主线程中被调用的。

Android进阶知识树——Android四大组件启动过程 Activity Activity的启动是从Activity的startActivityForResult(),在startActivityForResult()中调用Instrumentation.execStartActivity() execStartActivity():调用IActivityManager代理类执行Activity的启动,IActivityManager在此处采用B... 阅读详情

相关推荐

Wordpress实战之第二章安装wordpress 软件需要的软件

使用下载并安装phpstudy面版工具 wget -O install.sh?https://notdocker.xp.cn/install.sh?&& sudo bash install.sh 2.安装成功如下 ==============运行状态========================= webpanel stop phpstudy running =================...

安全参透之旅 612

详解 Android 中 BroadcastReceiver

注意,使用sendOrderedBroadcast方法发送有序广播时,需要一个权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。这样做是从安全角度考虑的,例如系统的短信就是有序广播的形式,一个应用可能是具有拦截垃圾短信的功能,当短信到来时它可以先接受到短信广播,必要时终止广播传递,这样的软件就必须声明接收短信的权限。注意,这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行。

2401_83817603的博客 1151

【嵌入式笔试题】C语言笔试题(4)

嵌入式C语言综合笔试题

m0_74055118的博客 1067

Android中BroadcastReceiver的工作过程

我们知道,BroadcastReceiver的工作步骤是先注册广播,然后就是发送和接收广播。广播的注册方式分两种,动态注册就是通过代码中使用registerReceiver方法来完成,而静态注册是通过在AndroidManifest.xml文件配置即可,而且静态注册还可以在app不启动也能接收到广播,这是因为在Android系统启动时都会重装装所有的apk,会把静态广播注册到ActivityMan.........

子云心的博客 1080

SAP交货单增强字段更新实战:手把手教你用BAPI_OUTB_DELIVERY_CHANGE和EXTENSION2参数

本文详细解析了如何使用BAPI_OUTB_DELIVERY_CHANGE和EXTENSION2参数实现SAP交货单增强字段的更新。从增强点SMOD_V50B0001的定位到字段落表的全流程,提供了ABAP代码示例和常见问题排查方法,帮助开发者高效完成交货单自定义字段的集成开发。

weixin_42525637的博客 452

CS1237卡尔曼滤波实战:如何用24位ADC实现电子秤级精度?

本文详细介绍了如何利用CS1237 24位ADC芯片结合卡尔曼滤波算法实现电子秤级精度测量。通过解析CS1237硬件特性、卡尔曼滤波原理及STM32驱动优化,提供了一套完整的解决方案,包括多通道支持、驱动代码实现和性能调优技巧,适用于工业测量和嵌入式开发领域。

linux的博客 1087

android中广播的两种启动方式浅析【自定义Action】

1:注册广播:(有两种方式)      一是动态方式使用Context.registerReceiver()方法来注册;      二是静态方式,即在AndroidManifest.xml中通过 。 2:发送广播:       在需要广播的地方sendBroadcast(intent); 之前要给Intent的对象intent 设置Action (Action可以被系统的或自定

yaya_soft的专栏 2567

【OpenClaw从入门到精通】第24篇:OpenClaw Skill商业化实战指南——从0开发付费技能,在ClawHub变现(2026实测版)

本文聚焦OpenClaw Skill商业化的全流程落地,基于2026年生态现状、公开行业报告及开发者指南,拆解付费Skill的市场机会、商业模式、技术实现、发布运营及避坑要点。核心围绕“Freemium API Backend”主流路径,通过虚拟但贴合真实场景的“金融研报复现”案例,提供从需求分析、定价设计到代码开发、ClawHub上架的完整实操方案。文中包含可直接复用的代码片段、执行结果演示及流程图解,既满足新手快速入门的需求,也为进阶开发者提供商业化落地的关键思路,帮助读者抓住AI Agent早期红利。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1085

简介安卓广播机制 Android Broadcast

目录 前言——手机的“小动作” 什么是广播? 有了服务为什么还需要广播? 常见的系统action 广播有哪些成员? 广播发送者 广播的发送过程 广播发送过程时序图 广播的两种发送方式 广播接受者 广播接受者的注册过程 广播注册过程时序图 广播的两种注册方式 前言——手机的“小动作” 如电量低到一定程度会有低电量提醒,插入电源线时炫酷的动画,充满电时又会显示电量已充满,以及当手机开机时显示“欢迎使用中国移动/联通/电信”提醒,关闭wifi、数据时会弹出“网络不可用”等,这..

qq_40116303的博客 935

组基轨迹建模 GBTM的介绍与实现(Stata 或 R)

组基轨迹建模(Group-Based Trajectory Modeling,GBTM)(旧名称:Semiparametric mixture model)历史:由DANIELS.NAGIN提出,发表文献《Analyzing Developmental Trajectories:A Semiparametric,Group-Based Approach》GBTM能够将一群人的轨迹分类并生成数个具有代表性的运动轨迹模型,然后对每个轨迹模型进行分析,以了解人们的运动特征、生理水平和风险等级等。

三分钟热度 1万+

BLDC&PMSM电机控制器硬件设计工程(八)72V 10kW电机控制器原理图工程及库文件

电机控制器基本需求:接口类型;MCU平台;通信接口;供电;信号采集;信号输出;功率;EMC或者认证需求。

小幽余生不加糖 373

四大组件的工作过程

Android系统中的四大组件是构成Android应用程序的基础。包括Activity、Service、BroadcastReceiver、ContentProvider。Android开发中无时无刻不在使用这四大组件。因此了解它们的工作过程能让我们对四大组件的理解更加深刻,同时对Android系统的认识更加清晰。

八归少年 1289

杰理外挂flash使用教程(三): 打包提示音到外部flash(2)

本教程详细介绍了提示音制作与程序配置的全流程规范。提示音制作要求包括:英文命名(8字符内)、单声道转换、标准目录结构(cpu/br23/tools/)及使用user_tone_g.bat脚本生成res.bin资源文件。程序配置需修改:1)启用NOR_FS文件系统;2)调整存储空间;3)配置外置Flash参数;4)增强下载脚本追加资源参数。测试阶段建议替换开机提示音验证功能,扩展开发可参考tone_player.c的索引播放逻辑。所有操作均配有图示说明,关键配置需修改对应头文件和脚本参数。

qq_42014563的博客 587

android四大组件启动流程-BroadcastReceiver启动流程(基于android 6.0)

前面已经写过Activity的启动流程:http://blog.youkuaiyun.com/newhope1106/article/details/53355189 和 Service的启动流程:http://blog.youkuaiyun.com/newhope1106/article/details/53843809 ,本篇是关于广播的,其实标题写得不准确,广播的注册、发送和接收应该是一起,下面开始讲解内容吧。

newhope1106的博客 4461

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

安卓开发-03-四大组件

Android开发的四大组件

ning_xiao_xuan的博客 4798

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android中的四大组件详解

Android中的四大组件详解 我们都知道Android系统应用层框架中,为开发者提供了四大组件来便于应用的开发,它们是Activity、Service、BroadcastReceiver、ContentProvider。 它们用于在应用开发过程中,不同场景的功能实现。 Activity:Activity是开发中最常用的,也是最复杂的一个组件。它是用户可以专注做一些事情的东西。它的主要功能就是可以和用户进行交互操作,所以几乎所有的Activity都会负责创建一个显示窗口,然后通过setContentView

joye123的博客 7562

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【学习】Android四大组件启动流程(1)——Acticity的启动流程

学习于《Android开发艺术探索》,本文讲解了Activity的启动流程并给出了Activity的启动流程图

PanicLin的博客 531

Android四大组件的工作过程

Android四大组件的工作过程概述Activity的启动过程ServiceService的启动过程Service绑定过程ContentProviderContentProvider的启动过程ContentProvider的query过程BroadcastReceiver广播注册过程广播接收/发送过程 概述 这里只分析一般过程,不涉及具体的源码分析。 Activity的启动过程 很明显,Act...

Nigel_Zhou的博客 504

从源码的角度理解四大组件的工作过程——Android开发艺术探索笔记

系统对四大组件的过程进行了很大程度的封装,日常开发中并不需要了解底层的工作原理,那么研究这些原理的意义在哪里呢? 如果你想在技术上更进一步,那么了解一些系统的工作原理是十分必要的,也是开发人员日后成长为高级工程师所必备的技术能力。 Android作为一个优秀的基于Linux操作系统,其内部一定

SparkYuan 2851

【学习】Android四大组件启动流程——Acticity的启动流程

四大组件的运行状态 四大组件中除了BroadcastReceiver以外,其他三种组件都必须要在AndroidManifest注册,对于它来说,它既可以在AndroidManifest由可以代码动态注册。 在调用方式上,Activity、Service、BroadcastReceiver都需要借助Intent,而ContentProvider无需借助Intent Activity是展示型组件,扮演着一个前台界面的角色,用于向用户直接地展示一个界面,并且接受用户的输入信息从而进行交互。它是最重要的一种组件,对

m0_59162559的博客 689

Android四大组件

仅供自己学习使用-转载请注明文中内容出自哪里(我已不知道哪里复制的) 目录 一、活动(Activity) 1.概念 2.生命周期 3.Intent 4.Activity启动模式和任务栈 二、服务(Service) 1.概念 2.生命周期 3.启动方式 三、广播接收者(Broadcast Receive) 1.概念 2.注册方式 四、内容提供者(Content Provider) 1.概念 2.用途 Android 系统的四大组件分别是:活动(activit...

小小怪大人物de博客 4896

【Android】四大组件之BroadcastReceiver

BroadcastReceiver用于监听系统或应用发出的广播事件,实现跨组件通信。

贫道绝缘子的博客 2070

Android四大组件——BroadcastReceiver详解

一、 定义 BroadcastReceiver(广播接收器),属于Android四大组件之一 在Android开发中,BroadcastReceiver的应用场景非常多广播,是一个全局的监听器,属于Android四大组件之一 Android 广播分为两个角色:广播发送者、广播接收者 二、 作用 用于监听 / 接收 应用发出的广播消息,并做出响应 应用场景 a. 不同组件之间通信(包括应用内 / 不同应用之间) b. 与 Android 系统在特定情况下的通信 如当电话呼入时、网络可用时

QLHepburn的博客 1679

【Android学习】四大组件

Android四大组件——Activity、Service、Content Provider和Broadcast Receiver,共同构成了应用程序的基本框架。Activity负责用户交互界面,Service用于后台任务处理。Content Provider实现数据共享,允许不同应用间访问数据。Broadcast Receiver监听系统或应用内部广播,执行相应操作。

m0_75208773的博客 3073

Android四大组件详解

Android四大组件详解 文章目录Android四大组件详解四大组件的不同点一、Activity二、Service三、Broadcast Receiver四、Content Provider四大组件相同点4大组件的注册4大组件的激活4大组件的关闭android中的任务(activity栈) Android四大组件分别是活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。 活动(activity)是所有A

爱笑的博客 1万+
上一篇: 【设计模式】装饰模式
下一篇: 【学习】Android四大组件启动流程(4)——ContentProvider的工作过程
Panic  Lin
博客等级 码龄6年 81粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值