更新记录
1.0.0(2026-08-06)
初始版本发布
平台兼容性
uni-app x(5.15)
| Chrome |
Safari |
Android |
Android插件版本 |
iOS |
鸿蒙 |
微信小程序 |
| × |
× |
5.0 |
1.0.0 |
× |
× |
× |
Sh-KeepAlive 插件使用说明
Android 保活服务插件,支持前台 Service 保活、WorkManager 周期守护、广播监听自动恢复、桌面 AppWidget 组件(4×2 + 2×2)、通知栏自定义布局、权限管理、最近运行应用查询。
平台支持:仅 Android(最低 API 21)
版本:v1.0.0
一、功能概述
| 模块 |
说明 |
| 保活控制 |
前台 Service(START_STICKY)+ WakeLock + MediaSession 多重保活 |
| 周期守护 |
WorkManager 每 15 分钟检查一次,Service 被杀死后自动重启 |
| 广播监听 |
监听网络变化、电源插拔事件,自动恢复 Service |
| 通知栏 |
支持普通常驻通知和自定义布局通知两种样式 |
| 桌面组件 |
长方形 4×2 + 正方形 2×2 AppWidget,支持日志列表和按钮交互 |
| 权限管理 |
检查/跳转通知权限、电池优化白名单、使用情况访问权限 |
| 应用查询 |
获取最近运行的应用列表(需使用情况访问权限) |
二、使用方法
import {
startKeepAlive,
stopKeepAlive,
isKeepAliveRunning,
// ... 其他 API
} from '@/uni_modules/sh-keepalive'
所有 API 为函数式导出,直接调用即可。
三、快速开始
App 启动自动保活
// #ifdef APP-ANDROID
import {
startKeepAlive,
stopKeepAlive,
isKeepAliveRunning
} from '@/uni_modules/sh-keepalive'
onLaunch(() => {
if (!isKeepAliveRunning()) {
startKeepAlive()
}
})
// #endif
通知配置
import {
setNotifyStyle,
setNotifyNormalText,
setNotifyCustomLeft,
setNotifyBottomText,
addNotifyLog,
refreshNotification
} from '@/uni_modules/sh-keepalive'
// 普通通知样式
setNotifyStyle("normal")
setNotifyNormalText("保活服务", "服务运行中...")
refreshNotification()
// 自定义布局样式
setNotifyStyle("custom")
setNotifyCustomLeft("今日收款(元)", "128.50", "共 5 笔")
setNotifyBottomText("去查看历史")
refreshNotification()
// 添加日志到自定义通知
addNotifyLog("微信支付收款 +100.00", "10:30:25", "#00AA00")
refreshNotification()
桌面组件
import {
refreshAllWidgets,
refreshWidgetRect,
refreshWidgetSquare,
setWidgetRectConfig,
setWidgetSquareConfig,
addWidgetLogRect,
addWidgetLogSquare,
onWidgetRectClick,
onWidgetSquareClick
} from '@/uni_modules/sh-keepalive'
// 配置组件外观
setWidgetRectConfig("收款助手", "", "停止收款", "#FF5252", "今日已收 5 笔")
refreshWidgetRect()
// 添加日志(icon 支持空字符串/网络URL/文件路径/drawable资源名)
addWidgetLogRect("", "微信支付", "收款 +0.02 元", "成功", "#00AA00")
addWidgetLogSquare("", "银行转账", "到账 +500.00 元", "到账", "#4CAF50")
refreshAllWidgets()
// 自定义组件按钮行为
onWidgetRectClick(() => {
console.log("4x2 组件按钮被点击")
})
onWidgetSquareClick(() => {
console.log("2x2 组件按钮被点击")
})
// 恢复默认行为(切换保活开关)
onWidgetRectClick(null)
权限管理
import {
isNotificationEnabled,
openNotificationSettings,
isIgnoringBatteryOptimizations,
requestIgnoreBatteryOptimizations,
hasUsageStatsPermission,
openUsageAccessSettings
} from '@/uni_modules/sh-keepalive'
// 检查通知权限
if (!isNotificationEnabled()) {
openNotificationSettings()
}
// 检查电池优化白名单
if (!isIgnoringBatteryOptimizations()) {
requestIgnoreBatteryOptimizations()
}
// 检查使用情况访问权限
if (!hasUsageStatsPermission()) {
openUsageAccessSettings()
}
最近运行应用
import {
hasUsageStatsPermission,
openUsageAccessSettings,
getRecentTasks
} from '@/uni_modules/sh-keepalive'
// 需要 PACKAGE_USAGE_STATS 权限
if (!hasUsageStatsPermission()) {
openUsageAccessSettings()
} else {
const tasks = getRecentTasks(10)
for (let i = 0; i < tasks.length; i++) {
console.log(tasks[i].appName + " - " + tasks[i].packageName)
}
}
四、API 参考
保活控制
| 方法名 |
参数 |
说明 |
返回值 |
startKeepAlive() |
— |
启动保活 Service,自动创建通知渠道和常驻通知 |
void |
stopKeepAlive() |
— |
停止保活 Service |
void |
restartKeepAlive() |
— |
重启保活 Service |
void |
isKeepAliveRunning() |
— |
检查保活 Service 是否运行中 |
boolean |
权限管理
| 方法名 |
参数 |
说明 |
返回值 |
isNotificationEnabled() |
— |
检查通知权限是否已开启 |
boolean |
openNotificationSettings() |
— |
跳转系统通知权限设置页 |
void |
isIgnoringBatteryOptimizations() |
— |
检查是否已加入电池优化白名单 |
boolean |
requestIgnoreBatteryOptimizations() |
— |
跳转电池优化白名单设置页 |
void |
hasUsageStatsPermission() |
— |
检查使用情况访问权限 |
boolean |
openUsageAccessSettings() |
— |
跳转使用情况访问权限设置页 |
void |
通知设置
| 方法名 |
参数 |
说明 |
返回值 |
setNotifyStyle(style) |
style: string — "normal" 或 "custom" |
设置通知样式 |
void |
setNotifyNormalText(title, content) |
title: string, content: string |
设置普通通知的标题和内容 |
void |
setNotifyCustomLeft(title, amount, count) |
title: string, amount: string, count: string |
设置自定义布局左侧汇总数据 |
void |
setNotifyBottomText(text) |
text: string |
设置自定义布局底部文本 |
void |
addNotifyLog(content, time, color?) |
content: string, time: string, color?: string |
添加通知日志,color 默认 "#00AA00" |
void |
clearNotifyLogs() |
— |
清空所有通知日志 |
void |
refreshNotification() |
— |
刷新通知(配置变更后调用) |
void |
桌面组件刷新
| 方法名 |
参数 |
说明 |
返回值 |
refreshWidgetRect() |
— |
刷新长方形 4×2 组件 |
void |
refreshWidgetSquare() |
— |
刷新正方形 2×2 组件 |
void |
refreshAllWidgets() |
— |
刷新所有桌面组件 |
void |
组件配置
| 方法名 |
参数 |
说明 |
返回值 |
setWidgetRectConfig(title, icon, btnText, btnColor, btnTextUnder) |
title: string — 组件标题
icon: string — 图标资源名,空字符串使用 App 图标
btnText: string — 按钮文字
btnColor: string — 按钮颜色,如 "#FF5252"
btnTextUnder: string — 按钮下方文字 |
配置长方形 4×2 组件 |
void |
setWidgetSquareConfig(title, icon, btnText, btnColor) |
title: string — 组件标题
icon: string — 图标资源名,空字符串使用 App 图标
btnText: string — 按钮文字
btnColor: string — 按钮颜色 |
配置正方形 2×2 组件 |
void |
组件日志
| 方法名 |
参数 |
说明 |
返回值 |
addWidgetLogRect(icon, title, content, tagText, tagColor) |
icon: string — 图标(空字符串/网络URL/文件路径/drawable资源名)
title: string — 日志标题
content: string — 日志内容
tagText: string — 标签文本
tagColor: string — 标签颜色 |
添加长方形组件日志 |
void |
clearWidgetLogsRect() |
— |
清空长方形组件日志 |
void |
addWidgetLogSquare(icon, title, content, tagText, tagColor) |
同 addWidgetLogRect |
添加正方形组件日志 |
void |
clearWidgetLogsSquare() |
— |
清空正方形组件日志 |
void |
getClickLogs(count) |
count: Int — 最多返回条数 |
获取组件按钮点击日志 |
Array<string> |
clearClickLogs() |
— |
清空点击日志 |
void |
组件回调
| 方法名 |
参数 |
说明 |
返回值 |
onWidgetRectClick(callback) |
callback: (() => void) \| null — 传 null 恢复默认行为 |
设置长方形组件按钮点击回调 |
void |
onWidgetSquareClick(callback) |
callback: (() => void) \| null — 传 null 恢复默认行为 |
设置正方形组件按钮点击回调 |
void |
应用查询
| 方法名 |
参数 |
说明 |
返回值 |
getRecentTasks(maxCount) |
maxCount: Int — 最多返回条数 |
获取最近运行的应用列表(需 PACKAGE_USAGE_STATS 权限) |
Array<{packageName: string, appName: string, lastTimeUsed: string}> |
五、桌面组件交互说明
| 操作 |
效果 |
| 点击组件图标 |
打开宿主 App |
| 点击组件按钮 |
切换保活开关(默认)或触发自定义回调 |
| 组件日志列表 |
实时显示最新 10 条日志 |
如何添加桌面组件:在桌面长按 → 选择"添加小部件" → 搜索"自启动助手" → 选择 4×2 或 2×2 尺寸拖到桌面。
六、通知栏交互说明
| 通知样式 |
说明 |
| 普通常驻 |
显示标题 + 内容文本,点击打开 App |
| 自定义布局 |
左侧汇总面板(标题/金额/笔数)+ 右侧最新日志(最多 2 条)+ 底部引导文字 |
七、保活架构
┌─────────────────────────────────────┐
│ KeepAliveService (前台 Service) │
│ - START_STICKY(被杀自动重建) │
│ - WakeLock(PARTIAL_WAKE_LOCK) │
│ - MediaSession(音频焦点) │
│ - 前台常驻通知(普通/自定义布局) │
├─────────────────────────────────────┤
│ KeepAliveWorker(WorkManager) │
│ - 每 15 分钟检查 Service 是否存活 │
│ - 存活则无操作,死亡则自动重启 │
├─────────────────────────────────────┤
│ KeepAliveReceiver(广播监听) │
│ - 网络变化时检查重启 │
│ - 电源插拔时检查重启 │
└─────────────────────────────────────┘
八、权限声明
插件自动声明以下权限,无需手动配置:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
九、依赖说明
插件自动引入以下依赖:
{
"dependencies": [
"androidx.work:work-runtime-ktx:2.9.1"
]
}
十、注意事项
- 自定义基座:插件包含 AAR、AndroidManifest、res 资源和远程依赖,首次使用必须打包自定义基座才能正常运行;之后修改 UTS 代码可直接标准基座调试
- 通知权限:Android 13+ 需要动态申请
POST_NOTIFICATIONS 权限,否则无法显示常驻通知
- 电池优化:建议引导用户将 App 加入电池优化白名单,否则后台可能被系统限制导致 Service 被杀死
- 厂商 ROM:小米、华为、OPPO、vivo 等系统有后台限制,建议引导用户在系统设置中放行自启动、后台运行
- 桌面组件:需要用户在桌面长按手动添加小组件,搜索"自启动助手"即可找到 4×2 和 2×2 两种尺寸
- 组件图标:
addWidgetLog* 的 icon 参数支持以下格式:
- 空字符串
"" → 显示 App 默认图标
- 网络 URL
"https://..." → 加载网络图片
- 文件路径
"/sdcard/..." → 加载本地文件
- 资源名
"ic_launcher" → 加载 drawable 资源
- 应用查询:
getRecentTasks() 需要用户授予使用情况访问权限(PACKAGE_USAGE_STATS),否则返回空列表
- 回调生命周期:
onWidgetRectClick 和 onWidgetSquareClick 设置了 @UTSJS.keepAlive,回调会持续存活,避免频繁重复调用
- AAR 编译:原生代码以 AAR 形式封装在
libs/ 目录,源码可联系作者获取