- 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)。