更新记录
1.0.1(2026-10-28)
1.0.1:新增精确闹钟看门狗,进程被杀后 60 秒内自动复活(setWatchdogEnabled / setWatchdogInterval,最小 15 秒);修复 Android 12+ 非精确闹钟导致没有复活通道的问题;setCrashRestartUIEnabled(true) 现在能把界面一起吊回前台(1 像素透明悬浮窗取得后台起界面豁免,新增 canDrawOverlay / requestOverlayPermission,manifest 增加 SYSTEM_ALERT_WINDOW);通知点击改为直接 PendingIntent.getActivity,绕过 Android 13 的 notification trampoline 拦截;autoStart / crashRestartUI / watchdog 配置全部持久化,复活后的进程不再静默失效。普通授权版 6.66 元,交付包内含全部 Java 源码与 build.sh;无第三方 SDK、无广告、不采集任何数据。
平台兼容性
uni-app(3.8.7)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | √ | × | 5.0 | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(4.0)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | 5.0 | × | × | × |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
zeng-keeplive 安卓保活内核(全源码交付)
前台通知常驻 + 无声音乐占用 + WakeLock/WifiLock + 息屏定时任务 + 进程被杀自动复活,为 uni-app / uni-app x 提供安卓后台保活能力。
API 命名与市面上同类付费保活插件逐个对齐,换掉 import 路径即可平替迁移,6.66 元、交付包里就是全部源码、无广告无埋点。
平台兼容性
| 平台 | 版本要求 | 说明 |
|---|---|---|
| Android | 5.0+(API 21) | 全功能,见 utssdk/app-android/config.json |
| uni-app(vue2 / vue3) | HBuilderX 3.6.8+ | App-Vue / App-NVue 均可 |
| uni-app x | HBuilderX 4.x | uvue 页面请用 *Compat 方法 |
| iOS / 鸿蒙 | 不支持 | 同名方法走条件编译被剔除,不报错也不保活 |
| Web / 小程序 / 快应用 | 不支持 | 系统能力限制 |
真机实测机型:Genymotion Android 13(API 33)、MStar 安卓电视 Android 8.0(API 26),均通过。
收费与授权
- 6.66 元 / 普通授权版,交付包里就是全部源码:Java 内核(
native-core/src/6 个可读的.java)、uts 封装层、示例页、本地编译脚本一起给,不拆成「源码授权版」多收一道钱。 - 许可协议按 DCloud 插件市场标准协议执行(付费插件不再附带单独的 license 文件)。
- 授权绑定 appid 与包名,这是市场对所有付费插件的统一规则:换这两个信息需要重新购买。
- 支持市场标准的免费试用,试用期内可以打自定义基座真机验证保活效果,先试再买。
- 全部代码自研:Java 内核、uts 封装层、示例页都是本仓库从零写的,没有引用、反编译或改写任何第三方插件的代码与资源。方法名对齐其他保活插件只是为了方便迁移,不涉及任何第三方代码。
- 不含任何 SDK、广告、统计、联网上报;插件只写一个自己的 SharedPreferences 文件用于保存保活开关。
目录结构
uni_modules/zeng-keeplive/
├── package.json 插件清单(uts / API 插件)
├── readme.md 本文件(插件市场详情页)
├── changelog.md 更新记录
├── examples/
│ ├── README.md 示例工程搭建步骤
│ ├── keeplive-demo.vue uni-app(Vue)示例页
│ └── uni-app-x-demo/pages/ uni-app x 示例页(index.uvue)
├── native-core/ 原生内核(Java 源码 + 编译脚本,可独立当库使用)
│ ├── src/com/zeng/keeplive/*.java 6 个 Java 文件,全部可读
│ └── build.sh javac + jar,不依赖 gradle;产物拷进 utssdk/app-android/libs
└── utssdk/app-android/
├── index.uts KeepLive 封装层,方法名与同类保活插件对齐
├── config.json abi / minSdk
├── AndroidManifest.xml 权限、前台服务、开机广播
└── libs/zeng-keeplive-core.jar 上面那份 Java 源码的编译产物,免得使用者再编一遍
安装方式
1. 引入插件
把整个 uni_modules/zeng-keeplive 目录复制到你的 uni-app 项目根目录下的 uni_modules/ 里(HBuilderX 里直接拖进去即可)。
2. 制作自定义基座
uts 插件必须走自定义基座:
- HBuilderX 菜单 运行 → 运行到手机或模拟器 → 制作自定义调试基座
- 等待打包完成(首次会拉安卓原生依赖,需要几分钟)
- 运行 → 运行到手机或模拟器 → 运行到 Android App 基座,右上角"标准基座"切成 自定义调试基座
- 手机上如果装过旧的基座,先卸载再运行,否则签名冲突
3. 调用
// #ifdef APP
import { KeepLive } from '@/uni_modules/zeng-keeplive'
// #endif
const keep = new KeepLive()
if (keep.isRunning()) {
console.log('保活已在运行')
} else {
keep.setTitle('app')
keep.setContent('app is running')
keep.setSmallIcon('icon')
keep.setWakeLock(1, 'keeptag')
keep.setAutoStartEnable(true)
keep.onAddBackgroundCallback(res => console.log('后台运行 ' + res))
keep.onAddScrrenListenerCallback(res => console.log('屏幕开启状态 ' + res))
keep.onAddNotificationClickListener(data => console.log(data))
keep.register()
if (!keep.isIgnoringBatteryOptimizations()) {
keep.requestIgnoreBatteryOptimizations()
}
keep.onStartCSystemTimer(60, () => {
keep.acquire(1000)
})
}
uni-app x / uvue 页面用 *Compat 方法,避免在页面层处理回调类型:
onOpenNotificationSettingCompat、onAddNotificationClickListenerCompat、onAddBackgroundCallbackCompat、onAddScrrenListenerCallbackCompat、onStartCSystemTimerCompat、startCSystemTimerCompat。
4. Android 13+ 通知权限
targetSdk >= 33 时,注册前台服务前先申请通知权限,否则常驻通知显示不出来(前台服务仍然能起,但用户看不到、更容易被系统回收):
if (!keep.checkAppNotification()) {
keep.requestNotifationPer(on => {
if (on) keep.register()
})
} else {
keep.register()
}
5. 示例工程
examples/README.md 有从零新建示例页的完整菜单路径;keeplive-demo.vue 与 uni-app-x-demo/pages/index/index.uvue 是可运行的整页代码,含"被杀后自动开界面"的悬浮窗授权按钮。
用户侧建议提示
保活不是纯代码问题,ROM 的策略要用户亲手放行。第一次启动后引导用户做四件事:
- 锁定最近任务(下拉卡片加锁 / 小圆点锁图标)
- 允许自启动(
keep.startAutoStart()直接跳厂商页面) - 允许后台运行 / 无限制(
keep.goKeepLiveSetting(),失败退回goAndroidSystemAppSetting()) - 关闭省电限制(
keep.requestIgnoreBatteryOptimizations())
主要 API
生命周期:register() restart() unregister() isRunning()
通知栏:setTitle setContent setSmallIcon setLargeIcon setNotifationId setChannelId setChannelName setChannelImportance setLockscreenVisibility setAutoCancel setNotifaicationSoundEnable setShowChannelBrage setNotifationMsgGroup setNotifationExterData setGroupSummary updateNotification hideNotification cancelNotifation cancelGroupNotifaon closeNotifation
权限与设置:isHavePermision requestPermison requesMoretPermison requestNotifationPer checkAppNotification checkNotificationPer checkAppNotifationPer goNotificationSetting onOpenNotificationSetting requestIgnoreBatteryOptimizations isIgnoringBatteryOptimizations onRequestIgnoreBatteryOptimizations goKeepLiveSetting goAndroidSystemAppSetting startAutoStart startHighBattery
定时器:onStartCSystemTimer / startCSystemTimer(推荐,系统定时器)、startAleraTask + cancleAleraTask(原生闹钟)、startKeepClcokTimer + cancelKeepClcokTimer + cancelAllKeepClcokTimer(时钟)、onStartWorkerTimer + cancelWorker + setWorkerEnabled;取消统一用 cancelCSystemTimer() / clearAllCTimer()
唤醒与网络:setWakeLock(state, tag) acquire(time) releaseAcquire() wifilock() wifiunlock()
后台音乐:setBackgroundMusicEnabled(on) setMusicEnabled(en) setMusicId(id) setMusicVol(vol) setMusicInterval(t) isMusicPlaying()
其它:toBackground() hideRecentTask(hide) restartThisApp() doStartApplicationWithPackageName(pkg) setCrashRestartUIEnabled(hide) canDrawOverlay() requestOverlayPermission() crash() getLiveTime() getLiveStr() getPkgName() getNotifationId() setDebug(d) setAutoStartEnable(en)
看门狗(进程被杀后自复活):setWatchdogEnabled(on) setWatchdogInterval(seconds)
进程被杀后自动复活
插件默认开了一条独立于前台服务的复活通道:精确闹钟看门狗。
keep.setWatchdogEnabled(true) // 默认已开
keep.setWatchdogInterval(60) // 秒,最小 15;间隔越短越费电
工作原理:
register()时向 AlarmManager 钉一个setExact(ELAPSED_REALTIME_WAKEUP)闹钟,指向插件自己的广播。- 闹钟到点先检查上次是否以保活状态退出(SharedPreferences 里的
wantRunning),是则重新起前台服务,并续上下一次闹钟;进程被杀后这条链依然排在system_server里。 - 必须用精确闹钟:Android 12+ 只有"应用成功触发精确闹钟"这一条豁免允许后台启动前台服务,非精确闹钟会被拦成
ForegroundServiceStartNotAllowedException。未授予SCHEDULE_EXACT_ALARM时自动退化为非精确并打日志。 - 主动
unregister()会取消看门狗,不会复活。 - 前台服务被系统重启一次后(
onStartCommand),会重新把wantRunning与看门狗闹钟补上,避免复活链断掉。
连界面一起吊起来
服务回来不等于用户能看到应用。要让进程被杀后界面自动重开:
keep.setCrashRestartUIEnabled(true) // 默认关,需要显式打开
if (!keep.canDrawOverlay()) {
keep.requestOverlayPermission() // 跳系统"显示在其他应用上层"页
}
为什么必须悬浮窗:Android 12 起,处于 FOREGROUND_SERVICE 进程状态的后台应用直接 startActivity 会被系统拒掉,logcat 里是这句:
Background activity start [callingPackage: ...; callingUidProcState: FOREGROUND_SERVICE;
callingUidHasAnyVisibleWindow: false; allowBackgroundActivityStart: false; ...]
Abort background activity starts from 10088
拿到悬浮窗授权后,插件在起界面前先钉一个 1 像素透明悬浮窗,让系统认为本 uid "有可见窗口"(callingUidHasAnyVisibleWindow 变 true),界面就能起来,2 秒后自动撤掉这个占位窗口。实测(Genymotion Android 13):进程自杀 → 2.75 秒后 Displayed …MainActivity,焦点回到应用;同一台机器上把悬浮窗权限撤掉,就停在桌面起不来。
不想申请悬浮窗的话,保持 setCrashRestartUIEnabled(false),进程照样复活,只是回到前台需要用户点一下常驻通知。
权限说明
| 权限 | 用途 | 必需 |
|---|---|---|
FOREGROUND_SERVICE(+ MEDIA_PLAYBACK/DATA_SYNC) |
常驻前台服务与通知 | 是 |
POST_NOTIFICATIONS |
Android 13+ 显示常驻通知 | 是 |
WAKE_LOCK |
息屏后 CPU 不被挂起 | 是 |
SCHEDULE_EXACT_ALARM / USE_EXACT_ALARM |
精确闹钟定时器与看门狗 | 是(缺失时自动降级为非精确) |
RECEIVE_BOOT_COMPLETED |
开机自启 | 否,setAutoStartEnable(false) 可关 |
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS |
引导用户进省电白名单 | 否 |
SYSTEM_ALERT_WINDOW |
仅 setCrashRestartUIEnabled(true) 时用来拿后台起界面豁免 |
否,默认关闭 |
ACCESS_WIFI_STATE / CHANGE_WIFI_STATE |
wifilock() 保持 WiFi 不休眠 |
否 |
实测数据(Genymotion Android 13 / API 33)
| 验证项 | 结论 |
|---|---|
| 前台服务常驻 | 通过,isForeground=true foregroundId=6234542,通知 importance=3 |
| 通知不可滑掉 | 通过,带 FLAG_NO_CLEAR,下拉清除后仍在 |
| 息屏后台定时 | 通过,息屏 95 秒内 3 秒周期定时器连续 36 次、编号无断档 |
| 进程被杀后服务复活 | 通过,进程死亡 → 1.04 秒内由系统重建(AMS start-requested) |
| 看门狗闹钟 | 通过,dumpsys alarm 可见 WATCHDOG 待触发记录,复活后自动续订 |
| 被杀后自动重开界面 | 通过,2.75 秒后 Displayed …MainActivity;撤掉悬浮窗权限则起不来 |
| 通知点击回跳 | 通过,contentIntent 用直接 Activity,绕过 Android 13 trampoline 拦截 |
| 低版本兼容 | 通过,Android 8.0(API 26)电视盒子:前台服务 + 看门狗 + 崩溃复活均可用 |
默认值
| 配置 | 默认值 | 说明 |
|---|---|---|
| 通知 id | 6234542 |
与付费插件一致;换 id 会新增一条通知,同 id 是更新 |
| channelId | keeplive |
channel 一经创建不可改配置,改文案请换新 channelId |
| channelName | 保活 |
|
| channelImportance | 3 |
IMPORTANCE_DEFAULT,常驻通知不响 |
| WakeLock tag | keeptag |
PARTIAL_WAKE_LOCK |
| musicId | music |
对应 res/raw/music.mp3;缺资源时自动改用 AudioTrack 静音buffer |
| musicInterval | 6000 |
内部按不超过 3000ms 的节拍回填静音数据 |
| 开机自启 | 默认开启 | 仅在保活运行过(wantRunning)时开机拉起;setAutoStartEnable(false) 可关闭 |
| 看门狗 | 开启,60 秒 | 进程被杀后自复活;setWatchdogInterval(秒) 最短 15 |
| 崩溃重启界面 | 默认关闭 | 打开后进程复活时连界面一起吊起来,需要悬浮窗授权 |
与同类付费保活插件的对比
| 项 | 本插件 | 某付费保活插件(29.99 元起) |
|---|---|---|
| 平台 | Android | Android / iOS / 鸿蒙 |
| 价格 | 6.66 元,普通授权版即含全部源码 | 29.99 元起,源码版 888.88 元 |
checkAppNotifationPer |
回调返回 boolean | 文档写数值 |
startMicSevice |
保留签名,空实现返回 false(不伪造录音占用) | 录音通道保活 |
hideRecentTask(true) |
用 finishAndRemoveTask(),会结束当前 Activity |
同为结束任务 |
| Android 侧 aar 源码 | 全部为可读 Java 源码 + build.sh |
源码版才给 |
已知限制(实话实说)
- iOS / 鸿蒙未实现。调用这些平台的同名方法会走条件编译被剔除,不会报错,但也不会保活。
- 强停无解:设置里"强行停止"或
am force-stop会把应用打上 stopped 标记,闹钟、广播、服务全部作废,任何插件都复活不了,只能用户重新点开图标。 - 划掉最近任务在原生系统上不会杀前台服务进程,AOSP 也不会给前台服务回调
onTaskRemoved(mStartRequested || mForegroundCount > 0时直接跳过)。所以复活靠的是看门狗闹钟这条独立通道,不是onTaskRemoved。 - 进程复活后配置回到默认值:
CONFIG只存在内存里,通知标题/内容、定时器、debug都会回落,需要在Application或onLaunch里重新register()并挂回调。看门狗只负责把服务和进程拉回来。(autoStart、crashRestartUI、watchdogEnabled、watchdogInterval这几个开关已做持久化,复活后会自动读回。) - 自动重开界面依赖悬浮窗授权(Android 12+)。没有
SYSTEM_ALERT_WINDOW时系统会打Abort background activity starts,进程和服务能复活,但界面起不来,只能靠用户点常驻通知;国产 ROM 的悬浮窗开关还在各自的权限页里,要用户手动放行。 - JS 层的定时器回调在进程真的被杀死后不会自动恢复;服务会自启,但要在
onLaunch里重新register()并重新挂定时器。 - 点通知回跳:Android 12+ 拦截通知/闹钟这类 trampoline 起界面,所以通知的
contentIntent直接是PendingIntent.getActivity。界面已经在前台时不会再派发一次onAddNotificationClickListener回调(系统只是把原任务顶到前台,没有新的 Activity)。 - Android 12+ 后台启动前台服务受限,开机自启走了"先记状态、回前台再补注册"的路径;系统仍可能拒绝第一次后台拉起。
- 任何保活手段都不能保证 100% 不被杀。国产 ROM 的极端省电策略、用户手动强停、低内存回收都在系统权限内。
更新记录
见 changelog.md。
交流反馈
问题请提在插件详情页"插件交流"区或源码仓库的 Issue;插件本身不含联网逻辑,不会收集任何使用信息。
联系方式在 package.json 的 dcloudext.contact 里填写后再上传,市场详情页会自动显示。

收藏人数:
购买普通授权版(
试用
赞赏(0)
下载 2
赞赏 0
下载 12723332
赞赏 1958
赞赏
京公网安备:11010802035340号