当前位置: 首页 > news >正文

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() 查询数据大小&#xff08;字典序&#xff09;BETWEEN...AND...IN (SET) \ NOT IN (SET)LIKE 模糊查询REGEXP \ RLIKE 逻辑运算符逻辑运算符&#xff1a; OR &#xff08;||&#xff09;、A…...

软件架构之事件驱动架构

一、定义 事件驱动的架构是围绕事件的发布、捕获、处理和存储&#xff08;或持久化&#xff09;而构建的集成模型。 某个应用或服务执行一项操作或经历另一个应用或服务可能想知道的更改时&#xff0c;就会发布一个事件&#xff08;也就是对该操作或更改的记录&#xff09;&am…...

C++ 后端面试 - 题目汇总

文章目录 &#x1f37a; 非技术问题&#x1f37b; 基本问题&#x1f942; 请自我介绍&#xff1f;&#x1f942; 你有什么问题需要问我的&#xff1f; &#x1f37b; 加班薪资&#x1f942; 你对加班有什么看法&#xff1f;&#x1f942; 你的薪资期望是多少&#xff1f;【待回…...

zds1104示波器使用指南

1、设置语言 2、功能检测验证示波器是否正常工作 3、示波器面板按钮详解 3.1、软键 3.2、运行控制与操作区 3.3、水平控制区 3.4、垂直控制区 3.5、多功能控制区 3.6、断电启动恢复&#xff0c;auto setup&#xff0c;default setup&#xff0c;恢复出厂设置详细解释 3.7、触…...

uni-app修改头像和个人信息

效果图 代码&#xff08;总&#xff09; <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步&#xff1a;新建一个SpringBoot 项目 作为 父工程 [Ref] 新建一个SpringBoot项目 删除无用的 .mvn 目录、 src 目录、 mvnw 及 mvnw.cmd 文件&#xff0c;最终只留 .gitignore 和 pom.xml 第2步&#xff1a;创建 子maven模块 第3步&#xff1a;整理 父 pom 文件 ① …...

竞赛保研 基于计算机视觉的身份证识别系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-sen…...

在visual studio中调试时无法查看std::wstring

1.问题 在调试的时候发现std::wstring类型的变量查看不了&#xff0c;会显示(error)|0&#xff0c;百思不得其解。 2.解决方法 参考的&#xff1a;vs2015调试时无法显示QString变量的值&#xff0c;只显示地址_vs调试qstring的时候如何查看字符串-CSDN博客 在工具/选项/调试…...

2023年全国职业院校技能大赛高职组应用软件系统开发正式赛题—模块三:系统部署测试

模块三&#xff1a;系统部署测试&#xff08;3 小时&#xff09; 一、模块考核点 模块时长&#xff1a;3 小时模块分值&#xff1a;20 分本模块重点考查参赛选手的系统部署、功能测试、Bug 排查修复及文档编写能力&#xff0c;具体包括&#xff1a;系统部署。将给定项目发布到…...

微信小程序上传并显示图片

实现效果&#xff1a; 上传前显示&#xff1a; 点击后可上传&#xff0c;上传后显示&#xff1a; 源代码&#xff1a; .wxml <view class"{{company_logo_src?blank-area:}}" style"position:absolute;top:30rpx;right:30rpx;height:100rpx;width:100rp…...

java基础知识点系列——数据输入(五)

java基础知识点系列——数据输入&#xff08;五&#xff09; 数据输入概述 Scanner使用步骤 &#xff08;1&#xff09;导包 import java.util.Scanner&#xff08;2&#xff09;创建对象 Scanner sc new Scanner(System.in)&#xff08;3&#xff09;接收数据 int i sc…...

MySQL面试题 | 07.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

C语言中关于指针的理解及用法

关于指针意思的参考&#xff1a;https://baike.baidu.com/item/%e6%8c%87%e9%92%88/2878304 指针 指针变量 地址 野指针 野指针就是指针指向的位置是不可知的&#xff08;随机的&#xff0c;不正确的&#xff0c;没有明确限制的&#xff09; 以下是导致野指针的原因 1.指针…...

软件测试|深入理解Python中的re.search()和re.findall()区别

前言 在Python中&#xff0c;正则表达式是一种强大的工具&#xff0c;用于在文本中查找、匹配和处理模式。re 模块提供了许多函数来处理正则表达式&#xff0c;其中 re.search()和 re.findall() 是常用的两个函数&#xff0c;用于在字符串中查找匹配的模式。本文将深入介绍这两…...

❤ Vue3 完整项目太白搭建 Vue3+Pinia+Vant3/ElementPlus+typerscript(一)yarn 版本控制 ltb (太白)

❤ 项目搭建 一、项目信息 Vue3 完整项目搭建 Vue3PiniaVant3/ElementPlustyperscript&#xff08;一&#xff09;yarn 版本控制 项目地址&#xff1a; 二、项目搭建 &#xff08;1&#xff09;创建项目 yarn create vite <ProjectName> --template vueyarn install …...

linux搭建SRS服务器

linux搭建SRS服务器 文章目录 linux搭建SRS服务器SRS说明实验说明搭建步骤推流步骤查看web端服务器拉流步骤final SRS说明 SRS&#xff08;simple Rtmp Server&#xff09;,是一个简单高效的实时视频服务器&#xff0c;支持RTMP/WebRTC/HLS/HTTP-FLV/SRT, 是国人自己开发的一款…...

系列六、Spring Security中的认证 授权 角色继承

一、Spring Security中的认证 & 授权 & 角色继承 1.1、概述 关于Spring Security中的授权&#xff0c;请参考【系列一、认证 & 授权】&#xff0c;这里不再赘述。 1.2、资源类 /*** Author : 一叶浮萍归大海* Date: 2024/1/11 20:58* Description: 测试资源*/ Re…...

云原生周刊:OpenTofu 宣布正式发布 | 2023.1.15

开源项目推荐 kubeaudit kubeaudit 是一个开源项目&#xff0c;旨在帮助用户对其 Kubernetes 集群进行常见安全控制的审计。该项目提供了工具和检查规则&#xff0c;可以帮助用户发现潜在的安全漏洞和配置问题。 Chronos Chronos 是一款综合性开发人员工具&#xff0c;可监…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...