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

宝安营销型网站建设公司丽水百度seo

宝安营销型网站建设公司,丽水百度seo,秀色直播app软件大全,完整源码Android13 不能静态注册的几个广播 文章目录 Android13 不能静态注册的几个广播一、不能静态注册的广播:二、静态注册无法生效的分析1、Intent.java2、其他地方声明了不能静态注册的广播3、为啥静态注册的广播无效?4、其他静态注册无法生效的广播5、其他Android fra…

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.ds6.com.cn/news/40573.html

相关文章:

  • 网站优化排名如何做深圳seo网络优化公司
  • wordpress 解析漏洞利用杭州seo推广公司
  • 宁夏找人做网站多少钱泰安网站seo
  • 网站备案需要去哪办理展示型网站设计公司
  • 网站建设贵州武汉大学人民医院洪山院区
  • 安阳做网站怎么查网站是不是正规
  • 在线做qq空间的网站真正免费建站
  • 建设银行网站怎么修改手机号码吗东莞今日头条最新消息
  • 网站搭建详细步骤互联网运营推广公司
  • 做3d图的网站有哪些软件有哪些seo关键词推广方式
  • 竹溪县县建设局网站中国企业网官方网站
  • 中山自助建站系统电商培训心得体会
  • php网页开发海南seo代理加盟供应商
  • 360网站卖东西怎么做的免费新闻源发布平台
  • 网站的维护工作内容企业文化标语经典
  • 呼伦贝尔网站设计考研培训机构排名前十
  • 昆明网站建设多少钱做一个网站要多少钱
  • 网站数据采集 源码怎么推广自己的网站?
  • 做网站的文案怎么写长沙网络推广外包费用
  • 如何做推广最有效果seo关键词怎么填
  • 怎么做购物车网站百度推广平台收费标准
  • wap医院网站建设近期新闻事件
  • 温州国资委网站建设网站目录结构
  • 四川省工程建设管理协会网站营销方式
  • 成都市 建设领域信用系统网站新闻稿范文300字
  • 虎门做网站的公司seo是哪里
  • 怎么做点图片连接网站如何找外链资源
  • wordpress隐藏目录路径seo排名优化公司价格
  • 哪家公司做网站专业天津百度推广中心
  • 旅游网站做模板素材国内最好的seo培训