延迟任务调度开发指导
场景介绍
应用要执行对实时性要求不高的任务的时候,比如设备空闲时候做一次数据学习等场景,可以使用延迟调度任务,该机制在满足应用设定条件的时候,会根据系统当前状态,如内存、功耗、热等统一决策调度时间。
接口说明
注册相关接口包导入:
import workScheduler from '@ohos.workScheduler';
回调相关接口包导入:
import WorkSchedulerExtensionAbility from '@ohos.WorkSchedulerExtensionAbility';
延迟任务调度
表1 workScheduler主要接口
接口名 | 接口描述 |
---|---|
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形式) |
表2 WorkInfo包含参数
说明: WorkInfo设置参数约束见延迟任务调度概述
参数名 | 类型 | 描述 |
---|---|---|
workId | number | 延迟任务Id(必填) |
bundleName | string | 延迟任务包名(必填) |
abilityName | string | 延迟任务回调通知的组件名(必填) |
networkType | NetworkType | 网络类型 |
isCharging | boolean | 是否充电 |
chargerType | ChargingType | 充电类型 |
batteryLevel | number | 电量 |
batteryStatus | BatteryStatus | 电池状态 |
storageRequest | StorageRequest | 存储状态 |
isRepeat | boolean | 是否循环任务 |
repeatCycleTime | number | 循环间隔 |
repeatCount | number | 循环次数 |
表3 延迟任务回调接口
接口名 | 接口描述 |
---|---|
onWorkStart(work: WorkInfo): void | 延迟调度任务开始回调 |
onWorkStop(work: WorkInfo): void | 延迟调度任务结束回调 |
开发步骤
开发对应的Extension
import WorkSchedulerExtensionAbility from '@ohos.WorkSchedulerExtensionAbility';
export default class MyWorkSchedulerExtensionAbility extends WorkSchedulerExtensionAbility {
onWorkStart(workInfo) {
console.log('MyWorkSchedulerExtensionAbility onWorkStart' + JSON.stringify(workInfo));
}
onWorkStop(workInfo) {
console.log('MyWorkSchedulerExtensionAbility onWorkStop' + JSON.stringify(workInfo));
}
}
注册延迟任务
import workScheduler from '@ohos.workScheduler';
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';
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) {
console.info('workschedulerLog getWorkStatus failed, because:' + err.data);
} 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) => {
console.info('workschedulerLog getWorkStatus failed, because:' + err.data);
})
获取所有延迟任务
1.Callback写法
workScheduler.obtainAllWorks((err, res) =>{
if (err) {
console.info('workschedulerLog obtainAllWorks failed, because:' + err.data);
} 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) => {
console.info('workschedulerLog obtainAllWorks failed, because:' + err.data);
})
停止并清除任务
let res = workScheduler.stopAndClearWorks();
console.info("workschedulerLog res:" + res);
判断上次执行是否超时
1.Callback写法
workScheduler.isLastWorkTimeOut(500, (err, res) =>{
if (err) {
console.info('workschedulerLog isLastWorkTimeOut failed, because:' + err.data);
} 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 => {
console.info('workschedulerLog isLastWorkTimeOut failed, because:' + err.data);
});
})