Android系统开发之浅谈广播接收器回调

广播接器BroadcastReceiver
广播Intent和广播接收器BroadcastReceiver,是大家android开发用的特别多的二个控件。
那如何从系统角度看待广播和广播接收器呢?
对于静态注册BroadcastReceiver和动态注册的BroadcastReceiver是如何回调其onReceive方法呢?
此文章以Android13版本为例,试浅分析之。
静态注册BroadcastReceiver回调
对于直接在AndroidManifest.xml静态注册的广播接收器BootReceiver,其回调onReceive过程为:
com.android.server.BootReceiver.onReceive(BootReceiver.java:162)
android.app.ActivityThread.handleReceiver(ActivityThread.java:4376)
android.app.ActivityThread.-$$Nest$mhandleReceiver(Unknown Source:0)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:2191)
其关键回调逻辑为:
ActivityThread.handleReceiver(ActivityThread.java:4376)
//定义BroadcastReceiver
BroadcastReceiver receiver;
......
receiver = packageInfo.getAppFactory().instantiateReceiver(cl, data.info.name, data.intent);
......
try {if (localLOGV) Slog.v(TAG, "Performing receive of " + data.intent+ ": app=" + app+ ", appName=" + app.getPackageName()+ ", pkg=" + packageInfo.getPackageName()+ ", comp=" + data.intent.getComponent().toShortString()+ ", dir=" + packageInfo.getAppDir());sCurrentBroadcastIntent.set(data.intent);receiver.setPendingResult(data);//回调定义BroadcastReceiver的onReceive方法receiver.onReceive(context.getReceiverRestrictedContext(),data.intent);
动态注册BroadcastReceiver回调
对于我们动态注册BroadcastReceiver的情况:
filter = new IntentFilter();
filter.addAction(intentDynatic);
registerReceiver(mReceiver, filter);
其回调onReceive过程为:
com.example.demo_test.MainActivity$1.onReceive(MainActivity.java:23)
android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$android-app-LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1809)
android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(Unknown Source:2)
其关键回调逻辑为:
frameworks/base/core/java/android/app/LoadedApk.java
final class Args extends BroadcastReceiver.PendingResult {private Intent mCurIntent;private final boolean mOrdered;private boolean mDispatched;private Throwable mPreviousRunStacktrace; // To investigate b/37809561. STOPSHIP remove......ClassLoader cl = mReceiver.getClass().getClassLoader();intent.setExtrasClassLoader(cl);intent.prepareToEnterProcess();setExtrasClassLoader(cl);receiver.setPendingResult(this);//需要在这,将intent,receiver,cl信息打印出来receiver.onReceive(mContext, intent);
查看设备的广播和广播接收器的整体信息
一般,我们使用以下命令读取设备的intent和BroadcastReceiver信息:
其主要有几种信息:
1.ReceiverList
* ReceiverList{8f08ba3 2124 com.mediatek.ims/1001/u0 remote:6585ed2}app=2124:com.mediatek.ims/1001 pid=2124 uid=1001 user=0Filter #0: BroadcastFilter{c094ea0}Action: "com.mediatek.ims.ACTION_IMS_SIMULATE"Action: "android.intent.action.BOOT_COMPLETED"Action: "android.intent.action.SIM_STATE_CHANGED"
2.BroadcastFilter
android.intent.action.BOOT_COMPLETED:BroadcastFilter{80935cb 1000/u-1 ReceiverList{62e389a 1350 system/1000/u-1 local:df35945}}BroadcastFilter{337fb81 1000/u-1 ReceiverList{3a64b68 1350 system/1000/u-1 local:273de8b}}BroadcastFilter{f263ee2 1000/u-1 ReceiverList{58e70c4 1350 system/1000/u-1 local:4d20fd7}}BroadcastFilter{ecb6c7a 1000/u-1 ReceiverList{f7770a5 1350 system/1000/u-1 local:83b8e9c}}BroadcastFilter{f11f0f9 10067/u0 ReceiverList{8b14bc0 1566 com.android.systemui/10067/u0 remote:8b3c943}}BroadcastFilter{8c9b038 1001/u0 ReceiverList{145949b 1762 com.android.phone/1001/u0 remote:a5890aa}}BroadcastFilter{9b1c005 1001/u0 ReceiverList{479ff7c 1762 com.android.phone/1001/u0 remote:6bc466f}}BroadcastFilter{662abaa 1001/u0 ReceiverList{ed46e95 1762 com.android.phone/1001/u0 remote:7770e4c}}BroadcastFilter{33a7c07 1001/u-1 ReceiverList{5740246 1762 com.android.phone/1001/u-1 remote:9e8ce21}}BroadcastFilter{4712dcf 1001/u0 ReceiverList{ec2be2e 1762 com.android.phone/1001/u0 remote:71ee8a9}}BroadcastFilter{3c5cb92 1001/u0 ReceiverList{3e1fd1d 1762 com.android.phone/1001/u0 remote:7ef21f4}}BroadcastFilter{c094ea0 1001/u0 ReceiverList{8f08ba3 2124 com.mediatek.ims/1001/u0 remote:6585ed2}}BroadcastFilter{9131711 1000/u0 ReceiverList{755b38 1350 system/1000/u0 local:f90b9b}}
3.BroadcastRecord
BroadcastRecord{684f7bd u0 android.intent.action.BOOT_COMPLETED} to user 0Intent { act=android.intent.action.BOOT_COMPLETED flg=0x89000010 (has extras) }extras: Bundle[{android.intent.extra.user_handle=0}]caller=null null pid=1350 uid=1000requiredPermissions=[android.permission.RECEIVE_BOOT_COMPLETED] appOp=-1options=Bundle[{android.pendingIntent.backgroundActivityAllowed=true, android:broadcast.temporaryAppAllowlistReasonCode=200, android:broadcast.temporaryAppAllowlistDuration=20000, android:broadcast.temporaryAppAllowlistReason=, android:broadcast.temporaryAppAllowlistType=0}]enqueueClockTime=2024-01-16 00:46:29.999 dispatchClockTime=2024-01-16 00:46:31.315dispatchTime=-2h30m5s313ms (+1s316ms since enq) finishTime=-2h29m59s267ms (+6s46ms since disp)resultTo=null resultCode=0 resultData=nullresultAbort=false ordered=true sticky=false initialSticky=falsenextReceiver=59 receiver=nullDeliver +962ms #0: (manifest)priority=2147483647 preferredOrder=0 match=0x108000 specificIndex=-1 isDefault=falseActivityInfo:name=com.android.traceur.ReceiverpackageName=com.android.traceurenabled=true exported=true directBootAware=falsepermission=android.permission.DUMPlaunchMode=0 flags=0x20010000 privateFlags=0x0 theme=0x0resizeMode=RESIZE_MODE_RESIZEABLEknownActivityEmbeddingCerts={}Deliver +2ms #1: BroadcastFilter{80935cb 1000/u-1 ReceiverList{62e389a 1350 system/1000/u-1 local:df35945}}Deliver +55ms #2: BroadcastFilter{633e1f 10067/u0 ReceiverList{40c9dbe 1566 com.android.systemui/10067/u0 remote:c8d4c79}}
相关文章:
Android系统开发之浅谈广播接收器回调
广播接器BroadcastReceiver 广播Intent和广播接收器BroadcastReceiver,是大家android开发用的特别多的二个控件。 那如何从系统角度看待广播和广播接收器呢? 对于静态注册BroadcastReceiver和动态注册的BroadcastReceiver是如何回调其onReceive方法呢…...
PiflowX如何快速开发flink程序
PiflowX如何快速开发flink程序 参考资料 Flink最锋利的武器:Flink SQL入门和实战 | 附完整实现代码-腾讯云开发者社区-腾讯云 (tencent.com) Flink SQL 背景 Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标…...
Mysql运算符
文章目录 比较运算符< > !IS NULL \ IS NOT NULL \ ISNULLLEAST() \ GREATEST() 查询数据大小(字典序)BETWEEN...AND...IN (SET) \ NOT IN (SET)LIKE 模糊查询REGEXP \ RLIKE 逻辑运算符逻辑运算符: OR (||)、A…...
软件架构之事件驱动架构
一、定义 事件驱动的架构是围绕事件的发布、捕获、处理和存储(或持久化)而构建的集成模型。 某个应用或服务执行一项操作或经历另一个应用或服务可能想知道的更改时,就会发布一个事件(也就是对该操作或更改的记录)&am…...
C++ 后端面试 - 题目汇总
文章目录 🍺 非技术问题🍻 基本问题🥂 请自我介绍?🥂 你有什么问题需要问我的? 🍻 加班薪资🥂 你对加班有什么看法?🥂 你的薪资期望是多少?【待回…...
zds1104示波器使用指南
1、设置语言 2、功能检测验证示波器是否正常工作 3、示波器面板按钮详解 3.1、软键 3.2、运行控制与操作区 3.3、水平控制区 3.4、垂直控制区 3.5、多功能控制区 3.6、断电启动恢复,auto setup,default setup,恢复出厂设置详细解释 3.7、触…...
uni-app修改头像和个人信息
效果图 代码(总) <script setup lang"ts"> import { reqMember, reqMemberProfile } from /services/member/member import type { MemberResult, Gender } from /services/member/type import { onLoad } from dcloudio/uni-app impor…...
IDEA 中搭建 Spring Boot Maven 多模块项目 (父SpringBoot+子Maven)
第1步:新建一个SpringBoot 项目 作为 父工程 [Ref] 新建一个SpringBoot项目 删除无用的 .mvn 目录、 src 目录、 mvnw 及 mvnw.cmd 文件,最终只留 .gitignore 和 pom.xml 第2步:创建 子maven模块 第3步:整理 父 pom 文件 ① …...
竞赛保研 基于计算机视觉的身份证识别系统
0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen…...
在visual studio中调试时无法查看std::wstring
1.问题 在调试的时候发现std::wstring类型的变量查看不了,会显示(error)|0,百思不得其解。 2.解决方法 参考的:vs2015调试时无法显示QString变量的值,只显示地址_vs调试qstring的时候如何查看字符串-CSDN博客 在工具/选项/调试…...
2023年全国职业院校技能大赛高职组应用软件系统开发正式赛题—模块三:系统部署测试
模块三:系统部署测试(3 小时) 一、模块考核点 模块时长:3 小时模块分值:20 分本模块重点考查参赛选手的系统部署、功能测试、Bug 排查修复及文档编写能力,具体包括:系统部署。将给定项目发布到…...
微信小程序上传并显示图片
实现效果: 上传前显示: 点击后可上传,上传后显示: 源代码: .wxml <view class"{{company_logo_src?blank-area:}}" style"position:absolute;top:30rpx;right:30rpx;height:100rpx;width:100rp…...
java基础知识点系列——数据输入(五)
java基础知识点系列——数据输入(五) 数据输入概述 Scanner使用步骤 (1)导包 import java.util.Scanner(2)创建对象 Scanner sc new Scanner(System.in)(3)接收数据 int i sc…...
MySQL面试题 | 07.精选MySQL面试题
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
C语言中关于指针的理解及用法
关于指针意思的参考:https://baike.baidu.com/item/%e6%8c%87%e9%92%88/2878304 指针 指针变量 地址 野指针 野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的) 以下是导致野指针的原因 1.指针…...
软件测试|深入理解Python中的re.search()和re.findall()区别
前言 在Python中,正则表达式是一种强大的工具,用于在文本中查找、匹配和处理模式。re 模块提供了许多函数来处理正则表达式,其中 re.search()和 re.findall() 是常用的两个函数,用于在字符串中查找匹配的模式。本文将深入介绍这两…...
❤ Vue3 完整项目太白搭建 Vue3+Pinia+Vant3/ElementPlus+typerscript(一)yarn 版本控制 ltb (太白)
❤ 项目搭建 一、项目信息 Vue3 完整项目搭建 Vue3PiniaVant3/ElementPlustyperscript(一)yarn 版本控制 项目地址: 二、项目搭建 (1)创建项目 yarn create vite <ProjectName> --template vueyarn install …...
linux搭建SRS服务器
linux搭建SRS服务器 文章目录 linux搭建SRS服务器SRS说明实验说明搭建步骤推流步骤查看web端服务器拉流步骤final SRS说明 SRS(simple Rtmp Server),是一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT, 是国人自己开发的一款…...
系列六、Spring Security中的认证 授权 角色继承
一、Spring Security中的认证 & 授权 & 角色继承 1.1、概述 关于Spring Security中的授权,请参考【系列一、认证 & 授权】,这里不再赘述。 1.2、资源类 /*** Author : 一叶浮萍归大海* Date: 2024/1/11 20:58* Description: 测试资源*/ Re…...
云原生周刊:OpenTofu 宣布正式发布 | 2023.1.15
开源项目推荐 kubeaudit kubeaudit 是一个开源项目,旨在帮助用户对其 Kubernetes 集群进行常见安全控制的审计。该项目提供了工具和检查规则,可以帮助用户发现潜在的安全漏洞和配置问题。 Chronos Chronos 是一款综合性开发人员工具,可监…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
