为何我的Broadcast Receiver重启时触发?需仅响应BOOT_COMPLETED事件
解决重启时Broadcast Receiver非预期触发的问题
看起来你遇到的问题是:设备重启时,你的Broadcast Receiver里的通用逻辑(第一个Toast)也会被执行,但你只希望在收到BOOT_COMPLETED广播(设备重启完成)时运行对应的分支代码。下面是针对性的解决方案:
1. 精简Receiver的广播监听范围
首先检查你的Manifest配置,确保这个Receiver只监听BOOT_COMPLETED广播,避免被其他系统广播意外触发。正确的注册应该是这样的:
<!-- 确保权限声明正确 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <receiver android:name=".YourBootReceiverClass"> <intent-filter> <!-- 只保留BOOT_COMPLETED的action,移除其他无关的广播监听 --> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
这样配置后,你的Receiver只会在设备重启完成时被唤醒,不会响应其他广播。
2. 优化onReceive的逻辑判断
你当前的代码在判断action之前就执行了第一个Toast,这会导致只要Receiver被触发(哪怕是其他广播),这个Toast都会显示。把所有逻辑都放到action判断分支里,就能确保只有重启完成时才执行:
@Override public void onReceive(Context context, Intent intent) { // 仅当收到BOOT_COMPLETED广播时执行逻辑 if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { Toast.makeText(context,"Works",Toast.LENGTH_LONG).show(); Toast.makeText(context,"works _ second",Toast.LENGTH_LONG).show(); } }
这里建议使用Intent.ACTION_BOOT_COMPLETED常量代替硬编码的字符串,避免拼写错误。
3. 额外注意点
- 从Android 8.0(API 26)开始,系统对静态注册的Receiver有广播限制,但
BOOT_COMPLETED属于允许静态注册的例外广播,所以你的配置是有效的。 - 测试时,确保手机已经完成重启(进入桌面后),因为
BOOT_COMPLETED广播是在系统启动流程完全结束后才发送的。
内容的提问来源于stack exchange,提问作者Hatay Berkay Işıkoğlu
相关产品推荐
相关产品推荐

