You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ACTION_BOOT_COMPLETE需调用unregisterReceiver()吗?Applock开机服务重启问题求助

解决Applock重启后服务未启动的问题及Broadcast Receiver相关疑问

首先,咱们先揪出你代码里的核心问题:你用PendingIntent.getBroadcast()来准备启动MyService,但这个方法是用来创建广播类型的PendingIntent的,而你的目标是启动Service——这完全不对!系统会尝试把这个Intent当作广播发送,而非启动服务,这就是重启后服务没起来的关键原因之一。

第一步:修正Boot Broadcast Receiver的代码

把PendingIntent.getBroadcast()换成PendingIntent.getService(),这样系统才会正确触发Service的启动。另外,考虑到Android 8.0+的后台启动限制,最好加上前台服务的适配(避免被系统强制杀死)。

修正后的Boot_Com代码:

public class Boot_Com extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent serviceIntent = new Intent(context, MyService.class);
            // 适配Android 8.0+的后台启动限制
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context.startForegroundService(serviceIntent);
            } else {
                context.startService(serviceIntent);
            }
            // 如果需要延迟启动(比如等系统完全就绪),用下面的AlarmManager代码,注意用getService
            // AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            // PendingIntent alarmIntent = PendingIntent.getService(context, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
            // alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 10000, alarmIntent);
        }
    }
}

第二步:分析IntentReceiverLeaked错误

这个错误提示的是Google的JibeService(RCS相关服务)泄露了Receiver,和你的Boot_Com本身没关系。大概率是你的MyService里动态注册了某个Broadcast Receiver,但在Service销毁时没有调用unregisterReceiver()。比如在onCreate()里注册了Receiver,却没在onDestroy()里注销,就会出现这种泄露问题。

解决方法:检查MyService的代码,找到所有动态注册的Receiver,确保在onDestroy()中对应注销:

@Override
public void onDestroy() {
    super.onDestroy();
    // 替换成你实际注册的Receiver实例
    if (myRegisteredReceiver != null) {
        unregisterReceiver(myRegisteredReceiver);
    }
}

关于ACTION_BOOT_COMPLETED触发时是否需要调用unregisterReceiver()?

完全不需要!你的Boot_Com是静态注册的Broadcast Receiver(你肯定在Manifest里注册了它来接收BOOT_COMPLETED广播),这类Receiver的生命周期由系统管理:广播到来时系统实例化它并调用onReceive(),方法执行完毕后系统会自动回收这个实例,不需要你手动调用unregisterReceiver()。只有动态注册的Receiver(比如在Activity/Service里用registerReceiver()注册的)才需要在组件销毁时手动注销。

额外注意事项

  1. 确保在Manifest中添加正确的权限和Receiver注册:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver android:name=".Boot_Com">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
  1. Android 12+需要申请POST_NOTIFICATIONS权限,因为前台服务必须显示通知。
  2. 部分厂商定制ROM会限制APP自启动权限,需要在系统设置里给你的Applock开启自启动,否则BOOT_COMPLETED广播可能无法触发。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:59:03