work-scheduler-dev-guide.md 6.4 KB
Newer Older
1 2 3 4
# 延迟任务调度开发指导

## 场景介绍

5
应用要执行对实时性要求不高的任务的时候,比如设备空闲时候做一次数据学习等场景,可以使用延迟调度任务,该机制在满足应用设定条件的时候,会根据系统当前状态,如内存、功耗、温度等统一决策调度时间。
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24


## 接口说明
注册相关接口包导入:
```js
import workScheduler from '@ohos.workScheduler';
```

回调相关接口包导入:
```js
import WorkSchedulerExtensionAbility from '@ohos.WorkSchedulerExtensionAbility';
```

### 延迟任务调度

**表1** workScheduler主要接口

接口名                                                    |     接口描述                            
---------------------------------------------------------|-----------------------------------------
Z
zengyawen 已提交
25 26 27 28 29 30 31 32 33
startWork(work: WorkInfo): boolean; | 延迟调度任务申请 
stopWork(work: WorkInfo, needCancel?: boolean): boolean;        | 延迟调度任务取消 
getWorkStatus(workId: number, callback: AsyncCallback\<WorkInfo>): void;| 获取延迟调度任务状态(Callback形式) 
getWorkStatus(workId: number): Promise\<WorkInfo>; | 获取延迟调度任务状态(Promise形式) 
obtainAllWorks(callback: AsyncCallback\<void>): Array\<WorkInfo>;| 获取所有延迟调度任务(Callback形式) 
obtainAllWorks(): Promise<Array\<WorkInfo>>;| 获取所有延迟调度任务(Promise形式) 
stopAndClearWorks(): boolean;| 停止并清除任务
isLastWorkTimeOut(workId: number, callback: AsyncCallback\<void>): boolean;| 获取上次任务是否超时(针对RepeatWork,Callback形式)
isLastWorkTimeOut(workId: number): Promise\<boolean>;| 获取上次任务是否超时(针对RepeatWork,Promise形式)
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

**表2** WorkInfo包含参数

接口名|描述|类型                           
---------------------------------------------------------|-----------------------------------------|---------------------------------------------------------
workId | 延迟任务Id(必填)|number
bundleName | 延迟任务包名(必填)|string
abilityName | 延迟任务回调通知的组件名(必填)|string
networkType | 网络类型 | NetworkType
isCharging | 是否充电 | boolean
chargerType | 充电类型 | ChargingType
batteryLevel | 电量| number
batteryStatus| 电池状态|    BatteryStatus
storageRequest|存储状态|    StorageRequest
isRepeat|是否循环任务|    boolean
repeatCycleTime |循环间隔|    number
repeatCount    |循环次数| number

**表3** 延迟任务回调接口

接口名                                                    |     接口描述                            
---------------------------------------------------------|-----------------------------------------
Z
zengyawen 已提交
56 57
onWorkStart(work: WorkInfo): void; | 延迟调度任务开始回调
onWorkStop(work: WorkInfo): void; | 延迟调度任务结束回调
58 59 60 61 62 63

### 开发步骤

**开发对应的Extension**

    import WorkSchedulerExtensionAbility from '@ohos.WorkSchedulerExtensionAbility';
Z
zengyawen 已提交
64
    
65 66 67 68 69 70 71 72 73 74
    export default class MyWorkSchedulerExtensionAbility extends WorkSchedulerExtensionAbility {
        onWorkStart(workInfo) {
            console.log('MyWorkSchedulerExtensionAbility onWorkStart' + JSON.stringify(workInfo));
        }
        onWorkStop(workInfo) {
            console.log('MyWorkSchedulerExtensionAbility onWorkStop' + JSON.stringify(workInfo));
        }
    }


75
**注册延迟任务**
76 77

    import workScheduler from '@ohos.workScheduler';
Z
zengyawen 已提交
78
    
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
    let workInfo = {
        workId: 1,
        batteryLevel:50,
        batteryStatus:workScheduler.BatteryStatus.BATTERY_STATUS_LOW,
        isRepeat: false,
        isPersisted: true,
        bundleName: "com.example.myapplication",
        abilityName: "MyExtension"
    }
    var res = workScheduler.startWork(workInfo);
    console.info("workschedulerLog res:" + res);


**取消延迟任务**


    import workScheduler from '@ohos.workScheduler';
Z
zengyawen 已提交
96
    
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
    let workInfo = {
        workId: 1,
        batteryLevel:50,
        batteryStatus:workScheduler.BatteryStatus.BATTERY_STATUS_LOW,
        isRepeat: false,
        isPersisted: true,
        bundleName: "com.example.myapplication",
        abilityName: "MyExtension"
    }
    var res = workScheduler.stopWork(workInfo, false);
    console.info("workschedulerLog res:" + res);


**获取指定延迟任务**

1.Callback写法

    workScheduler.getWorkStatus(50, (err, res) => {
      if (err) {
陈明 已提交
116
        console.info('workschedulerLog getWorkStatus failed, because:' + err.code);
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
      } else {
        for (let item in res) {
          console.info('workschedulerLog getWorkStatuscallback success,' + item + ' is:' + res[item]);
        }
      }
    });


2.Promise写法

    workScheduler.getWorkStatus(50).then((res) => {
      for (let item in res) {
        console.info('workschedulerLog getWorkStatus success,' + item + ' is:' + res[item]);
      }
    }).catch((err) => {
陈明 已提交
132
      console.info('workschedulerLog getWorkStatus failed, because:' + err.code);
133 134 135 136 137 138 139 140 141
    })


**获取所有延迟任务**

1.Callback写法

    workScheduler.obtainAllWorks((err, res) =>{
      if (err) {
陈明 已提交
142
        console.info('workschedulerLog obtainAllWorks failed, because:' + err.code);
143 144 145 146 147 148 149 150 151 152
      } else {
        console.info('workschedulerLog obtainAllWorks success, data is:' + JSON.stringify(res));
      }
    });

2.Promise写法

    workScheduler.obtainAllWorks().then((res) => {
      console.info('workschedulerLog obtainAllWorks success, data is:' + JSON.stringify(res));
    }).catch((err) => {
陈明 已提交
153
      console.info('workschedulerLog obtainAllWorks failed, because:' + err.code);
154 155 156 157 158 159 160 161 162 163 164 165 166
    })

**停止并清除任务**

    let res = workScheduler.stopAndClearWorks();
    console.info("workschedulerLog res:" + res);

**判断上次执行是否超时**

1.Callback写法

    workScheduler.isLastWorkTimeOut(500, (err, res) =>{
      if (err) {
陈明 已提交
167
        console.info('workschedulerLog isLastWorkTimeOut failed, because:' + err.code);
168 169 170 171 172 173 174 175 176 177 178 179
      } else {
        console.info('workschedulerLog isLastWorkTimeOut success, data is:' + res);
      }
    });

2.Promise写法

    workScheduler.isLastWorkTimeOut(500)
      .then(res => {
        console.info('workschedulerLog isLastWorkTimeOut success, data is:' + res);
      })
      .catch(err =>  {
陈明 已提交
180
        console.info('workschedulerLog isLastWorkTimeOut failed, because:' + err.code);
181
      });
陈明 已提交
182
    })