You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 11设备未收到RECEIVE_BOOT_COMPLETED广播问题排查求助

Android 11 无法接收开机广播的排查与解决

结合你提供的配置、代码和日志信息,我帮你梳理几个可能遗漏的关键点,这些都是Android 11及以上版本常见的开机广播坑:

1. 应用必须被用户手动启动过一次

Android 11开始对隐式广播做了更严格的限制,即使BOOT_COMPLETED在系统白名单里,新安装的应用如果从未被用户手动打开过,系统不会发送开机广播给它

解决方法:先手动打开你的应用一次,之后再重启设备测试。

2. 清理冗余的Intent Filter配置

你的接收器里加了<category android:name="android.intent.category.DEFAULT"/>,这个category是给显式Intent或者需要启动Activity的广播用的,对于BOOT_COMPLETED这类系统广播完全多余,反而可能影响广播匹配。另外android.intent.action.BOOT是非常老旧的action,现在已经不再使用,建议删掉。

修改后的Manifest接收器配置:

<receiver android:name=".BootReceiver" android:enabled="true" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

3. 检查厂商系统的自启动权限拦截

很多定制系统(比如三星、小米、华为)有自启动管理机制,即使你配置了系统权限,也需要手动开启应用的自启动权限,否则系统会直接拦截开机广播。

解决方法:

  • 打开手机的「设置」→「应用管理」→找到你的应用→「权限」→「自启动」
  • 开启「允许自启动」选项

4. 日志过滤更精准

你用"boot"关键词过滤日志,很容易被其他应用的日志淹没。直接过滤你的接收器日志标签会更准确:

adb logcat -s BootReceiver

这样只会显示你自己的BootReceiver输出的日志,不会被其他应用的日志干扰。

5. 唤醒锁的规范使用(可选,但推荐)

虽然你加了WAKE_LOCK权限,但如果onReceive里有后续操作(哪怕只是日志),最好短暂持有唤醒锁防止设备在广播处理时休眠。修改你的接收器代码:

class BootReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        // 获取唤醒锁,持有10秒足够完成操作
        val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
        val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "BootReceiver:WakeLock")
        wakeLock.acquire(10000L) // 10秒超时自动释放

        Log.i("BootReceiver", "Boot event received: ${intent.action}")

        wakeLock.release()
    }
}

验证步骤

  1. 手动打开你的应用一次,确保应用被系统标记为“已启动过”
  2. 重启设备
  3. 执行adb logcat -s BootReceiver查看日志,应该能看到你的输出

内容的提问来源于stack exchange,提问作者Jim Clermonts

火山引擎 最新活动