更新记录

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"
    ]
}

十、注意事项

  1. 自定义基座:插件包含 AAR、AndroidManifest、res 资源和远程依赖,首次使用必须打包自定义基座才能正常运行;之后修改 UTS 代码可直接标准基座调试
  2. 通知权限:Android 13+ 需要动态申请 POST_NOTIFICATIONS 权限,否则无法显示常驻通知
  3. 电池优化:建议引导用户将 App 加入电池优化白名单,否则后台可能被系统限制导致 Service 被杀死
  4. 厂商 ROM:小米、华为、OPPO、vivo 等系统有后台限制,建议引导用户在系统设置中放行自启动、后台运行
  5. 桌面组件:需要用户在桌面长按手动添加小组件,搜索"自启动助手"即可找到 4×2 和 2×2 两种尺寸
  6. 组件图标:addWidgetLog* 的 icon 参数支持以下格式:
    • 空字符串 "" → 显示 App 默认图标
    • 网络 URL "https://..." → 加载网络图片
    • 文件路径 "/sdcard/..." → 加载本地文件
    • 资源名 "ic_launcher" → 加载 drawable 资源
  7. 应用查询:getRecentTasks() 需要用户授予使用情况访问权限(PACKAGE_USAGE_STATS),否则返回空列表
  8. 回调生命周期:onWidgetRectClick 和 onWidgetSquareClick 设置了 @UTSJS.keepAlive,回调会持续存活,避免频繁重复调用
  9. AAR 编译:原生代码以 AAR 形式封装在 libs/ 目录,源码可联系作者获取

隐私、权限声明

1. 本插件需要申请的系统权限列表:

<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" tools:ignore="ProtectedPermissions" />

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

否

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。