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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeeCode刷题

寻找数组的中心下标 给定一个整数nums&#xff0c;请编写一个能够返回数组“中心下标”的方法 中心下标是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心下标&#xff0c;返回-1.如果数组右多个中心下标&#xff0c;应该返回…

C#中UDP的简单使用+样例

发送&#xff1a; udpClient.Send(bytes, bytes.Length, "127.0.0.1", 11001); --发送的数据是byte类型&#xff0c;指定ip和端口 接收&#xff1a; public MainWindow() {InitializeComponent();udpClient new UdpClient(11001); // 监听端口11001Task.Run(() &g…

SQL Update语句

SQL Update语句 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; SQL Update语句&#xff1a;数据库操作高招解析 数据库是我们搭建查券返利机器人的重要组成部分&…

【计算机设计大赛】冬残奥会可视化系统_附源码—信息可视化赛道获奖项目深入剖析【可视化项目案例-19】

🎉🎊🎉 你的技术旅程将在这里启航! 记得看本专栏里顶置的可视化宝典导航贴哦! 🚀🚀 本专栏为可视化专栏,包含现有的所有可视化技术。订阅专栏用户在文章底部可下载对应案例完整源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不论你…

kafka学习笔记--节点的服役与退役

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…

Linux命令dmidecode查看主板型号

在 Linux 系统中&#xff0c;可以使用 dmidecode 命令来查看主板型号。dmidecode 是一个工具&#xff0c;它能够读取系统的 DMI&#xff08;Desktop Management Interface&#xff09;信息&#xff0c;包括主板型号、BIOS 版本、CPU 信息等。 要查看主板型号&#xff0c;可以按…

python程序大全(8)——鼠标乱动恶搞小病毒(有资源)

目录 &#x1f3c6;一、前言 &#x1f3c6;二、程序第一版 &#x1f3c6;三、程序大魔改 &#x1f6a9;1、基础改动 &#x1f6a9;2、打包 &#x1f6a9;3、F12保护机制 &#x1f6a9;4、添加开机自启项 &#x1f6a9;5、自己也不懂的线程魔改 &#x1f3c6;四、最终代码 &…

linux(6):linux用户和权限

在linux基础命令第五弹中http://t.csdnimg.cn/Fu5cJ我们学到了关于如何查看命令选项的帮助手册&#xff0c;到此&#xff0c;基础命令的学习先告一段落&#xff0c;我们来学习linux有关用户和权限的问题&#xff0c;这是很有必要的&#xff0c;如果任何人都可以修改我们的文件内…

数据结构 | 查漏补缺之顺式存储和链式存储、如何评价哈希函数的好坏、链地址法、树的遍历、关键路径、完全图、连通图、迪杰斯特拉、b树

目录 顺式存储和链式存储 优缺点比较 顺序存储 ​编辑 链式存储 如何评价哈希函数的好坏 简述哈希查找中链地址法解决冲突的方法 树的遍历 关键路径 完全图 连通图 迪杰斯特拉 b树 特点&#xff1a; 插入&#xff08;索引不能大于&#xff1a;最大为 M-1 个&#…

算法刷题系列:二分(一)

目录 一、糖果促销 这个算法竞赛就是个记忆大赛&#xff0c;你做不出来的题说明你没做过同类型或者同个模型的题&#xff0c;当然不是你的智商有问题&#xff0c;所以多做题很重要&#xff0c;加油&#xff01; 一、糖果促销 码题集&#xff1a;糖果促销 第一种当然是自己最开…

拼接不同文件夹中同名图片的方法

有时候为了方便对比不同文件夹中同名图片&#xff0c;需要拼接在一起&#xff0c;这里提供一个拼接方法&#xff0c;当然不同命文件也可以实现拼接&#xff0c;稍微改改就能实现 如下图&#xff0c;在文件夹中有五个文件夹中的图片需要拼接&#xff0c;拼接后的图片存放在img_…

Spark RDD的转换

按颜色区分转换&#xff1a; 绿色是单 RDD 窄依赖转换黑色是多 RDD 窄依赖转换紫色是 KV 洗牌型转换黄色是重分区转换蓝色是特例的转换 单 RDD 窄依赖转换 MapPartitionRDD 这个 RDD 在第一次分析中已经分析过。简单复述一下&#xff1a; 依赖列表&#xff1a;一个窄依赖&…

日历管理:应对金融服务行业数据调度的复杂挑战

在当今快速发展的金融服务行业中&#xff0c;数据管理和调度的复杂性日益增加。在金融服务公司面临着多元化的挑战&#xff0c;这些挑战不仅涉及技术层面&#xff0c;还包括安全、运维和业务流程的优化。 日历管理在工作流调度中看似是一个较小的功能&#xff0c;但对于许多企业…

信息学奥赛一本通 1014:与圆相关的计算C语言非C++

1014&#xff1a;与圆相关的计算 #include <stdio.h>int main() {// 声明并定义圆周率为常量&#xff0c;其值为3.14159const double PI 3.14159;// 声明一个双精度浮点数变量double r;// 从输入读取一个值并赋给rscanf("%lf", &r);// 计算并打印圆的直径…

cmake的下载及安装

文章目录 下载安装 下载 cmake官网下载 进入 v3.22版本目录下。或者直接点击https://cmake.org/files/v3.22/进入&#xff0c;省略上面的步骤 浏览器上下载太慢&#xff0c;这里选择在Linux上通过wget方式下&#xff0c;不过下载速度也不是它快。主要是软件所在的服务器在国…

数据质量管理软件行业分析:2023年复合增长率达到31.9%

数据质量管理软件按照一般的功能模块划分可以划分为产品信息管理、存货管理、销售管理、采购管理、生产管理、设备管理、实验室管理、品质管理、售后管理等模块&#xff0c;质量管理绝非仅仅检验&#xff0c;或者常说的批检、巡检、首检、自检等&#xff0c;质量管理是对只要影…

Linux内核参数配置说明

Linux内核参数配置说明 一、引言 Linux内核参数是操作系统运行过程中的重要配置&#xff0c;它们决定了系统资源的管理方式、性能优化以及系统安全等方面的特性。本文将详细介绍Linux内核参数的配置说明&#xff0c;并给出CentOS 7推荐的内核参数设置。 二、Linux内核参数概…

串行计时芯片D1380/D1381,2.0V~5.5V 工作电流: 2V时 与TTL 兼容,采用DIP8、SOP8封装

D1380/D1381是一个带秒、分、时、日、日期、月、年的串行时钟保持芯片,每个月多少天以及闰年能自动调节, D1380/D1381低功耗工作方式, D1380/D1381用若干寄存器存储对应信息&#xff0c;一个32.768kHz 的晶振校准时钟&#xff0c;为了使用最小弓|脚&#xff0c;D1380/D1381使用…

论文润色会被认为是代写吗知乎 神码ai

大家好&#xff0c;今天来聊聊论文润色会被认为是代写吗知乎&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 标题&#xff1a;论文润色会被认为是代写吗――探讨论文润色与代写的关系 一、引言 在学术研…

微信小程序uni-app:常用Form表单组件input、textarea、picker使用示例

目录 input 输入框textarea多行输入框picker 选择器 input 输入框 https://developers.weixin.qq.com/miniprogram/dev/component/input.htmlhttps://uniapp.dcloud.net.cn/component/input.html <inputclass"input-class"type"text"v-model"val…