解析短时任务与长时任务:HarmonyOS Next 后台开发的基础

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

后台任务是应用开发中不可或缺的一部分,它可以让应用在后台执行一些耗时任务,例如保存状态、下载文件、音乐播放等。HarmonyOS Next 提供了丰富的后台任务管理功能,其中短时任务和长时任务是最基础也是最常用的两种类型。本文将深入解析短时任务和长时任务,帮助我们日常开发更好地理解和使用这些功能。

短时任务概述与申请条件

短时任务适用于后台实时性要求较高且耗时较短的任务,例如保存状态、发送消息、网络请求等。开发者可以通过 requestSuspendDelay 接口申请短时任务,并设置回调函数处理任务超时的情况。

申请条件

  • 应用需要在前台或 onBackground 回调内申请短时任务,否则会申请失败。

  • 一个应用同一时刻最多申请 3 个短时任务。

  • 单日(24 小时内)配额默认为 10 分钟,单次配额最大为 3 分钟,低电量时单次配额默认为 1 分钟。

  • 任务完成后,应用需主动取消短时任务,否则会影响应用当日短时任务的剩余配额。

  • 短时任务即将超时时,系统会回调应用,应用需要取消短时任务。如果超时未取消,系统会终止对应的应用进程。

短时任务的资源配额与配额管理

为了确保设备资源的合理使用,系统会对短时任务进行资源配额限制。每个应用都会有一定的短时任务配额,配额消耗完后不允许再申请短时任务。开发者可以通过 getRemainingDelayTime 接口查询当前应用的短时任务剩余时间,并根据剩余时间决定是否继续执行其他任务。

配额计算

  • 仅当应用在后台时,对应用下的短时任务计时。

  • 同一个应用下的同一个时间段的短时任务,不重复计时。

示例代码

typescript 复制代码
import { backgroundTaskManager } from '@kit.BackgroundTasksKit';

function requestSuspendDelay() {

let myReason = 'test requestSuspendDelay'; // 申请原因

let delayInfo = backgroundTaskManager.requestSuspendDelay(myReason, () => {

// 回调函数。应用申请的短时任务即将超时,通过此函数回调应用,执行一些清理和标注工作,并取消短时任务

console.info('suspend delay task will timeout');

backgroundTaskManager.cancelSuspendDelay(delayInfo.requestId);

});

}

function getRemainingDelayTime() {

backgroundTaskManager.getRemainingDelayTime(delayInfo.requestId).then((res: number) => {

console.info('Succeeded in getting remaining delay time.');

console.info(`Remaining delay time: ${res} seconds`);

}).catch((err: BusinessError) => {

console.error(`Failed to get remaining delay time. Code: ${err.code}, message: ${err.message}`);

});

}

长时任务的应用场景与实现流程

长时任务适用于长时间后台运行的任务,例如音乐播放、导航、设备连接、位置跟踪等。开发者需要创建一个 ContinuousTaskExtensionAbility 来承载长时任务,并实现 onContinuousTaskStartonContinuousTaskStop 回调函数,分别处理任务开始和结束的逻辑。

实现流程

  1. 创建 ContinuousTaskExtensionAbility 并实现生命周期回调函数。

  2. 通过 backgroundTaskManager.startContinuousTask 接口启动长时任务。

  3. onContinuousTaskStart 回调中执行任务逻辑。

  4. onContinuousTaskStop 回调中停止任务逻辑。

代码示例

typescript 复制代码
import { ContinuousTaskExtensionAbility, backgroundTaskManager } from '@kit.BackgroundTasksKit';

export default class MyContinuousTaskExtensionAbility extends ContinuousTaskExtensionAbility {

onContinuousTaskStart(workInfo: backgroundTaskManager.WorkInfo) {

console.info(`onContinuousTaskStart, workInfo = ${JSON.stringify(workInfo)}`);

// 开始执行长时任务逻辑

}

onContinuousTaskStop(workInfo: backgroundTaskManager.WorkInfo) {

console.info(`onContinuousTaskStop, workInfo is ${JSON.stringify(workInfo)}`);

// 停止执行长时任务逻辑

}

}

任务超时管理与系统回调

为了防止长时任务长时间占用系统资源,系统会对长时任务进行超时管理。开发者需要在 onContinuousTaskStart 回调中设置超时时间,并在超时后通过 backgroundTaskManager.stopContinuousTask 接口停止任务。

代码示例

typescript 复制代码
import { ContinuousTaskExtensionAbility, backgroundTaskManager } from '@kit.BackgroundTasksKit';

export default class MyContinuousTaskExtensionAbility extends ContinuousTaskExtensionAbility {

onContinuousTaskStart(workInfo: backgroundTaskManager.WorkInfo) {

console.info(`onContinuousTaskStart, workInfo = ${JSON.stringify(workInfo)}`);

// 开始执行长时任务逻辑

// 设置超时时间,例如 5 分钟

setTimeout(() => {

console.info('Continuous task timeout, stopping task...');

backgroundTaskManager.stopContinuousTask(this.continuousTaskId);

}, 5 * 60 * 1000);

}

onContinuousTaskStop(workInfo: backgroundTaskManager.WorkInfo) {

console.info(`onContinuousTaskStop, workInfo is ${JSON.stringify(workInfo)}`);

// 停止执行长时任务逻辑

}

}

总结

短时任务和长时任务是 HarmonyOS Next 后台开发的基础,它们分别适用于不同场景的后台任务。我们需要根据实际需求选择合适的后台任务类型,并结合具体的开发场景进行应用开发。同时,咱们也需要注意后台任务的资源配额和系统约束,避免过度消耗设备资源。

相关推荐
m0_748244961 分钟前
【AI系统】LLVM 前端和优化层
前端·状态模式
明弟有理想1 分钟前
Chrome RCE 漏洞复现
前端·chrome·漏洞·复现
平行线也会相交2 分钟前
云图库平台(二)前端项目初始化
前端·vue.js·云图库平台
shimmer0083 分钟前
抖音小程序登录(前端通过tt.login获取code换取openId)
前端·小程序·状态模式
嘤嘤怪呆呆狗13 分钟前
【开发问题记录】使用 Docker+Jenkins+Jenkins + gitee 实现自动化部署前端项目 CI/CD(centos7为例)
前端·vue.js·ci/cd·docker·gitee·自动化·jenkins
鱼钓猫的小鱼干18 分钟前
table 表格转成 excell 导出
前端·vue·excel
一只搬砖的猹20 分钟前
cJson系列——常用cJson库函数
linux·前端·javascript·python·物联网·mysql·json
懒羊羊我小弟39 分钟前
包管理工具npm、yarn、pnpm、cnpm详解
前端·npm·node.js·yarn·cnpm
ppo_wu43 分钟前
更改 pnpm 的全局存储位置
前端·vue
凯子坚持 c1 小时前
解锁仓颉编程语言的奥秘:枚举类型、模式匹配与类接口全解析
开发语言·华为·harmonyos