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…...
观察使用TaotokenTokenPlan后项目月度AI成本的变化趋势
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察使用Taotoken TokenPlan后项目月度AI成本的变化趋势 对于许多采用按量计费模式的中小型项目而言,大模型API的月度支…...
AltSnap:重新定义Windows窗口管理效率的革命性工具
AltSnap:重新定义Windows窗口管理效率的革命性工具 【免费下载链接】AltSnap Maintained continuation of Stefan Sundins AltDrag 项目地址: https://gitcode.com/gh_mirrors/al/AltSnap 你是否曾经在Windows系统中为繁琐的窗口操作而烦恼?当需要…...
3种智能解析技术:VideoDownloadHelper如何突破网页视频下载限制
3种智能解析技术:VideoDownloadHelper如何突破网页视频下载限制 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 在当今数字内容爆…...
热敏电阻测温实战:从原理到Arduino/CircuitPython代码实现
1. 项目概述:从电阻到温度的桥梁在嵌入式开发和电子DIY项目中,温度测量是一个极其常见的需求。无论是环境监测、设备状态反馈,还是简单的温控风扇,你都需要一个可靠的“温度计”。市面上有琳琅满目的温度传感器,从数字…...
AutoJs6:Android平台终极JavaScript自动化解决方案
AutoJs6:Android平台终极JavaScript自动化解决方案 【免费下载链接】AutoJs6 安卓平台 JavaScript 自动化工具 (Auto.js 二次开发项目) 项目地址: https://gitcode.com/gh_mirrors/au/AutoJs6 你是否曾经想过用JavaScript代码就能控制Android手机完成各种重复…...
告别繁琐组态:用SVG + JavaScript 5分钟为你的工业设备创建可交互HMI组件
工业设备HMI组件开发革命:5分钟用SVGJavaScript打造智能交互界面 在工业自动化领域,人机界面(HMI)是连接设备与操作者的关键纽带。传统HMI开发往往陷入两个极端:要么使用笨重的组态软件进行繁琐配置,要么投入大量时间开发定制化界…...
终极指南:在Windows上安装安卓应用的简单解决方案
终极指南:在Windows上安装安卓应用的简单解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经希望在Windows电脑上直接运行手机应用…...
解锁网盘文件下载新体验:LinkSwift直链解析工具完全指南
解锁网盘文件下载新体验:LinkSwift直链解析工具完全指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...
5分钟快速上手Figma中文界面:设计师必备的终极汉化插件指南
5分钟快速上手Figma中文界面:设计师必备的终极汉化插件指南 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma全英文界面而苦恼吗?FigmaCN中文插件是你…...
基于MCP协议的AI思维链结构化存储服务器设计与应用
1. 项目概述:一个为AI思维链提供结构化存储的MCP服务器最近在折腾AI应用开发,特别是那些需要让大语言模型(LLM)进行复杂推理和规划的项目时,我总被一个问题困扰:如何有效地管理和复用模型在思考过程中产生的…...
