• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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    })