更新记录

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. 回调生命周期onWidgetRectClickonWidgetSquareClick 设置了 @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. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。