嗨~我是小L!在鸿蒙开发中,延迟任务就像「智能管家」——能根据网络、电量等条件自动触发任务,避免资源浪费。今天教你3招玩转延迟任务调度~
一、延迟任务:条件触发的「智能开关」🔌
核心场景
- 省流量同步:仅在连Wi-Fi时更新数据
- 低电量保护:电量<20%时暂停后台下载
- 充电时工作:连接充电器后自动备份大文件
触发条件「五要素」
| 条件类型 |
可选值/范围 |
示例代码 |
| 网络类型 |
WIFI/CELLULAR/NONE |
networkType: NetworkType.WIFI |
| 电池电量 |
0-100(百分比) |
batteryLevel: 30(低于30%触发) |
| 充电状态 |
WIRELESS/USB/NONE |
chargerType: ChargingType.USB |
| 存储容量 |
>1GB/<500MB等 |
storageFree: 1024(单位MB) |
| 定时任务 |
绝对时间/周期性时间 |
triggerAt: 1690000000(时间戳) |
二、实战:「Wi-Fi+充电」触发数据备份
步骤1:定义任务条件
import { WorkInfo, NetworkType, ChargingType } from '@ohos.workScheduler';
const backupWork: WorkInfo = {
workId: 1001, // 唯一标识
bundleName: 'com.example.backup',
abilityName: 'BackupTaskAbility',
networkType: NetworkType.WIFI, // 仅Wi-Fi环境
chargerType: ChargingType.WIRELESS, // 仅无线充电时
delay: 300, // 条件满足后延迟300秒执行(避免立即抢占资源)
repeatInterval: 86400, // 每天执行一次
};
步骤2:启动任务调度
function scheduleBackup() {
try {
workScheduler.startWork(backupWork);
console.log('备份任务已调度,等待条件触发');
} catch (error) {
if (error.code === 1001) {
console.log('任务已存在,无需重复调度');
}
}
}
步骤3:处理任务逻辑(在ExtensionAbility中)
export default class BackupTaskAbility {
onStart(workInfo: WorkInfo) {
if (workInfo.workId === 1001) {
this.performBackup(); // 执行备份逻辑
}
}
private async performBackup() {
// 检查网络和充电状态(双重保险)
const isWifi = await checkNetworkType(NetworkType.WIFI);
const isCharging = await checkChargingStatus();
if (isWifi && isCharging) {
await backupToCloud(); // 执行云备份
workScheduler.stopWork(workInfo.workId); // 任务完成,释放资源
}
}
}
三、系统调度:资源优化的「幕后大脑」🧠
1. 任务分组策略
| 应用活跃程度 |
执行频率限制 |
典型场景 |
| 活跃 |
至少每2小时一次 |
即时通讯App消息同步 |
| 常用 |
至少每24小时一次 |
新闻App夜间自动更新 |
| 极少使用 |
最多每48小时一次 |
低频工具类App数据清理 |
| 受限 |
禁止执行 |
被用户手动限制的App |
2. 动态调整机制
- 内存不足时:暂停非紧急任务(如图片缓存更新)
- 高温环境下:延迟执行CPU密集型任务(如图像处理)
- 低电量模式:仅允许优先级最高的任务(如紧急通知)
3. 优先级控制
const highPriorityWork: WorkInfo = {
...baseWorkInfo,
priority: WorkPriority.HIGH, // 最高优先级(默认MEDIUM)
overridePolicy: true, // 允许突破分组频率限制
};
四、避坑指南⚠️
1. 条件冲突处理
- 同时设置
batteryLevel: 20和chargerType: NONE(充电时不触发)
- 解决方案:明确任务核心条件,避免互斥
2. 任务重复调度
3. 资源释放
- 任务完成后必须调用
stopWork
- 避免在
onStart中执行耗时操作,改为异步处理
五、进阶玩法:跨设备协同调度
场景:手机+平板协同备份
- 手机端:设置任务条件(Wi-Fi+充电)
- 平板端:监听任务触发,协同上传文件
// 手机端调度任务
workScheduler.startWork({
...backupWork,
targetDeviceId: 'tablet-device-id', // 指定平板执行任务
});
// 平板端处理逻辑
export default class CrossDeviceBackupAbility {
onStart(workInfo) {
if (workInfo.targetDeviceId === 'tablet-device-id') {
// 使用平板的更大存储和算力执行备份
}
}
}
总结:延迟任务「三原则」
- 条件优先:能用条件触发的任务,绝不后台常驻
- 频率克制:根据用户使用习惯设置执行间隔
- 动态适配:结合系统资源状态调整任务优先级