1# 延迟任务调度开发指导 2 3## 场景介绍 4 5应用要执行对实时性要求不高的任务的时候,比如设备空闲时候做一次数据学习等场景,可以使用延迟调度任务,该机制在满足应用设定条件的时候,会根据系统当前状态,如内存、功耗、热等统一决策调度时间。 6 7 8## 接口说明 9注册相关接口包导入: 10```js 11import workScheduler from '@ohos.workScheduler'; 12``` 13 14回调相关接口包导入: 15```js 16import WorkSchedulerExtensionAbility from '@ohos.WorkSchedulerExtensionAbility'; 17``` 18 19### 延迟任务调度 20 21**表1** workScheduler主要接口 22 23接口名 | 接口描述 24---------------------------------------------------------|----------------------------------------- 25startWork(work: WorkInfo): boolean | 延迟调度任务申请 26stopWork(work: WorkInfo, needCancel?: boolean): boolean | 延迟调度任务取消 27getWorkStatus(workId: number, callback: AsyncCallback\<WorkInfo>): void| 获取延迟调度任务状态(Callback形式) 28getWorkStatus(workId: number): Promise\<WorkInfo> | 获取延迟调度任务状态(Promise形式) 29obtainAllWorks(callback: AsyncCallback\<void>): Array\<WorkInfo>| 获取所有延迟调度任务(Callback形式) 30obtainAllWorks(): Promise<Array\<WorkInfo>>| 获取所有延迟调度任务(Promise形式) 31stopAndClearWorks(): boolean| 停止并清除任务 32isLastWorkTimeOut(workId: number, callback: AsyncCallback\<void>): boolean| 获取上次任务是否超时(针对RepeatWork,Callback形式) 33isLastWorkTimeOut(workId: number): Promise\<boolean>| 获取上次任务是否超时(针对RepeatWork,Promise形式) 34 35**表2** WorkInfo包含参数 36 37> **说明:** WorkInfo设置参数约束见[延迟任务调度概述](./work-scheduler-overview.md) 38 39参数名| 类型 |描述 40---------------------------------------------------------|-----------------------------------------|--------------------------------------------------------- 41workId| number | 延迟任务Id(必填) 42bundleName| string | 延迟任务包名(必填) 43abilityName| string | 延迟任务回调通知的组件名(必填) 44networkType | [NetworkType](../reference/apis/js-apis-workScheduler.md/#networktype) | 网络类型 45isCharging| boolean | 是否充电 46chargerType| [ChargingType](../reference/apis/js-apis-workScheduler.md/#chargingtype) | 充电类型 47batteryLevel| number | 电量 48batteryStatus| [BatteryStatus](../reference/apis/js-apis-workScheduler.md/#batterystatus) | 电池状态 49storageRequest| [StorageRequest](../reference/apis/js-apis-workScheduler.md/#storagerequest) |存储状态 50isRepeat| boolean |是否循环任务 51repeatCycleTime| number |循环间隔 52repeatCount | number|循环次数 53 54**表3** 延迟任务回调接口 55 56接口名 | 接口描述 57---------------------------------------------------------|----------------------------------------- 58onWorkStart(work: WorkInfo): void | 延迟调度任务开始回调 59onWorkStop(work: WorkInfo): void | 延迟调度任务结束回调 60 61### 开发步骤 62 63**开发对应的Extension** 64 65 import WorkSchedulerExtensionAbility from '@ohos.WorkSchedulerExtensionAbility'; 66 67 export default class MyWorkSchedulerExtensionAbility extends WorkSchedulerExtensionAbility { 68 onWorkStart(workInfo) { 69 console.log('MyWorkSchedulerExtensionAbility onWorkStart' + JSON.stringify(workInfo)); 70 } 71 onWorkStop(workInfo) { 72 console.log('MyWorkSchedulerExtensionAbility onWorkStop' + JSON.stringify(workInfo)); 73 } 74 } 75 76 77**注册延迟任务** 78 79 80 81 import workScheduler from '@ohos.workScheduler'; 82 83 let workInfo = { 84 workId: 1, 85 batteryLevel:50, 86 batteryStatus:workScheduler.BatteryStatus.BATTERY_STATUS_LOW, 87 isRepeat: false, 88 isPersisted: true, 89 bundleName: "com.example.myapplication", 90 abilityName: "MyExtension" 91 } 92 var res = workScheduler.startWork(workInfo); 93 console.info("workschedulerLog res:" + res); 94 95 96**取消延迟任务** 97 98 99 import workScheduler from '@ohos.workScheduler'; 100 101 let workInfo = { 102 workId: 1, 103 batteryLevel:50, 104 batteryStatus:workScheduler.BatteryStatus.BATTERY_STATUS_LOW, 105 isRepeat: false, 106 isPersisted: true, 107 bundleName: "com.example.myapplication", 108 abilityName: "MyExtension" 109 } 110 var res = workScheduler.stopWork(workInfo, false); 111 console.info("workschedulerLog res:" + res); 112 113 114**获取指定延迟任务** 115 1161.Callback写法 117 118 workScheduler.getWorkStatus(50, (err, res) => { 119 if (err) { 120 console.info('workschedulerLog getWorkStatus failed, because:' + err.data); 121 } else { 122 for (let item in res) { 123 console.info('workschedulerLog getWorkStatuscallback success,' + item + ' is:' + res[item]); 124 } 125 } 126 }); 127 128 1292.Promise写法 130 131 workScheduler.getWorkStatus(50).then((res) => { 132 for (let item in res) { 133 console.info('workschedulerLog getWorkStatus success,' + item + ' is:' + res[item]); 134 } 135 }).catch((err) => { 136 console.info('workschedulerLog getWorkStatus failed, because:' + err.data); 137 }) 138 139 140**获取所有延迟任务** 141 1421.Callback写法 143 144 workScheduler.obtainAllWorks((err, res) =>{ 145 if (err) { 146 console.info('workschedulerLog obtainAllWorks failed, because:' + err.data); 147 } else { 148 console.info('workschedulerLog obtainAllWorks success, data is:' + JSON.stringify(res)); 149 } 150 }); 151 1522.Promise写法 153 154 workScheduler.obtainAllWorks().then((res) => { 155 console.info('workschedulerLog obtainAllWorks success, data is:' + JSON.stringify(res)); 156 }).catch((err) => { 157 console.info('workschedulerLog obtainAllWorks failed, because:' + err.data); 158 }) 159 160**停止并清除任务** 161 162 let res = workScheduler.stopAndClearWorks(); 163 console.info("workschedulerLog res:" + res); 164 165**判断上次执行是否超时** 166 1671.Callback写法 168 169 workScheduler.isLastWorkTimeOut(500, (err, res) =>{ 170 if (err) { 171 console.info('workschedulerLog isLastWorkTimeOut failed, because:' + err.data); 172 } else { 173 console.info('workschedulerLog isLastWorkTimeOut success, data is:' + res); 174 } 175 }); 176 1772.Promise写法 178 179 workScheduler.isLastWorkTimeOut(500) 180 .then(res => { 181 console.info('workschedulerLog isLastWorkTimeOut success, data is:' + res); 182 }) 183 .catch(err => { 184 console.info('workschedulerLog isLastWorkTimeOut failed, because:' + err.data); 185 }); 186 })