Skip to content

后台任务管理

鸿蒙后台任务:WorkScheduler、延迟任务、长时任务、后台模式。


1. 后台任务概述

1.1 后台任务类型

类型说明适用场景
短时任务< 10 分钟数据同步、文件上传
长时任务> 10 分钟音乐播放、导航
延迟任务指定时间执行定时提醒、定时同步
周期任务周期性执行定时备份、轮询

1.2 后台限制

后台任务限制:
├─ 默认情况下后台活动受限
├─ 需要申请后台模式
├─ 系统可能杀死后台进程
└─ 需合理使用 WorkScheduler

2. 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"