Appearance
后台任务管理
鸿蒙后台任务:WorkScheduler、延迟任务、长时任务、后台模式。
1. 后台任务概述
1.1 后台任务类型
| 类型 | 说明 | 适用场景 |
|---|---|---|
| 短时任务 | < 10 分钟 | 数据同步、文件上传 |
| 长时任务 | > 10 分钟 | 音乐播放、导航 |
| 延迟任务 | 指定时间执行 | 定时提醒、定时同步 |
| 周期任务 | 周期性执行 | 定时备份、轮询 |
1.2 后台限制
后台任务限制:
├─ 默认情况下后台活动受限
├─ 需要申请后台模式
├─ 系统可能杀死后台进程
└─ 需合理使用 WorkScheduler2. WorkScheduler
2.1 创建任务
typescript
import { workScheduler } from '@kit.BackgroundTaskKit'
// 创建工作请求
let workRequest = workScheduler.createWorkRequest({
workName: 'syncData',
workTag: ['sync', 'data'],
constraints: {
networkType: workScheduler.NetworkType.CONNECTED, // 需要网络
chargingRequired: false, // 不需要充电
deviceIdle: false // 不需要设备空闲
}
})
// 设置任务参数
workRequest.setParameter('userId', '12345')
workRequest.setParameter('syncType', 'full')
// 调度任务
workScheduler.enqueueWork(workRequest).then(() => {
console.log('任务已调度')
}).catch((err) => {
console.error('任务调度失败:', err.message)
})2.2 任务执行
typescript
// 继承 WorkSchedulerExtension
export default class SyncWorkScheduler extends workScheduler.WorkSchedulerExtension {
async onWorkRun(workInfo: workScheduler.WorkInfo): Promise<void> {
console.log('任务开始执行:', workInfo.workName)
let userId = workInfo.getParameter('userId')
let syncType = workInfo.getParameter('syncType')
try {
// 执行同步任务
await this.syncData(userId, syncType)
console.log('任务执行成功')
} catch (err) {
console.error('任务执行失败:', err.message)
// 任务会重试
}
}
private async syncData(userId: string, syncType: string): Promise<void> {
// 数据同步逻辑
let httpClient = http.createHttp()
await httpClient.request(`https://api.example.com/sync?userId=${userId}`)
httpClient.destroy()
}
}3. 任务配置
3.1 任务约束
typescript
// 网络约束
constraints: {
networkType: workScheduler.NetworkType.CONNECTED, // 需要网络
// 或
networkType: workScheduler.NetworkType.UNMETERED, // WiFi
networkType: workScheduler.NetworkType.NOT_REQUIRED // 不需要网络
}
// 充电约束
constraints: {
chargingRequired: true // 只在充电时执行
}
// 设备空闲约束
constraints: {
deviceIdle: true // 只在设备空闲时执行
}
// 存储约束
constraints: {
storageNotLow: true // 存储空间充足时执行
}3.2 任务重试策略
typescript
// 设置重试策略
workRequest.setRetryPolicy({
retryPolicy: workScheduler.RetryPolicy.EXPONENTIAL, // 指数退避
initialBackoff: 1000, // 初始重试间隔 1 秒
maxBackoff: 3600000, // 最大重试间隔 1 小时
backoffPolicy: workScheduler.BackoffPolicy.EXPONENTIAL
})4. 后台模式
4.1 申请后台模式
typescript
import { backgroundTaskManager } from '@kit.BackgroundTaskKit'
// 申请后台模式
let task = await backgroundTaskManager.startTask({
type: backgroundTaskManager.TaskType.DATA_TRANSFER, // 数据传输
name: 'uploadTask'
})
if (task) {
console.log('后台模式已启动')
// 执行后台任务
await this.uploadLargeFile()
// 任务完成后停止后台模式
backgroundTaskManager.stopTask(task)
}4.2 后台模式类型
后台模式类型:
├─ DATA_TRANSFER(数据传输)
├─ AUDIO_PLAYBACK(音频播放)
├─ LOCATION(定位)
├─ BLUETOOTH(蓝牙)
└─ CUSTOM(自定义)5. 面试高频考点
Q1: 后台任务如何实现?
回答:使用 WorkScheduler 创建 WorkRequest,设置约束条件(网络/充电/空闲),继承 WorkSchedulerExtension 实现 onWorkRun。
Q2: 后台模式如何申请?
回答:backgroundTaskManager.startTask({ type, name }),任务完成后 stopTask。
🐱 小猫提示:后台任务记住 "WorkScheduler、约束条件、RetryPolicy 重试、后台模式 startTask/stopTask"。