解析短时任务与长时任务:HarmonyOS Next 后台开发的基础
SameX
Posted on November 2, 2024
本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。
后台任务是应用开发中不可或缺的一部分,它可以让应用在后台执行一些耗时任务,例如保存状态、下载文件、音乐播放等。HarmonyOS Next 提供了丰富的后台任务管理功能,其中短时任务和长时任务是最基础也是最常用的两种类型。本文将深入解析短时任务和长时任务,帮助我们日常开发更好地理解和使用这些功能。
短时任务概述与申请条件
短时任务适用于后台实时性要求较高且耗时较短的任务,例如保存状态、发送消息、网络请求等。开发者可以通过 requestSuspendDelay
接口申请短时任务,并设置回调函数处理任务超时的情况。
申请条件:
- 应用需要在前台或
onBackground
回调内申请短时任务,否则会申请失败。 - 一个应用同一时刻最多申请 3 个短时任务。
- 单日(24 小时内)配额默认为 10 分钟,单次配额最大为 3 分钟,低电量时单次配额默认为 1 分钟。
- 任务完成后,应用需主动取消短时任务,否则会影响应用当日短时任务的剩余配额。
- 短时任务即将超时时,系统会回调应用,应用需要取消短时任务。如果超时未取消,系统会终止对应的应用进程。
### 短时任务的资源配额与配额管理
为了确保设备资源的合理使用,系统会对短时任务进行资源配额限制。每个应用都会有一定的短时任务配额,配额消耗完后不允许再申请短时任务。开发者可以通过
getRemainingDelayTime
接口查询当前应用的短时任务剩余时间,并根据剩余时间决定是否继续执行其他任务。 配额计算: - 仅当应用在后台时,对应用下的短时任务计时。
- 同一个应用下的同一个时间段的短时任务,不重复计时。 示例代码:
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
来承载长时任务,并实现 onContinuousTaskStart
和 onContinuousTaskStop
回调函数,分别处理任务开始和结束的逻辑。
实现流程:
- 创建
ContinuousTaskExtensionAbility
并实现生命周期回调函数。 - 通过
backgroundTaskManager.startContinuousTask
接口启动长时任务。 - 在
onContinuousTaskStart
回调中执行任务逻辑。 - 在
onContinuousTaskStop
回调中停止任务逻辑。 代码示例:
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
接口停止任务。
代码示例:
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 后台开发的基础,它们分别适用于不同场景的后台任务。我们需要根据实际需求选择合适的后台任务类型,并结合具体的开发场景进行应用开发。同时,咱们也需要注意后台任务的资源配额和系统约束,避免过度消耗设备资源。
Posted on November 2, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
November 29, 2024
November 29, 2024
November 29, 2024
November 29, 2024