Android WorkManager 简介

475 阅读2分钟

WorkManager 是 Android Jetpack 组件之一,用于管理后台任务调度。它提供了一种灵活且兼容的方式来安排可延迟的异步任务,即使应用退出或设备重启也能保证任务执行。

添加依赖

要在您的项目中使用 WorkManager,请将以下依赖项添加到您的应用或模块的 build.gradle (或 build.gradle.kts) 文件中:

dependencies {
    // 请将 "..." 替换为最新的稳定版本号, 例如 "2.9.0"
    def work_version = "..." 
    // Kotlin + Coroutines (推荐)
    implementation("androidx.work:work-runtime-ktx:$work_version")
    // Java (如果您不使用 Kotlin)
    // implementation("androidx.work:work-runtime:$work_version")
}

您可以在 Android 开发者官方文档 找到最新的版本号。

主要特点

  1. 向后兼容​:自动选择适合设备 Android 版本的实现方式(JobScheduler、AlarmManager 或 BroadcastReceiver)
  2. 保证执行​:即使应用退出或设备重启,任务也会被执行
  3. 灵活调度​:支持一次性任务和周期性任务
  4. 约束条件​:可以设置任务执行的条件(如网络状态、充电状态等)
  5. 链式任务​:支持任务链和并行任务

核心概念

  • Worker​:定义要执行的任务,继承自 Worker 类并实现 doWork() 方法

  • WorkRequest​:表示任务的请求,分为:

    • OneTimeWorkRequest:一次性任务
    • PeriodicWorkRequest:周期性任务
  • WorkManager​:管理任务队列并调度任务

  • WorkInfo​:包含任务状态和进度的信息

基本用法

1. 定义 Worker

public class MyWorker extends Worker {
    public MyWorker(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Result doWork() {
        // 执行后台任务
        return Result.success(); // 或 Result.failure()/Result.retry()
    }
}

2. 创建 WorkRequest

// 一次性任务
OneTimeWorkRequest myWorkRequest = new OneTimeWorkRequest.Builder(MyWorker.class)
        .setConstraints(new Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build())
        .build();

// 周期性任务(最小间隔15分钟)
PeriodicWorkRequest periodicWorkRequest =
        new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES)
                .build();

3. 提交任务

WorkManager.getInstance(context).enqueue(myWorkRequest);

4. 观察任务状态

WorkManager.getInstance(context)
        .getWorkInfoByIdLiveData(myWorkRequest.getId())
        .observe(lifecycleOwner, workInfo -> {
            if (workInfo != null && workInfo.getState() == WorkInfo.State.SUCCEEDED) {
                // 任务完成
            }
        });

高级特性

  1. 输入/输出数据​:可以通过 Data 类传递数据
  2. 任务链​:使用 beginWith()then() 方法创建顺序任务链
  3. 唯一工作序列​:使用 enqueueUniqueWork() 确保同一时间只有一个特定任务在运行
  4. 任务取消​:可以通过 ID 或标签取消任务

适用场景

  • 需要可靠执行的后台任务(如日志上传、数据同步)
  • 需要满足特定条件才执行的任务(如仅在充电时备份数据)
  • 需要延迟执行的任务
  • 需要周期性执行的任务

WorkManager 是处理后台任务的推荐解决方案,特别适合那些不需要立即执行但必须最终完成的任务。