高版本中,动态注册应用安装、卸载广播,但无法收到

67 阅读1分钟
  • Android 8.0+ 未动态注册:静态注册该广播失效,仅动态注册(且添加 package 数据 scheme)才能接收。
  • 接收者未配置 dataScheme="package":广播的 data 格式为 package:包名,未声明此 scheme 会过滤掉该广播
  • Android 11(API 30)及以上新增了「软件包可见性」限制,默认情况下,你的应用无法 “看到” 其他应用的安装状态,导致收不到广播。

解决方法:在 AndroidManifest.xml 中添加权限

<!-- Android 11+ 必须添加,允许监听其他应用安装/卸载 -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> 
<!-- 若不想申请 QUERY_ALL_PACKAGES(Google Play 审核严格),可指定允许的应用包名(仅针对已知应用) --> 
<queries> 
    <package android:name="com.example.testapp" />
    <!-- 你要监听的应用包名,多个可加多个 --> 
    <intent> <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
    </intent>
</queries>

使用adb命令可以模拟系统发送广播

adb shell am broadcast -a android.intent.action.PACKAGE_ADDED -d package:com.example.testapp

-a 是 --action 的缩写,用于指定广播的 动作(Action) ,对应代码中 Intent.setAction(String action)。

-d 是 --data 的缩写,用于指定广播的 数据 URI(Uniform Resource Identifier) ,对应代码中 Intent.setData(Uri uri)