
回复
哈喽!我是小L,那个在鸿蒙后台「和时间博弈」的女程序员~ 你知道吗?合理的延迟任务调度能让应用功耗降低40%!今天就来揭秘鸿蒙延迟任务的「智能触发器」——网络状态、电量阈值、充电场景、时间窗口四大维度组合,让任务「该出手时才出手」,做最懂设备状态的「时间管理大师」!
维度 | 选项 | 典型组合场景 | 任务类型 |
---|---|---|---|
网络类型 | WIFI_ONLY | 仅在WiFi下执行大文件上传 | 数据同步 |
电池电量 | >80% | 高电量时执行高功耗任务 | 视频转码 |
充电状态 | CHARGING_WIRELESS | 无线充电时更新系统缓存 | 应用升级 |
时间窗口 | 00:00-06:00(夜间) | 凌晨自动清理日志 | 系统维护 |
const workInfo: WorkInfo = {
workId: 'daily-cleanup', // 唯一任务ID(必填)
networkType: NetworkType.NETWORK_TYPE_WIFI, // 网络类型(可选)
batteryLevel: 30, // 电量阈值(%,可选,需配合batteryLevelTriggerType)
batteryLevelTriggerType: BatteryLevelTriggerType.BATTERY_LEVEL_ABOVE, // 高于阈值触发
chargerType: ChargingType.CHARGER_TYPE_FAST, // 充电类型(可选)
triggerTime: '02:00', // 每日触发时间(可选,格式HH:mm)
repeatCycleTime: 24 * 60 * 60 * 1000, // 重复周期(毫秒,可选)
maxExecutionCount: 3, // 最大执行次数(失败重试)
replaceMode: WorkReplaceMode.WORK_REPLACE_MODE_UPDATE_EXISTING // 重复任务处理策略
};
const mapUpdateWork: WorkInfo = {
workId: 'map-offline-update',
networkType: NetworkType.NETWORK_TYPE_WIFI, // 仅限WiFi
batteryLevelTriggerType: BatteryLevelTriggerType.BATTERY_LEVEL_ABOVE,
batteryLevel: 50, // 电量>50%
abilityName: 'MapUpdateExtensionAbility',
triggerContent: {
// 合并同类任务(避免WiFi切换时重复触发)
scheduleType: ScheduleType.SCHEDULE_TYPE_EXACT,
exactTime: new Date().setHours(23, 0, 0) // 每天23点
}
};
workScheduler.startWork(mapUpdateWork);
const healthSyncWork: WorkInfo = {
workId: 'health-data-sync',
chargerType: ChargingType.CHARGER_TYPE_WIRED, // 有线充电时
batteryLevelTriggerType: BatteryLevelTriggerType.BATTERY_LEVEL_ABOVE,
batteryLevel: 90, // 电量>90%(避免充电初期高功耗)
abilityName: 'HealthSyncExtensionAbility',
repeatCycleTime: 7 * 24 * 60 * 60 * 1000, // 每周同步一次
maxExecutionCount: 2 // 最多重试1次
};
workScheduler.startWork(healthSyncWork);
const flashSaleWork: WorkInfo = {
workId: 'flash-sale-reminder',
triggerTime: '20:59:50', // 秒杀前10秒触发
scheduleType: ScheduleType.SCHEDULE_TYPE_EXACT, // 精准触发
abilityName: 'ReminderExtensionAbility',
// 触发失败处理:转为代理提醒
fallbackToAgent: true,
agentInfo: {
reminderType: ReminderType.REMINDER_TYPE_TIMER,
triggerTimeInSeconds: Date.now() + 600 // 最多延迟10分钟
}
};
workScheduler.startWork(flashSaleWork);
SCHEDULE_TYPE_EXACT
确保准时优先级 | 触发条件 | 执行策略 | 典型场景 |
---|---|---|---|
紧急 | 含urgent 标签 |
立即执行,打断低优先级任务 | 地震预警、交易通知 |
高 | 时间窗口+网络条件匹配 | 5分钟内执行 | 会议提醒、外卖接单 |
中 | 充电+电量条件匹配 | 30分钟内执行 | 软件更新、数据备份 |
低 | 仅后台空闲时 | 合并到系统维护时段执行 | 日志上报、缓存清理 |
// 合并同类任务(如天气更新)
workInfo.triggerContent = {
mergePolicy: MergePolicy.MERGE_POLICY_COALESCE, // 合并相同任务
coalesceDelay: 30 * 60 * 1000 // 30分钟内重复触发则合并
};
// 系统自动将多个天气更新请求合并为一次执行
用户希望相册在连接WiFi且充电时自动备份,每日最多执行一次,失败则次日重试
// PhotoBackupExtensionAbility.ts
export default class PhotoBackupExtensionAbility extends WorkSchedulerExtensionAbility {
onStart(workInfo: WorkInfo) {
console.info('开始备份相册...');
backupPhotosToCloud().then(() => {
console.info('备份完成');
workScheduler.cancelWork(workInfo.workId); // 成功后取消任务
}).catch((error) => {
console.error('备份失败:', error);
// 失败后不重试(依赖maxExecutionCount)
});
}
}
const backupWork: WorkInfo = {
workId: 'photo-backup',
networkType: NetworkType.NETWORK_TYPE_WIFI,
chargerType: ChargingType.CHARGER_TYPE_ANY, // 有线/无线充电均可
batteryLevelTriggerType: BatteryLevelTriggerType.BATTERY_LEVEL_ABOVE,
batteryLevel: 20, // 电量>20%(充电时通常高于此阈值)
triggerTime: '01:00', // 凌晨1点(用户睡眠时段)
repeatCycleTime: 24 * 60 * 60 * 1000, // 每日一次
maxExecutionCount: 1, // 失败后次日重试
// 任务描述(供系统调度参考)
description: '自动相册备份,需WiFi和充电',
// 关联前台应用(提升调度优先级)
relatedAbility: 'com.example.photos.MainAbility'
};
// 在应用主逻辑中监听电量变化
powerManager.onBatteryLevelChanged((level) => {
if (level < 10) {
// 极低电量时取消所有延迟任务
workScheduler.cancelAllWorks();
} else if (level > 30 && isCharging()) {
// 恢复备份任务
workScheduler.startWork(backupWork);
}
});
triggerTime
必须为HH:mm
格式,如'25:60'
会导致解析失败workId
的任务只能存在一个,需配合replaceMode
处理getWorkStatus
查询repeatCycleTime
的使用频率mergePolicy
启用任务合并chargerType
,低版本需做兼容处理// 将任务发送到华为手表执行(需设备配对)
const deviceId = 'watch-12345';
workScheduler.startWorkOnDevice(workInfo, deviceId);
// 任务B依赖任务A完成(如A下载数据,B处理数据)
workScheduler.addWorkDependency('download-task', 'process-task');
// 用户活跃时暂停任务,锁屏后恢复
window.on('userActive', () => {
workScheduler.pauseAllWorks();
});
window.on('userInactive', () => {
workScheduler.resumeAllWorks();
});
效率 = 触发条件精准度 × 系统协作度 ÷ 资源消耗率
WIFI+充电+夜间
),任务执行成功率越高cancelWork
),避免占用配额