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 开发者官方文档 找到最新的版本号。
主要特点
- 向后兼容:自动选择适合设备 Android 版本的实现方式(JobScheduler、AlarmManager 或 BroadcastReceiver)
- 保证执行:即使应用退出或设备重启,任务也会被执行
- 灵活调度:支持一次性任务和周期性任务
- 约束条件:可以设置任务执行的条件(如网络状态、充电状态等)
- 链式任务:支持任务链和并行任务
核心概念
-
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) {
// 任务完成
}
});
高级特性
- 输入/输出数据:可以通过
Data类传递数据 - 任务链:使用
beginWith()和then()方法创建顺序任务链 - 唯一工作序列:使用
enqueueUniqueWork()确保同一时间只有一个特定任务在运行 - 任务取消:可以通过 ID 或标签取消任务
适用场景
- 需要可靠执行的后台任务(如日志上传、数据同步)
- 需要满足特定条件才执行的任务(如仅在充电时备份数据)
- 需要延迟执行的任务
- 需要周期性执行的任务
WorkManager 是处理后台任务的推荐解决方案,特别适合那些不需要立即执行但必须最终完成的任务。