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

安卓如何判断系统是否杀死前台服务?MIUI12下服务被杀如何重启

MIUI系统锁屏服务被杀无onDestroy回调解决方案

核心原因

MIUI的定制化后台进程管理逻辑中,系统出于内存回收、省电策略主动终止服务进程时,会直接销毁整个进程,不会回调onDestroy方法,因此写在该方法内的重启逻辑完全无法生效。同时原生的START_STICKY保活机制在MIUI的严格后台限制下,大概率会失效。

服务存活判断方法

可以通过系统ActivityManager获取当前运行的服务列表,判断目标服务是否存活:

public static boolean isLockServiceRunning(Context context) {
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : am.getRunningServices(Integer.MAX_VALUE)) {
        if (LockScreenService.class.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

无onDestroy场景下的服务重启方案

  • 双进程互相守护
    你已经为锁屏服务配置了独立子进程:ServiceProcess,可以再新增一个轻量的守护进程服务,两个进程各自监听对方的存活状态,任意一方被杀,另一方立即调用startService拉起对应服务。
  • 系统广播被动拉活
    注册高优先级的系统广播接收器,监听ACTION_BOOT_COMPLETED(开机完成)、ACTION_POWER_CONNECTED/ACTION_POWER_DISCONNECTED(充电状态变化)、ACTION_USER_PRESENT(解锁完成)等高频触发的系统广播,每次收到广播时调用上面的存活判断方法,服务不在运行就直接拉起。
  • JobScheduler定时巡检拉活
    Android 5.0及以上系统可以使用系统官方的JobScheduler组件配置定时任务,间隔1~5分钟巡检一次锁屏服务的存活状态,服务被杀死就自动重启。该组件是系统级调度接口,被MIUI拦截的概率远低于自定义后台服务。
    简单配置示例:
    // 配置Job任务
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
        JobInfo jobInfo = new JobInfo.Builder(1001, new ComponentName(context, LockJobService.class))
                .setPeriodic(3 * 60 * 1000) // 每3分钟执行一次
                .setPersisted(true) // 开机后自动恢复任务
                .build();
        jobScheduler.schedule(jobInfo);
    }
    
    清单文件配置JobService:
    <service
        android:name=".LockJobService"
        android:permission="android.permission.BIND_JOB_SERVICE"
        android:exported="true"/>
    
  • 引导用户开启MIUI专属权限
    所有保活逻辑的前提是获取MIUI的后台运行权限,首次启动应用时需要主动引导用户开启以下权限:
    • 自启动权限:允许应用在后台被自动拉起
    • 省电策略:设置为无限制,避免系统省电逻辑杀死服务
    • 锁屏显示权限:保障锁屏功能正常触发
  • 优化服务自身逻辑
    移除onDestroy内的重启逻辑,改为在onStartCommand回调中校验广播接收器、前台通知的状态,异常就重新初始化,确保服务被拉起后功能正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:54:03