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

如何让Android Service在常规场景下持续运行?(BeeWare开发)

如何让独立进程的前台Service在清除所有最近应用时保持运行(Android 13 + 小米设备)

核心问题定位

你的前台服务在划掉主应用时能正常运行,但清除所有最近应用时被杀死,主要原因有两点:

  1. 小米等国产ROM的后台任务管控逻辑,会将同一应用组的进程(即使是独立进程)在清除最近应用时一并终止;
  2. 当前Service配置缺少关键属性,未明确告知系统该服务无需随任务移除而停止。

针对性优化方案

1. 配置Service的stopWithTask属性

在Manifest的Service标签中添加android:stopWithTask="false",明确告知系统:当用户清除最近应用任务时,不要停止该Service。

修改后的Service配置:

<service 
    android:name="org.beeware.android.MyService" 
    android:foregroundServiceType="remoteMessaging"
    android:exported="false"
    android:process=":tcp_service_process"
    android:icon="@mipmap/ic_launcher_round"
    android:stopWithTask="false"> <!-- 新增属性 -->
</service>

2. 完善前台通知的合规性

Android 13及以上版本对前台服务的通知有严格要求,确保通知能正常显示是服务保持运行的前提:

  • 动态申请POST_NOTIFICATIONS权限:在启动Service前,必须通过代码动态请求该权限,否则通知无法显示,前台服务会被系统判定为违规而终止。
  • 提升通知渠道重要性:将通知渠道的重要性从IMPORTANCE_DEFAULT改为IMPORTANCE_LOW或更高,避免通知被系统隐藏:
// 在onCreate的通知渠道创建代码中修改
NotificationChannel serviceChannel = new NotificationChannel(
    ChannelID, "My Service Channel", NotificationManager.IMPORTANCE_LOW);

3. 增强Service的重启能力

即使做了上述配置,极端情况下系统仍可能杀死服务,添加兜底重启机制:

  • 在onDestroy方法中发送重启请求,注意区分用户手动停止和系统强制杀死的场景:
private boolean isManualStop = false;

// 添加一个方法供手动停止服务时调用
public void stopServiceManually() {
    isManualStop = true;
    stopForeground(true);
    stopSelf();
}

@Override
public void onDestroy() {
    super.onDestroy();
    // 原有停止Server的代码...
    
    // 仅在非手动停止时重启服务
    if (!isManualStop) {
        Intent restartIntent = new Intent(this, MyService.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(restartIntent);
        } else {
            startService(restartIntent);
        }
    }
}

4. 适配小米设备的后台管控

小米ROM的后台管控非常严格,必须手动开启以下权限才能让服务稳定运行:

  • 自启动权限:设置 → 应用设置 → 应用管理 → 你的应用 → 权限管理 → 自启动 → 允许
  • 无限制后台运行:设置 → 应用设置 → 应用管理 → 你的应用 → 省电策略 → 选择「无限制」
  • 后台弹出界面权限:设置 → 应用设置 → 应用管理 → 你的应用 → 权限管理 → 后台弹出界面 → 允许(确保通知能正常显示)

额外注意事项

  • 确保startForeground在Service启动后5秒内调用(你的代码已经符合要求);
  • onStartCommand返回START_STICKY是正确的选择,系统会在资源充足时重启服务;
  • 避免Service占用过多资源,即使内存充足,系统也可能因其他策略终止异常进程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:24:51