更新记录
1.2.1(2026-10-25)
兼容蒸汽模式
平台兼容性
uni-app(5.26)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| × | √ | × | × | √ | × | √ | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(5.26)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | √ | × | × | × |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
UTS 安卓后台保活与原生 HTTP 任务
Android 前台服务、原生 HTTP 定时请求、限时息屏唤醒、通知停止和厂商设置引导,附可直接运行的演示页。
HBuilderX 5.26+;插件 ID:austin-keep-x;版本 1.2.1。
| 项目 | Android | 演示文件 |
|---|---|---|
| uni-app x · Vapor | 6.0+ | index.uvue |
| uni-app x · VDOM | 5.0+ | index.uvue |
| uni-app · Vue3 | 5.0+ | index.vue |
原生 HTTP 任务需要 Android 6.0+。不支持 iOS、鸿蒙、Web、小程序通用保活。
第 1 步:导入插件
完整目录放到 你的项目/uni_modules/austin-keep-x/。uni_modules 与项目的 manifest.json、pages.json 同级,保留插件全部文件。
项目 manifest.json 无需为本插件重复填写权限、注册服务或勾选模块。插件自带的 utssdk/app-android/AndroidManifest.xml 会在打包时自动合并。
通知授权和手机的后台运行设置需要运行后操作,见第 4 步。
第 2 步:注册演示页
在项目 pages.json 的 pages 数组中添加:
{
"path": "uni_modules/austin-keep-x/index",
"style": { "navigationBarTitleText": "安卓后台保活", "disableScroll": true }
}
在自己的页面中打开演示页:
uni.navigateTo({ url: '/uni_modules/austin-keep-x/index' })
uni-app x 使用插件内 index.uvue;普通 uni-app Vue3 使用 index.vue,路由写法相同。
第 3 步:制作并运行自定义基座
- HBuilderX 选中项目,进入 发行 → 原生 App 云打包 → Android,勾选 制作自定义调试基座。
- 填写应用包名及签名信息,完成打包并安装新基座。
- 在运行菜单选择 自定义基座,运行到 Android 手机,打开第 2 步的演示页。
首次导入、更新插件原生代码或权限后需要重打基座;只修改页面、调用参数或文档不需要。入口见 DCloud 自定义基座说明。
第 4 步:体验后台运行
演示页无需填写域名或接口。
- 按需打开“手机设置”:建议允许后台运行、锁定最近任务;通知未授权时点 允许通知,按弹窗或设置页完成授权。
- 点 开始体验,等页面显示“服务运行中”。
- 返回桌面或锁屏,等待至少 60 秒。
- 回到页面,查看后台新增心跳、离开时长和体验结果。
- 点 结束体验,停止服务。
体验提供最多 2 分钟息屏运行支持,会增加耗电;到期释放 CPU 唤醒锁,服务仍可运行。结束体验会提前释放,结果保留供查看。已有 HTTP 业务任务时,需先明确结束并清除配置才能体验。
手机设置怎么选
| 页面按钮 | 是否需要 | 用户操作 |
|---|---|---|
| 允许后台运行 | 建议 | 打开本应用电池设置,允许后台运行;无法直达时按提示从应用详情进入 |
| 防止一键清理 | 建议 | 查看步骤,在手机最近任务界面找到本应用,按卡片菜单或厂商手势选择“锁定”;插件不能替用户完成 |
| 允许通知 | 推荐 | 允许本应用通知,便于查看、停止服务;拒绝通知不阻止服务启动 |
| 补充:允许本应用不优化 | 补充,未豁免时显示 | 列表选择“所有应用 → 本应用 → 不优化”,只修改本应用 |
vivo / iQOO 未找到后台开关时:手机设置 → 搜索“后台耗电管理”或“后台高耗电” → 本应用 → 允许后台高耗电。厂商页面可能受系统权限保护,按钮无法保证直达。
打开设置不代表完成授权。通知、电池优化状态可读取;厂商后台高耗电和最近任务锁定需用户确认。完成设置后回到页面,重新开始体验。
体验结果怎么看
每 30 秒记录一次原生心跳,离开 60 秒通常新增约 2 次,系统休眠可能延迟。
| 结果 | 含义 / 操作 |
|---|---|
| 有心跳 | 同一服务会话在离开期间记录了新心跳,观察到后台执行 |
| 无心跳 | 未观察到新心跳,检查后台运行设置后重试 |
| 结果待确认 | 仅新增 1 次且紧邻返回,可能是解锁后的补跳;或本轮进入过系统设置,需重新体验 |
| 不足 60 秒 | 重新开始,离开至少 60 秒 |
| 发生恢复 | 服务实例已变化,不能据此判断原实例持续运行 |
| 服务已停止 | 返回时未运行,或提前结束了体验 |
| 读取失败 | 未取得有效状态,重新体验 |
返回后的前台心跳不计入本次结果。页面不能自动证明用户已锁屏;心跳也不等于业务成功或全程连续执行。“运行记录”中可查看详细记录。
接入自己的业务
1. 导入并调用保活 API
业务页面从 @/uni_modules/austin-keep-x 导入,即 你的项目/uni_modules/austin-keep-x/ 目录。@/ 为包含 manifest.json 的项目源码目录,不要追加 index.uvue 或 utssdk/app-android。
uni-app x 放在 <script setup lang="uts">;普通 uni-app Vue3 使用 lang="ts"。
import {
startKeepAlive, getKeepAliveStatus, stopKeepAlive,
KeepAliveStartOptions
} from '@/uni_modules/austin-keep-x'
// 分别绑定页面的开始、刷新、停止按钮。
function startTask(): void {
const options: KeepAliveStartOptions = {
notificationTitle: '后台任务运行中',
notificationText: '点击返回应用,或停止后台任务',
autoRestart: true,
wakeLockTimeoutMs: 0,
heartbeatIntervalMs: 30000
}
const result = startKeepAlive(options)
console.log('是否接受启动请求', result.ok, result.errMsg)
}
function refreshTask(): void {
const status = getKeepAliveStatus()
console.log('服务是否运行', status.running, status.serviceState)
}
function stopTask(): void {
const result = stopKeepAlive()
console.log('是否接受停止请求', result.ok, result.errMsg)
}
启动是异步过程,ok 表示接受请求,稍后刷新得到的 running 才是实际状态。插件提供前台服务支持;页面 JS 定时器、WebSocket、录音或定位需要各自原生后台实现。首次启动服务、申请通知权限应在前台页面发起。
需要申请 Android 13+ 通知权限时,在前台按钮中调用:
import {
requestKeepAliveNotificationPermission, KeepAlivePermissionResult
} from '@/uni_modules/austin-keep-x'
function requestNotification(): void {
requestKeepAliveNotificationPermission({
complete: (result: KeepAlivePermissionResult) => {
console.log('通知是否已授权', result.granted)
}
})
}
2. 按需设置息屏唤醒
wakeLockTimeoutMs 默认 0;需要息屏期间继续处理原生任务时,填任务所需时长,最长 600000 毫秒(10 分钟)。到期自动释放、不续期;提前完成时调用:
import { releaseKeepAliveWakeLock } from '@/uni_modules/austin-keep-x'
releaseKeepAliveWakeLock()
唤醒锁不点亮屏幕,会增加耗电,不保证网络可用;Doze 仍可能限制未豁免应用。系统恢复只沿用未到期额度,开机恢复不重新取得旧锁。见 Android 电源限制。
3. 按需使用原生 HTTP 任务
适合状态同步、在线状态上报和定时查询。请求由 Android 原生线程执行,无需先调用 startKeepAlive()。
import {
startKeepAliveHttpTask, getKeepAliveHttpTaskStatus, stopKeepAliveHttpTask,
KeepAliveHttpTaskOptions
} from '@/uni_modules/austin-keep-x'
// 分别绑定开始、刷新、停止按钮,替换为自己的 HTTPS 接口。
function startHttpTask(): void {
const options: KeepAliveHttpTaskOptions = {
taskId: 'status-sync',
url: 'https://你的域名/api/status',
method: 'GET',
intervalMs: 60000,
timeoutMs: 15000,
maxRetries: 2,
autoRestart: true
}
const result = startKeepAliveHttpTask(options)
console.log('是否接受启动请求', result.ok, result.errMsg)
}
function refreshHttpTask(): void {
const status = getKeepAliveHttpTaskStatus()
console.log('服务运行状态 / HTTP 2xx 次数', status.serviceRunning, status.successCount)
}
function stopHttpTask(): void {
const result = stopKeepAliveHttpTask()
console.log('是否接受停止请求', result.ok, result.errMsg)
}
| 要点 | 行为 |
|---|---|
| 任务数量 | 同时一个;重新开始会替换当前 HTTP 任务 |
| 停止 | stopKeepAliveHttpTask() 只停止 HTTP,默认清除配置和结果;stopKeepAlive() 停止两种服务 |
| 重试 | GET 默认最多重试 2 次,POST 默认不重试;POST 配置重试须填 idempotencyHeader,服务端按此头去重 |
| 数据保存 | 请求头、请求体及有限结果使用本机 Keystore 加密保存;退出登录应停止并清除配置 |
| HTTPS | 使用系统证书验证,不绕过自签名验证,不自动跟随重定向 |
| 业务结果 | HTTP 2xx 不等于业务成功,需检查返回内容;令牌过期后更新配置并重新开始 |
| 请求间隔 | 尽力调度,休眠、断网和厂商策略可能延迟,不保证精确定时或永久在线 |
同次逻辑请求重试复用 requestId,不同周期生成新 ID;服务端仍需正确去重。停止会尽力取消请求,已到达服务端的操作不会回滚。不要循环续唤醒锁维持请求。
Android 15+ 且 targetSdk 35+:dataSync 后台运行受 6 小时 / 24 小时时限约束,且不能从开机广播启动。触及时限或系统暂停后,读取原因,回前台由用户重新开始。见 Android 超时说明及 dataSync 限制。
4. 按需复制演示页
| 项目 | 复制来源 | 放入自己项目 |
|---|---|---|
| uni-app x | uni_modules/austin-keep-x/index.uvue |
pages/keep/index.uvue |
| uni-app Vue3 | uni_modules/austin-keep-x/index.vue |
pages/keep/index.vue |
复制后在 pages.json 注册 pages/keep/index。页面中的 @/uni_modules/austin-keep-x 导入保持原样,插件目录继续保留。
API 与参数
以下 API、类型均从 @/uni_modules/austin-keep-x 导入。
| API | 参数 | 返回与说明 |
|---|---|---|
startKeepAliveHttpTask(options) |
KeepAliveHttpTaskOptions |
KeepAliveResult;配置并启动原生 HTTP 任务 |
getKeepAliveHttpTaskStatus() |
无 | KeepAliveHttpTaskStatus;任务与最近请求结果 |
stopKeepAliveHttpTask(clearConfig?) |
boolean,默认 true |
KeepAliveResult;停止 HTTP,默认清配置/结果;false 保留加密配置及诊断,仍不会自动重开 |
startKeepAlive(options?) |
KeepAliveStartOptions \| null |
KeepAliveResult;启动,运行中再次调用可更新配置 |
stopKeepAlive() |
无 | KeepAliveResult;停止保活及 HTTP 任务,取消恢复并释放锁 |
isKeepAliveRunning() |
无 | boolean;真实服务状态 |
getKeepAliveStatus() |
无 | KeepAliveStatus;运行、电源、通知与恢复状态 |
getKeepAliveDiagnostics() |
无 | KeepAliveDiagnostics;失败、跳转和最近记录 |
clearKeepAliveDiagnostics() |
无 | boolean;只清除记录,不启停服务 |
getKeepAliveGuide() |
无 | KeepAliveGuide;当前厂商操作说明 |
releaseKeepAliveWakeLock() |
无 | boolean;提前释放锁,服务继续运行 |
requestKeepAliveNotificationPermission(options?) |
KeepAlivePermissionOptions \| null |
void;Android 13+ 主动申请通知权限 |
openKeepAliveSettings(target) |
string,目标见下表 |
KeepAliveSettingsResult;按目标跳转并返回实际入口、回退说明 |
openNotificationSettings() |
无 | boolean;打开通知设置 |
openBatteryOptimizationSettings() |
无 | boolean;打开电池优化列表,由用户选择 App |
openAutoStartSettings() |
无 | boolean;尝试本厂商设置,失败时回退应用设置 |
openAppSettings() |
无 | boolean;打开当前应用详情 |
旧设置 API 保持可用,true 只表示页面已打开,不表示用户已授权。新接入建议使用 openKeepAliveSettings(),读取实际去向和后续步骤。
设置跳转与返回字段
import { openKeepAliveSettings, KeepAliveSettingsResult } from '@/uni_modules/austin-keep-x'
const entry: KeepAliveSettingsResult = openKeepAliveSettings('background')
// entry.opened:是否打开了页面;entry.direct:是否直达目标。
// entry.message:向用户展示的后续操作;不能据 opened 推断已授权。
target |
目标与回退行为 |
|---|---|
background |
打开本应用电池设置;不可用时回退应用详情,并说明后续路径。厂商后台高耗电入口需按提示手动进入 |
recent-tasks |
返回锁定步骤,不自动打开最近任务或替用户锁定;opened、direct 均为 false |
auto-start |
尝试当前厂商自启动入口;不可用时回退应用详情。业务启用恢复策略时按需引导 |
battery |
电池优化列表;不可用时回退应用详情 |
notification |
本应用通知设置;不可用时回退应用详情 |
app |
当前应用详情 |
KeepAliveSettingsResult 的 5 个字段均存在:
| 字段 | 类型 | 说明 |
|---|---|---|
opened |
boolean |
是否成功打开了设置页面;不代表用户完成设置 |
target |
string |
本次请求的目标 |
destination |
string |
实际入口标识;如 app-battery 为本应用电池页,manual 为需手动操作 |
direct |
boolean |
是否直达目标入口;回退到本应用电池页或详情时为 false |
message |
string |
当前入口的操作说明、回退原因或手动步骤 |
自启动入口按当前设备尝试;厂商后台高耗电等页面可能受系统权限保护,无法直达时需手动进入。最近任务“锁定”是厂商功能,不能用 Android 的屏幕固定替代。电池豁免与厂商“允许后台高耗电”是不同设置。参见 Android 设置入口与屏幕固定/Lock task 说明。
KeepAliveHttpTaskOptions
所有时间单位为毫秒;范围内需填整数。taskId、url 必填,其余可省略。
| 字段 | 类型 | 默认值 / 说明 |
|---|---|---|
taskId |
string |
1~64 位字母、数字、点、下划线或横线 |
url |
string |
1~4096 字符自有 HTTPS 地址,不含账号或 fragment;状态/日志不返回 query |
method |
string? |
GET;支持 GET、POST |
headers |
KeepAliveHttpHeader[]? |
最多 32 项 { name: string, value: string },合计最多 16 KiB;值最长 4096 字符且不可含换行,不重复、不覆盖 Host/Content-Length 等传输头 |
body |
string? |
空;POST 最多 64 KiB,JSON 自行序列化;GET 不支持请求体 |
intervalMs |
number? |
60000;30000~86400000,尽力调度 |
timeoutMs |
number? |
15000;1000~60000,单次请求总超时 |
maxRetries |
number? |
GET 2 / POST 0;0~3,每次逻辑请求的额外重试上限 |
retryBackoffMs |
number? |
5000;1000~300000,失败退避基准 |
autoRestart |
boolean? |
true;允许系统回收后尝试恢复,受系统类型及时限约束 |
maxResponseBytes |
number? |
8192;1~65536,响应读取上限,超出标记截断 |
saveResponseBody |
boolean? |
true;为 false 时不保存响应正文,仍保存响应码和统计 |
idempotencyHeader |
string? |
空;POST 重试需填服务端支持的去重请求头名,例如 Idempotency-Key,值由插件按逻辑请求生成 |
普通失败仅对网络错误、408、429、5xx 按上限退避重试;401 等其他 4xx 与重定向不重试,整数秒 Retry-After 最多等待 5 分钟。离线不消耗请求次数,每 30 秒检查;每次完成后再等待 intervalMs,不追补休眠时错过的周期。总超时会结算失败并尽力中断 I/O;系统 DNS 等底层调用可能延迟释放,下一次请求等待前一次退出,不并发叠加。
进程中断时,已发送的 POST 可能处于服务端已处理但客户端未收到结果的状态。无幂等约定时任务暂停并说明原因,避免自动重复提交;配置幂等头仍需服务端正确实现去重,恢复同一请求也不会突破剩余重试次数。
KeepAliveHttpTaskStatus
以下字段全部存在。时间戳为毫秒,未发生为 0;计数为当前任务统计。
| 字段 | 类型 | 说明 |
|---|---|---|
supported |
boolean |
是否支持原生 HTTP(Android 6.0+) |
notificationsEnabled / channelBlocked |
boolean |
应用通知可用 / HTTP 任务通知渠道被关闭 |
configured / enabled |
boolean |
是否保存任务配置 / 是否允许任务执行 |
serviceRunning |
boolean |
HTTP 前台服务是否真实运行;配置已保存不等于已运行 |
taskId |
string |
当前任务标识 |
state |
string |
idle 未配置、starting 启动中、waiting 等待、running 请求中、retrying 重试中、paused 已暂停或停止但保留配置、failed 失败;默认清除配置后为 idle |
requestInFlight |
boolean |
当前是否有正在执行的请求 |
url / method |
string |
脱敏接口地址(不含查询参数)/ 请求方法 |
intervalMs / timeoutMs |
number |
生效的间隔与单次超时 |
autoRestart |
boolean |
是否配置恢复尝试 |
nextRunAt |
number |
下次预计执行时间;系统可能延迟 |
lastStartedAt / lastFinishedAt |
number |
最近请求开始 / 结束时间 |
lastSuccessAt |
number |
最近 HTTP 2xx 时间 |
totalRuns |
number |
逻辑执行次数,重试归在同一次请求内 |
successCount / failureCount |
number |
成功 / 最终失败次数 |
consecutiveFailures |
number |
连续最终失败次数 |
attempt |
number |
当前逻辑请求的尝试序号 |
requestId |
string |
本次逻辑请求 ID,重试复用 |
lastHttpStatus |
number |
最近 HTTP 响应码,尚无响应为 0 |
lastErrorCode / lastErrorMessage |
string |
最近错误代码 / 说明 |
responseText |
string |
有限响应正文;禁用保存时为空 |
responseTruncated |
boolean |
是否因上限截断 |
responseBytes |
number |
已读取响应字节数 |
lastDurationMs |
number |
最近请求耗时 |
pauseReason |
string |
系统时限、未确认的 POST 等暂停原因;回前台检查后重新开始 |
HTTP 启动错误码:31001 上下文不可用、31002 参数无效、31003 服务启动失败、31004 本机存储失败、31005 平台不支持、31006 权限或前台启动条件不满足。运行时请求失败在 lastErrorCode / lastErrorMessage 中读取。
KeepAliveStartOptions
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
notificationTitle |
string? |
后台任务运行中 |
通知标题,空白使用默认值 |
notificationText |
string? |
点击返回应用,或停止后台任务 |
通知正文 |
channelId |
string? |
austin_keep_x |
通知渠道;创建后部分属性不能由代码覆盖 |
channelName |
string? |
后台任务 |
通知渠道名称 |
autoRestart |
boolean? |
true |
系统回收、重启和应用更新后的恢复尝试 |
wakeLockTimeoutMs |
number? |
0 |
0~600000;0 不持锁;不自动续期 |
heartbeatIntervalMs |
number? |
30000 |
5000~300000;原生诊断采样,不是业务回调 |
KeepAliveResult
| 字段 | 类型 | 说明 |
|---|---|---|
ok |
boolean |
请求是否被接受 |
running |
boolean |
返回时服务是否已确认运行 |
errCode |
number |
0 成功,非 0 见错误表 |
errMsg |
string |
失败说明 |
detail |
string |
请求状态或原生失败详情 |
KeepAliveStatus
| 字段 | 类型 | 说明 |
|---|---|---|
supported |
boolean |
当前平台是否支持 |
enabled |
boolean |
用户是否请求保留当前任务,与实际运行分开 |
running |
boolean |
真实前台服务状态 |
serviceState |
string |
starting / running / stopped / failed;非支持平台为 unsupported |
autoRestartEnabled |
boolean |
是否启用恢复策略 |
platform |
string |
当前平台 |
manufacturer / brand / model |
string |
设备厂商、品牌、型号 |
sdkInt |
number |
Android API Level |
batteryOptimizationIgnored |
boolean |
是否在系统电池优化豁免名单 |
screenInteractive |
boolean |
设备是否处于可交互亮屏状态 |
deviceIdleMode |
boolean |
是否进入深度 Doze |
powerSaveMode |
boolean |
系统省电模式 |
backgroundRestricted |
boolean |
系统 App 后台活动限制,不代表全部厂商策略 |
notificationPermissionGranted |
boolean |
Android 13+ 通知运行时权限,低版本为 true |
notificationsEnabled |
boolean |
App 通知总开关 |
channelBlocked |
boolean |
当前通知渠道是否被禁用 |
startedAt |
number |
最近服务会话开始的 Unix 毫秒时间,未创建过会话为 0;停止后保留 |
processId |
number |
当前查询所在的 App 进程 ID;是否有前台服务另看 running |
sessionId |
string |
最近服务实例标识,重建时变化 |
lastHeartbeatAt |
number |
最近原生心跳的 Unix 毫秒时间 |
lastHeartbeatElapsedRealtime |
number |
最近心跳的开机单调时间,毫秒 |
heartbeatAgeMs |
number |
距最近心跳的单调时间,无有效样本为 -1 |
heartbeatCount |
number |
此实例心跳计数,查询不会增加计数 |
heartbeatIntervalMs |
number |
配置的心跳间隔 |
wakeLockHeld |
boolean |
CPU 锁是否持有,Doze 中仍受约束 |
wakeLockTimeoutMs |
number |
配置的唤醒时长 |
wakeLockExpiresAt |
number |
当前唤醒锁截止的 Unix 毫秒时间,未持锁时为 0 |
restartCount |
number |
已记录的恢复次数 |
lastStopReason |
string |
最近停止来源 |
lastTaskRemovedAt |
number |
最近划走任务的 Unix 毫秒时间 |
lastStartReason |
string |
最近启动来源 |
lastFailureReason / lastFailureAt |
string / number |
最近失败说明及 Unix 毫秒时间 |
lastAutoStartEntry / lastAutoStartFallback |
string |
最近厂商入口及回退记录 |
lastReceiverAction / lastReceiverAt |
string / number |
最近系统广播及 Unix 毫秒时间 |
notificationTitle / notificationText |
string |
保存的通知文案 |
channelId |
string |
当前通知渠道 |
诊断与厂商说明
KeepAliveDiagnostics 包含 lastFailureReason: string、lastFailureAt: number、lastAutoStartEntry: string、lastAutoStartFallback: string、lastReceiverAction: string、lastReceiverAt: number,含义同状态表;recentLogsText: string 是有限条数的本机记录。
| KeepAliveGuide 字段 | 类型 | 说明 |
|---|---|---|
manufacturerKey |
string |
厂商标识 |
manufacturerName |
string |
厂商名称 |
autoStartInstructions |
string |
自启动 / 后台启动说明 |
batteryInstructions |
string |
电池与后台运行说明 |
recentTasksInstructions |
string |
最近任务保护说明 |
note |
string |
当前系统能力与入口限制 |
通知授权回调
KeepAlivePermissionOptions 的 success?、fail?、complete? 均为 (result: KeepAlivePermissionResult) => void。结果字段为 ok: boolean、granted: boolean、errCode: number、errMsg: string;complete 在本次请求结束后调用。通知未授权不代表禁止前台服务,但通知栏控制可能不可见;另查通知总开关和渠道状态。
插件自动合并的权限与组件
以下内容已在 uni_modules/austin-keep-x/utssdk/app-android/AndroidManifest.xml 声明,项目 manifest.json 无需重复填写,也不需要复制这份 XML。
| 权限 | 用途 |
|---|---|
android.permission.FOREGROUND_SERVICE |
前台服务 |
android.permission.FOREGROUND_SERVICE_SPECIAL_USE |
普通保活服务类型 |
android.permission.FOREGROUND_SERVICE_DATA_SYNC |
HTTP 任务服务类型 |
android.permission.INTERNET |
HTTP 请求 |
android.permission.ACCESS_NETWORK_STATE |
网络状态检测 |
android.permission.WAKE_LOCK |
限时 CPU 唤醒,无系统授权弹窗 |
android.permission.RECEIVE_BOOT_COMPLETED |
开启恢复后的开机恢复尝试 |
android.permission.POST_NOTIFICATIONS |
Android 13+ 通知,需运行时主动申请 |
KeepAliveForegroundService、KeepAliveHttpService、KeepAliveBootReceiver 和设置跳转所需 queries 也由插件合并。组件类名前缀为 uts.sdk.modules.austinKeepX。
发布应用前:普通保活使用 specialUse,在上述插件 XML 中找到 PROPERTY_SPECIAL_USE_FGS_SUBTYPE,把 android:value 改为应用实际的后台任务用途;修改后重新打包。HTTP 使用 dataSync,录音、导航需各自专用实现。见 Android 前台服务类型。
恢复与系统边界
| 情况 | 行为 |
|---|---|
| 返回桌面 / 锁屏 | 服务继续运行;需 CPU 持续处理时设置有限唤醒额度 |
| 划走最近任务 | stopWithTask=false,记录时间,不循环拉起进程 |
| 系统回收进程 | 开启恢复时通过系统 sticky 机制尝试重建,时机由系统决定 |
| 重启 / 覆盖更新 | 开启恢复且系统允许广播和后台启动时尝试恢复,记录结果 |
| 页面或通知“停止” | 取消恢复、释放锁并停止服务 |
| 系统设置中的强制停止 | 不自行拉起应用;需用户重新打开 App |
| Android“活动应用”停止 | 当次应用与服务结束;下次能读到用户停止记录时取消恢复,跨重启记录可能不可用 |
| 深度 Doze / 厂商清理 | 可能暂停 CPU、网络或终止进程,设置引导不等于授权 |
Android 12+ 后台首次启动前台服务受限制,应由用户在可见页面启动。见 前台服务后台启动限制。
Android 13+“活动应用”的停止按钮不会向应用发送回调。插件在下次读取状态或系统恢复前检查退出记录;识别到用户停止后取消恢复,需再次点启动。退出记录跨重启可能丢失,因此开启恢复时,“活动应用”停止后仍可能在下次开机恢复。需要明确取消后续恢复时,使用插件页面或插件通知中的“停止”。 Android 11~13 的退出原因可能同时代表应用更新,遇到无法区分的记录时优先取消恢复,更新后可能需要手动启动。见 Android 用户停止处理说明。
错误处理
| errCode | 说明与处理 |
|---|---|
0 |
请求成功,继续查看真实状态 |
10001 |
平台不支持 |
30001 |
缺少上下文或前台页面;权限请求在前台发起 |
30002 |
启动失败;查看 detail、诊断和基座服务配置 |
30003 |
停止请求失败 |
30004 |
参数超范围或不是有限数值 |
30005 |
缺少清单 / 类型权限,重打包含此插件的基座 |
30006 |
系统拒绝后台启动;返回可见页面由用户操作 |
30007 |
通知授权失败或被拒绝,按需打开通知设置 |
没有通知时先查 notificationPermissionGranted、notificationsEnabled、channelBlocked,不要直接判定服务未运行。配置不匹配时查看诊断失败记录。

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 642
赞赏 4
下载 12712437
赞赏 1958
赞赏
京公网安备:11010802035340号