Android13 不能静态注册的几个广播
Android13 不能静态注册的几个广播
文章目录
- Android13 不能静态注册的几个广播
- 一、不能静态注册的广播:
- 二、静态注册无法生效的分析
- 1、Intent.java
- 2、其他地方声明了不能静态注册的广播
- 3、为啥静态注册的广播无效?
- 4、其他静态注册无法生效的广播
- 5、其他
- Android framework 所有广播的定义
- 静态广播注册无效解决
- 详解Android广播Broadcast的启动流程
- AMS 四大组件之 Broadcast流程分析
本文介绍一些广播相关的知识,主要是静态广播注册无效的介绍。
其实从Android 8.0 就开始有这个问题的,只是本文的源码是基于Android13 分析的。
一、不能静态注册的广播:
其实并不是不能静态注册,只是静态注册会无效而已。
android.intent.action.SCREEN_ON //屏幕亮起android.intent.action.SCREEN_OFF//屏幕亮起android.intent.action.BATTERY_CHANGED //电池电量改变android.intent.action.CONFIGURATION_CHANGED //配置改变,界面语言,设备方向等配置信息android.intent.action.TIME_TICK //每分钟回调一次
主要是系统安全问题,这些广播都是比较频繁的,或者是重要时机的,避免普通应用乱用。
你以为就完了吗,其实没有!
上面五个广播都是 Intent.java 里面定义的广播,网上很多就说了上面五个,
其实还有其他广播静态注册是无法生效的。
二、静态注册无法生效的分析
1、Intent.java
framework\base\core\java\android\content\Intent.java
看其中一个无法静态注册的广播 Intent.ACTION_TIME_TICK 说明
/*** Broadcast Action: The current time has changed. Sent every* minute. You <em>cannot</em> receive this through components declared* in manifests, only by explicitly registering for it with* {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)* Context.registerReceiver()}.** <p class="note">This is a protected intent that can only be sent* by the system.*/@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)public static final String ACTION_TIME_TICK = "android.intent.action.TIME_TICK";
从注释代码其实可以看到:
You <em>cannot</em> receive this through components declaredin manifests,
//你不能通过 manifests 声明进行注册
only by explicitly registering for it
//只能动态注册它
在Intent.java 全局搜索 “only by explicitly registering for it”,确实只有上面五个。
全局搜索一下源码,发现其他地方也有这个声明的注释代码,那么那些声明了的广播,也是会静态注册无效的。
2、其他地方声明了不能静态注册的广播
framework\base\media\java\android\media\AudioManager.java
/*** Broadcast Action: Wired Headset plugged in or unplugged.** You <em>cannot</em> receive this through components declared* in manifests, only by explicitly registering for it with* {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)* Context.registerReceiver()}.** <p>The intent will have the following extra values:* <ul>* <li><em>state</em> - 0 for unplugged, 1 for plugged. </li>* <li><em>name</em> - Headset type, human readable string </li>* <li><em>microphone</em> - 1 if headset has a microphone, 0 otherwise </li>* </ul>* </ul>*/@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)public static final String ACTION_HEADSET_PLUG ="android.intent.action.HEADSET_PLUG";public static final String ACTION_MICROPHONE_MUTE_CHANGED ="android.media.action.MICROPHONE_MUTE_CHANGED";public static final String ACTION_SPEAKERPHONE_STATE_CHANGED ="android.media.action.SPEAKERPHONE_STATE_CHANGED";
framework\base\telephony\java\android\telephony\TelephonyManager.java
public static final String ACTION_EMERGENCY_CALLBACK_MODE_CHANGED = "android.intent.action.EMERGENCY_CALLBACK_MODE_CHANGED";public static final String ACTION_EMERGENCY_CALL_STATE_CHANGED = "android.intent.action.EMERGENCY_CALL_STATE_CHANGED";
packages\modules\Wifi\framework\java\android\net\wifi\p2p\WifiP2pManager.java
public static final String ACTION_WIFI_P2P_PERSISTENT_GROUPS_CHANGED = "android.net.wifi.p2p.action.WIFI_P2P_PERSISTENT_GROUPS_CHANGED";
上面的广播基本没怎么用过,这里不进行描述介绍了。
看一眼知道这些广播也是静态注册无效的就行了。
3、为啥静态注册的广播无效?
其实我是猜测应该是AMS加载apk的流程中会加载静态注册的广播,在这个过程可能会把某些静态注册的广播跳过处理,所以静态注册这些广播是无效的。
下面是 Android AMS 加载 AndroidManifest.xml 广播过程如下:
1、AMS 通过 ActivityThread 获取 ContextImpl 对象,然后通过 ContextImpl 对象获取 PackageManager 对象。2、AMS 调用 PackageManager 的 getReceiverInfo 方法获取广播接收者的信息,包括接收者的名称、所在的进程、导出状态等信息。3、AMS 调用 ActivityThread 的 getPackageInfo 方法获取应用程序的信息,包括应用程序的名称、包名、版本号等信息。4、AMS 调用 PackageParser 的 parsePackage 方法解析 AndroidManifest.xml 文件,获取应用程序的组件信息,包括 Activity、Service、Receiver 等信息。5、AMS 遍历解析出来的组件信息,找到与广播接收者匹配的组件。6、如果找到匹配的组件,则将广播发送给该组件;否则,将广播发送给默认的广播接收者。
我大概看了一下源码,看不出啊,加载的过程没有对某个静态广播判断的过程。
如果需要分析研究,要在上面的第四五步过程,进行详细的打印分析,应该会有一下线索的。
目前没时间进一步进行分析了,有搞懂的可以跟我说说哈!
4、其他静态注册无法生效的广播
其实除了上面说明了 “only by explicitly registering for it” 的广播,还有其他广播也是有些会有静态注册无法生效的问题。
比如最近接触的 只能动态注册的蓝牙部分广播:
BluetoothAdapter.ACTION_STATE_CHANGED: //蓝牙开关
BluetoothAdapter.ACTION_SCAN_MODE_CHANGED: //蓝牙扫描状态修改
BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED: //蓝牙连接详细情况
BluetoothDevice.ACTION_BOND_STATE_CHANGED: //蓝牙绑定状态改变,绑定前后蓝牙变化广播
其他一些蓝牙广播是可以静态注册正常收到的。
所以说整个系统除了上面说的的广播,可能还有些广播是静态注册无效的。
如果要分析个所以然来还是要在上面的AMS加载流程中分析。
5、其他
Android framework 所有广播的定义
//我们常用的广播都定义在里面,如果要新增可以在里面新增
framework\base\core\res\AndroidManifest.xml<protected-broadcast android:name="android.intent.action.SCREEN_OFF" /><protected-broadcast android:name="android.intent.action.SCREEN_ON" /><protected-broadcast android:name="android.intent.action.USER_PRESENT" /><protected-broadcast android:name="android.intent.action.TIME_SET" /><protected-broadcast android:name="android.intent.action.TIME_TICK" /><protected-broadcast android:name="android.intent.action.TIMEZONE_CHANGED" /><protected-broadcast android:name="android.intent.action.DATE_CHANGED" /><protected-broadcast android:name="android.intent.action.PRE_BOOT_COMPLETED" />
静态广播注册无效解决
其实没啥好说的,静态注册无效的,动态注册就行了,可以在自己应用写一个服务,
在服务类里面注册一系列广播,就可以了,也能保障界面退出还能继续收到广播。
详解Android广播Broadcast的启动流程
https://www.jb51.net/article/279551.htm#_label1
AMS 四大组件之 Broadcast流程分析
https://blog.csdn.net/zhaozhenhui_1990/article/details/119904083
相关文章:
Android13 不能静态注册的几个广播
Android13 不能静态注册的几个广播 文章目录 Android13 不能静态注册的几个广播一、不能静态注册的广播:二、静态注册无法生效的分析1、Intent.java2、其他地方声明了不能静态注册的广播3、为啥静态注册的广播无效?4、其他静态注册无法生效的广播5、其他Android fra…...
吴恩达深度学习L2W1作业1
初始化 欢迎来到“改善深度神经网络”的第一项作业。 训练神经网络需要指定权重的初始值,而一个好的初始化方法将有助于网络学习。 如果你完成了本系列的上一课程,则可能已经按照我们的说明完成了权重初始化。但是,如何为新的神经网络选择…...
uniapp原生插件之安卓app添加到其他应用打开原生插件
插件介绍 安卓app添加到其他应用打开原生插件,接收分享的文本和文件,支持获取和清空剪切板内容 插件地址 安卓app添加到其他应用打开原生插件,支持获取剪切板内容 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 u…...
scala编码
1、Scala高级语言 Scala简介 Scala是一门类Java的多范式语言,它整合了面向对象编程和函数式编程的最佳特性。具体来讲Scala运行于Java虚拟机(JVM)之上,井且兼容现有的Java程序,同样具有跨平台、可移植性好、方便的垃圾回收等特性…...
智慧路灯杆如何实现雪天道路安全监测
随着北方区域连续发生暴雪、寒潮、大风等气象变化,北方多地产生暴雪和低温雨雪冰冻灾害风险,冬季雨雪天气深度影响人们出行生活,也持续增加道路交通风险。 智慧路灯杆是现代城市不可或缺的智能基础设施,凭借搭载智慧照明、环境监测…...
C语言指针基础题(二)
目录 例题一题目解析及答案 例题二题目解析及答案 例题三题目解析及答案 例题四题目解析及答案 例题五题目解析及答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸…...
物奇平台MIC配置与音频通路关系
物奇平台MIC配置与音频通路关系 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 1 255代表无效&am…...
外包干了3年,技术退步太明显了。。。。。
先说一下自己的情况,本科生生,18年通过校招进入武汉某软件公司,干了差不多3年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能…...
阶段十-java新特性
JDK9新特性 1.模块化系统 jar包结构的变化 jar -》model -》package -》class 通过不同的模块进行开发 每个模块都有自己的模块配置文件module-info.java 2.JShell JDK9自带的命令行开发,在进行简单的代码调试时可以直接编译使用 可以定义变量,方法&…...
win10重装系统历程
win10系统更新出问题了,重置系统卡死,遂决定重装。 微软官方工具制作U盘启动盘, 进行到分区时,一冲动把盘都格式化了, 后面了解到,即便进不了系统也有办法备份数据的... 进行到安装时,提示W…...
【知识积累】深度度量学习综述
原文指路:https://hav4ik.github.io/articles/deep-metric-learning-survey Problem Setting of Supervised Metric Learning 深度度量学习是一组旨在衡量数据样本之间相似性的技术。 Contrastive Approaches 对比方法的主要思想是设计一个损失函数,直…...
webrtc网之sip转webrtc
OpenSIP是一个开源的SIP(Session Initiation Protocol)服务器,它提供了一个可扩展的基础架构,用于建立、终止和管理VoIP(Voice over IP)通信会话。SIP是一种通信协议,用于建立、修改和终止多媒体…...
【Spring】依赖注入之属性注入详解
前言: 我们在进行web开发时,基本上一个接口对应一个实现类,比如IOrderService接口对应一个OrderServiceImpl实现类,给OrderServiceImpl标注Service注解后,Spring在启动时就会将其注册成bean进行统一管理。在Co…...
6-tornado配置文件的使用(命令行解析、文件设置)
tornado.options options 可以让服务运行前提前设置参数,而常见的2种设置参数方式为:1. 命令行设置 2. 文件设置命令行解析 使用tornado.options.define前定义,通常在模块的顶层。 然后,可以将这些选项作为以下属性的属性进行访…...
k8s ingress service endpoints 解决微信服务器验证问题(内网穿透)
最近公司要搞微信公众号开发,想用自己公司内网的电脑调试,但涉及到微信服务器地址(URL)验证的问题(内网穿透),查了网上一堆文章有推荐ngrok的,但被微信墙了;有推荐sunny-ngrok的,免费…...
postgresql-effective_cache_size参数详解
在 PostgreSQL 中,effective_cache_size 是一个配置参数,用于告诉查询规划器关于系统中可用缓存的估计信息。这个参数并不表示实际的内存量,而是用于告诉 PostgreSQL 查询规划器系统中可用的磁盘缓存和操作系统级别的文件系统缓存的大小。它用…...
CUDA锁页内存的使用
1.定义指针变量 float *host_Weights; // 锁页内存 float *dev_Weights; // 设备端内存2.分配内存 cudaHostAlloc((void**)&host_Weights, numInputs * sizeof(float), cudaHostAllocDefault); // 用锁页内存,可以有效加快数据传递速度 cudaMalloc((vo…...
python常见代码用法
1.result [[]] * n 和 result [[] for _ in range(n)] 辨析 n 3 result [[]] * nprint(result) # 输出:[[], # [], # []]print(result[0] is result[1] is result[2]) # 输出:True* 运算符进行复制,这些空列表实际…...
MTU TCP-MSS(转载)
MTU MTU 最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小。 是包或帧的最大长度,一般以字节记。如果MTU过大,在碰到路由器时…...
【ARM Trace32(劳特巴赫) 高级篇 20 -- SNOOPer 使用介绍】
请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 SNOOPer 介绍SNOOPer 主要功能:SNOOPer 使用场景SNOOPer.ERRORSTOPSNOOPer.ModeSNOOPer.PCSNOOPer.RateSNOOPer.SELectSNOOPer.SIZESNOOPer.TDelaySNOOPer.TOutSNOOPer.TValueSNOOPer PC 采样Trace32 SNOOPer 介绍 在 Laut…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
