HarmonyOS 应用开发《掌上英语》第91篇:应用退至后台后执行延时任务

发布时间:2026/8/4 18:27:47
HarmonyOS 应用开发《掌上英语》第91篇:应用退至后台后执行延时任务 延迟任务(ArkTS)概述功能介绍应用退至后台后需要执行时效性要求不高的任务例如有网络时不定期主动获取邮件等可以使用延迟任务。当应用满足设定的触发条件包括网络类型、充电类型、存储状态、电池状态、定时状态等时将任务添加到执行队列系统会根据内存、功耗、设备温度、用户使用习惯等统一调度拉起应用执行相应的延迟任务。运行原理图1延迟任务实现原理应用调用延迟任务接口添加、删除、查询延迟任务延迟任务管理模块会根据任务设置的条件通过WorkInfo参数设置包括网络类型、充电类型、存储状态等和系统状态包括内存、功耗、设备温度、用户使用习惯等统一决策调度时机。当满足调度条件或调度结束时系统会回调应用WorkSchedulerExtensionAbility中 onWorkStart() 或 onWorkStop() 的方法同时会为应用单独创建一个Extension扩展进程用以承载WorkSchedulerExtensionAbility并给WorkSchedulerExtensionAbility一定的活动周期开发者可以在对应回调方法中实现自己的任务逻辑。约束与限制数量限制一个应用同一时刻最多申请10个延迟任务。执行频率限制系统会根据 设备使用信息统计应用的活跃分组 对延迟任务做分级管控限制延迟任务调度的执行频率。 通过能效资源接口申请了WORK_SCHEDULER资源的应用会被放在能效资源豁免分组中。表1应用活跃程度分组应用活跃分组延迟任务执行频率活跃分组最小间隔2小时经常使用分组最小间隔4小时常用分组最小间隔24小时极少使用分组最小间隔48小时受限使用分组禁止从未使用分组禁止能效资源豁免分组不受限制超时WorkSchedulerExtensionAbility单次回调最长运行2分钟。如果超时不取消系统会终止对应的Extension进程。 对于系统特权应用可以通过能效资源接口申请WORK_SCHEDULER资源扩展单次回调运行时长扩展后在充电状态下为20分钟非充电状态下为10分钟。调度延迟系统会根据内存、功耗、设备温度、用户使用习惯等统一调度如当系统内存资源不足或温度达到一定档位时系统将延迟调度该任务。WorkSchedulerExtensionAbility接口调用限制为保障系统安全性和稳定性防止延迟任务滥用系统资源对WorkSchedulerExtensionAbility能力进行管控在WorkSchedulerExtensionAbility中限制以下接口的调用ohos.resourceschedule.backgroundTaskManager (后台任务管理)ohos.backgroundTaskManager (后台任务管理)ohos.multimedia.camera (相机管理)ohos.multimedia.audio (音频管理)ohos.multimedia.media (媒体服务)接口说明表2延迟任务主要接口以下是延迟任务开发使用的相关接口更多接口及使用方式请见延迟任务调度文档。接口名接口描述startWork(work: WorkInfo): void申请延迟任务。stopWork(work: WorkInfo, needCancel?: boolean): void取消延迟任务。getWorkStatus(workId: number, callback: AsyncCallbackWorkInfo): void获取延迟任务状态Callback形式。getWorkStatus(workId: number): PromiseWorkInfo获取延迟任务状态Promise形式。obtainAllWorks(callback: AsyncCallbackArrayWorkInfo): void获取所有延迟任务Callback形式。obtainAllWorks(): PromiseArrayWorkInfo获取所有延迟任务Promise形式。stopAndClearWorks(): void停止并清除任务。isLastWorkTimeOut(workId: number, callback: AsyncCallbackboolean): void获取上次任务是否超时针对RepeatWorkCallback形式。isLastWorkTimeOut(workId: number): Promiseboolean获取上次任务是否超时针对RepeatWorkPromise形式。表3延迟任务回调接口以下是延迟任务回调开发使用的相关接口更多接口及使用方式请见延迟任务调度回调文档。接口名接口描述onWorkStart(work: workScheduler.WorkInfo): void延迟调度任务开始的回调。onWorkStop(work: workScheduler.WorkInfo): void延迟调度任务结束的回调。开发步骤延迟任务调度开发步骤分为两步实现延迟任务调度扩展能力、实现延迟任务调度。延迟任务调度扩展能力实现WorkSchedulerExtensionAbility开始和结束的回调接口。延迟任务调度调用延迟任务接口实现延迟任务申请、取消等功能。实现延迟任务回调扩展能力新建工程目录。在工程entry Module对应的ets目录(./entry/src/main/ets)下新建目录及ArkTS文件例如新建一个目录并命名为WorkSchedulerAbility。在WorkSchedulerAbility目录下新建一个ArkTS文件并命名为WorkSchedulerAbility.ets用以实现延迟任务回调接口。导入模块。import {workScheduler, WorkSchedulerExtensionAbility} from kit.BackgroundTasksKit;实现WorkSchedulerExtension生命周期接口。exportdefaultclassWorkSchedulerAbilityextendsWorkSchedulerExtensionAbility{// 延迟任务开始回调onWorkStart(workInfo:workScheduler.WorkInfo){console.info(onWorkStart, workInfo ${JSON.stringify(workInfo)});// 打印 parameters中的参数如参数key1console.info(work info parameters:${JSON.parse(workInfo.parameters?.toString()).key1});}// 延迟任务结束回调。当延迟任务2分钟超时或应用调用stopWork接口取消任务时触发该回调。onWorkStop(workInfo:workScheduler.WorkInfo){console.info(onWorkStop, workInfo is${JSON.stringify(workInfo)});}}在module.json5配置文件中注册WorkSchedulerExtensionAbility并设置如下标签type标签设置为“workScheduler”。srcEntry标签设置为当前ExtensionAbility组件所对应的代码路径。{ module: { // ... extensionAbilities: [ { name: WorkSchedulerAbility, srcEntry: ./ets/WorkSchedulerAbility/WorkSchedulerAbility.ets, type: workScheduler, // ... } ] } }实现延迟任务调度导入模块。import { BusinessError } from kit.BasicServicesKit; import { workScheduler } from kit.BackgroundTasksKit;申请延迟任务。let workInfo: workScheduler.WorkInfo { workId: 1, networkType: workScheduler.NetworkType.NETWORK_TYPE_ANY, bundleName: ohos.samples.workschedulerextensionability, abilityName: WorkSchedulerAbility, // ... } try { workScheduler.startWork(workInfo); console.info(startWork success); } catch (error) { console.error(startWork failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}); }取消延迟任务。// 创建workinfoletworkInfo:workScheduler.WorkInfo{workId:1,networkType:workScheduler.NetworkType.NETWORK_TYPE_WIFI,bundleName:ohos.samples.workschedulerextensionability,abilityName:WorkSchedulerAbility,}try{workScheduler.stopWork(workInfo);console.info(stopWork success);}catch(error){console.error(stopWork failed. code is${(errorasBusinessError).code}message is${(errorasBusinessError).message});}延迟任务调度功能验证确认延迟任务WorkSchedulerExtensionAbility回调方法onWorkStart、onWorkStop实现是否正确、是否可以成功回调延迟任务申请成功之后需要等到条件满足后才可以执行延迟任务回调为了快速验证延迟任务回调功能是否正确可以通过以下hidumper命令手动触发延迟任务执行回调。$ hidumper-s1904-a-t com.example.application MyWorkSchedulerExtensionAbility-------------------------------[ability]-----------------------------------------------------------------WorkSchedule----------------------------------相关实例针对延迟任务调度的开发有以下相关示例可供参考延迟任务调度ArkTSAPI9