云计算百科
云计算领域专业知识百科平台

警惕后台耗电杀手:HarmonyOS 7 长时任务与进程保活策略

很多应用为了所谓的“实时性”,恨不得让自己的进程在后台永远存活。在鸿蒙生态里,系统对后台管控极其严苛。如果你的应用被检测到在后台偷偷运行,不仅会被系统强杀,还会面临上架审核被拒的风险。正确使用长时任务,是每一个成熟应用的必修课。

合法保活的后台模式

鸿蒙系统只允许特定类型的任务在后台长期运行。你必须在 module.json5 中声明对应的 backgroundModes。

json

{
"module": {
"abilities": [
{
"name": "EntryAbility",
"backgroundModes": [
"audioPlayback",
"location",
"dataTransfer"
]
}
]
}
}

警示:这里写什么,你就只能干什么。如果你申请了 audioPlayback,但你的应用在后台根本没有音频流的输入输出,系统的功耗检测机制会立刻察觉,几秒钟内就会冻结你的进程。

启动任务与通知栏的强制绑定

启动长时任务时,系统会强制在通知栏显示一条消息(比如“XX应用正在后台运行”)。这是为了让用户拥有知情权,这个通知是删不掉的。

typescript

import backgroundTaskManager from '@ohos.resourceschedule.backgroundTaskManager';
import wantAgent from '@ohos.app.ability.wantAgent';

async function startUploadTask(context: Context) {
// 必须配置 WantAgent,让用户点击通知能回到应用
const agent = await wantAgent.getWantAgent({
wants: [{ bundleName: 'com.example.app', abilityName: 'EntryAbility' }],
actionType: wantAgent.OperationType.START_ABILITY,
requestCode: 0
});

try {
const taskId = await backgroundTaskManager.startBackgroundTask(
context,
backgroundTaskManager.BackgroundMode.DATA_TRANSFER,
agent
);
return taskId;
} catch (err) {
// 如果用户关闭了通知权限,或者系统资源耗尽,这里会失败
// 必须有降级预案,提示用户保持应用在前台
console.error('长时任务申请失败', err);
return -1;
}
}

前后台切换的生命周期错位

这是一个极易引发内存泄漏和耗电激增的陷阱:应用切到后台,你启动了长时任务;当用户切回前台时,你忘了把它关掉。

当应用回到前台,UI 已经活跃,根本不需要系统在后台保活。如果你不关,系统会一直挂着那条通知,并且持续扣你的电量。

必须在 UIAbility 的生命周期里精准控制。

typescript

export default class EntryAbility extends UIAbility {
private taskId: number = -1;

onForeground() {
// 回到前台,立即停止长时任务
if (this.taskId !== -1) {
backgroundTaskManager.stopBackgroundTask(this.taskId);
this.taskId = -1;
}
}

onBackground() {
// 切到后台,如果处于上传状态,才去申请长时任务
if (AppStorage.get<boolean>('isUploading')) {
startUploadTask(this.context).then(id => {
this.taskId = id;
});
}
}
}

断点续传才是真正的保命符

没有任何长时任务是绝对不死(Immortal)的。当手机内存极度紧张,或者用户开启了省电模式,系统连带你带任务一起杀是家常便饭。

如果你在后台下载一个 500MB 的大文件,千万不能指望长时任务能保佑你跑完。必须每隔几秒钟,把当前下载的字节数和进度,写进数据库或者 Preferences 里。

下次应用重新启动(或者任务被重新唤醒),先去数据库里读进度,然后带上 Range 头,向服务器发起断点续传请求。只有做好断点续传,才算是一个合格的后台任务。

在你的应用里,写一个简单的倒计时器,每分钟往沙箱里写一行日志。把它加入长时任务。然后切到后台,打开三个大型游戏。等半个小时再切回来。看看你的日志有没有断档,长时任务是否被系统回收。这才是最真实的后台生存测试。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 警惕后台耗电杀手:HarmonyOS 7 长时任务与进程保活策略
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!