uni-app无法实现进程永驻,须按平台规范使用前台服务(Android需通知+权限)和UIBackgroundModes(iOS需原生调用配合),并手动引导用户关闭厂商省电限制。

uni-app 无法实现“后台常驻服务保活”意义上的进程永驻——这是安卓和 iOS 系统级限制,不是框架能绕过的。真正可行的是:按业务场景申请系统允许的后台能力,并用原生插件启动合规前台服务。
Android 必须用前台服务 + 通知,否则 10 分钟内被杀
从 Android 8.0(API 26)起,startService 后台服务在应用退到后台后会被系统强制停止。唯一稳定方案是调用 startForeground 启动前台服务,并绑定一个持续可见的通知。
- 通知必须有
channelId和channelName,且需在AndroidManifest.xml中提前声明(Android 8.0+ 强制要求) - 通知内容不能为空白或仅含图标,至少要有
title和text,否则部分厂商(如华为、小米)会静默屏蔽 - 不要试图隐藏通知——系统会将“无通知的前台服务”识别为异常行为,加速回收
- 使用插件如
lqm-keepalive或Keep_Alive时,务必检查其AndroidManifest.xml是否已声明FOREGROUND_SERVICE权限
iOS 后台能力必须显式声明 UIBackgroundModes
iOS 不允许任何未声明的后台行为。切后台后立即暂停 JS 执行、网络请求、定时器,除非你在 manifest.json 中正确配置了 UIBackgroundModes 并配合原生调用。
- 只填
"UIBackgroundModes":"audio"不够——你还得在代码中调用plus.audio.start()或播放一段静音音频流,否则系统不认为你在“播放音频” - 填
"location"后,必须调用plus.geolocation.watchPosition({background: true}),且传入enableHighAccuracy: true,否则定位不会在后台持续触发 -
fetch模式不可控:系统决定何时唤醒,间隔不固定,不能用于实时消息或位置上报 - 真机调试必须打「自定义基座包」,普通基座包不包含后台能力配置,本地运行永远失败
厂商适配比代码更重要:小米/华为/OPPO 需手动开权限
即使前台服务正常启动,主流国产 ROM 仍会二次限制:锁屏后 5–15 分钟主动冻结进程。这不是 bug,是厂商策略。
- 小米:进「设置 → 应用设置 →
你的App→ 电量与性能 → 省电策略 → 设为「无限制」;再开「自启动」和「关联启动」 - 华为:「手机管家 → 应用启动管理 → 找到你的App → 关闭「自动管理」→ 手动启用「允许后台活动」
- OPPO/vivo:类似路径,重点找「电池优化」和「后台高耗电提醒」开关
- 这些设置无法代码自动开启,必须在首次启动时弹窗引导用户跳转设置页,用
plus.android.invokeMethod调起对应 intent
别碰双进程/反射/JobIntentService 这类过时方案
网上流传的“双进程守护”“Activity 轮询拉活”“反射 AMS”等方法,在 Android 9+ 上基本失效,且违反 Google Play 政策,上架必拒。
-
JobIntentService是兼容旧版的封装,底层仍是受限的JobScheduler,延迟高、触发不可靠,不适合定位或 IM 场景 - 所有依赖
AlarmManager.setRepeating的方案在 Android 6+ 已被大幅降频,息屏后几乎不触发 - 试图用
AccessibilityService监听自身状态属于滥用权限,国内厂商会直接禁止安装 - 真正有效的只有两种路径:前台服务(强感知、低延迟) + WorkManager(弱感知、可延迟)
最容易被忽略的一点:保活效果和「用户是否正在使用」强相关。系统会根据前台服务活跃度、通知交互频率、位置上报精度动态调整资源配额。一个从不更新通知文本、从不回调定位结果的服务,哪怕挂着前台,几小时后照样被冻结。保活不是设个参数就完事,它是一套持续的状态同步机制。


















