1.添加依赖
首先,确保您的项目已启用AndroidX,并在build.gradle(Module: app)文件中添加WorkManager的依赖项:
- dependencies {
- // ... 其他依赖项 ...
- implementation "androidx.work:work-runtime:2.7.1"
- // 如果您需要使用其约束服务(如WorkManager的UI库),还需要添加以下依赖:
- implementation "androidx.work:work-manager-ktx:2.7.1"
- }
2. 创建Worker类
创建一个继承自Worker的Java类,负责执行具体的后台任务逻辑:
- import android.content.Context;
- import androidx.work.Worker;
- import androidx.work.WorkerParameters;
-
- public class MyBackgroundTaskWorker extends Worker {
-
- public MyBackgroundTaskWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
- super(context, workerParams);
- }
-
- @Override
- public Result doWork() {
- // 在这里编写您的后台任务逻辑
- // 示例:执行简单的网络请求
- boolean success = performNetworkRequest();
-
- if (success) {
- return Result.success();
- } else {
- // 处理错误或重试(根据实际需求)
- return Result.failure();
- }
- }
-
- private boolean performNetworkRequest() {
- // 实现网络请求逻辑,返回true表示成功,false表示失败
- // 此处仅为示例,实际应替换为您的网络库调用
- return true;
- }
- }
3. 调度任务
在应用的适当位置(如Activity、Fragment或ViewModel)使用WorkManager来调度任务:
- import androidx.annotation.NonNull;
- import androidx.work.WorkManager;
-
- public class MainActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- // 创建OneTimeWorkRequest实例
- OneTimeWorkRequest myWorkRequest = new OneTimeWorkRequest.Builder(MyBackgroundTaskWorker.class)
- .build();
-
- // 获取WorkManager实例
- WorkManager workManager = WorkManager.getInstance(this);
-
- // 提交任务到WorkManager
- workManager.enqueue(myWorkRequest);
- }
- }
4. 配置任务参数与约束
若需要为任务指定额外参数、设置约束条件(如网络状态、设备充电状态等)或设定任务之间的依赖关系,可以如下操作:
- // 构建数据对象,传递给Worker
- Data inputData = new Data.Builder()
- .putString("key", "value")
- .build();
-
- OneTimeWorkRequest myWorkRequest = new OneTimeWorkRequest.Builder(MyBackgroundTaskWorker.class)
- .setInputData(inputData) // 设置输入数据
- .setConstraints( // 设置约束条件
- new Constraints.Builder()
- .setRequiredNetworkType(NetworkType.CONNECTED) // 需要网络连接
- .setRequiresCharging(true) // 设备需处于充电状态
- .build())
- .build();
-
- // 如果有任务依赖,可以使用WorkContinuation API
- List<OneTimeWorkRequest> dependentTasks = ...; // 创建依赖任务列表
- WorkContinuation continuation = workManager.beginWith(dependentTasks).then(myWorkRequest);
- continuation.enqueue();
5. 监听任务状态与结果
为了监听任务的状态变化或获取任务完成后的结果,可以使用WorkManager提供的回调机制:
- // 注册观察者以接收任务状态更新
- myWorkRequest.getId().observe(this, new Observer
() { - @Override
- public void onChanged(WorkInfo workInfo) {
- if (workInfo != null) {
- WorkInfo.State state = workInfo.getState();
- switch (state) {
- case ENQUEUED:
- // 任务已加入队列
- break;
- case RUNNING:
- // 任务正在运行
- break;
- case SUCCEEDED:
- // 任务成功完成
- Data outputData = workInfo.getOutputData();
- // 处理输出数据(如果有的话)
- break;
- case FAILED:
- case CANCELLED:
- // 任务失败或被取消
- break;
- }
- }
- }
- });
6. 单元测试
为了确保Worker的正确性和稳定性,可以为其编写单元测试。WorkManager提供了TestWorkerBuilder等工具类,便于模拟和验证Worker的行为:
- import androidx.work.testing.TestWorkerBuilder;
- import org.junit.Before;
- import org.junit.Test;
-
- import static org.junit.Assert.assertEquals;
-
- public class MyBackgroundTaskWorkerTest {
-
- private MyBackgroundTaskWorker worker;
-
- @Before
- public void setUp() {
- worker = new TestWorkerBuilder<MyBackgroundTaskWorker>(MyBackgroundTaskWorker.class)
- .setInputData(...) // 可选:设置测试输入数据
- .build();
- }
-
- @Test
- public void testDoWork_success() {
- // 模拟网络请求成功
- worker.setWorkerResult(Worker.Result.SUCCESS);
-
- // 执行doWork方法并验证结果
- assertEquals(Worker.Result.SUCCESS, worker.doWork());
- }
-
- @Test
- public void testDoWork_failure() {
- // 模拟网络请求失败
- worker.setWorkerResult(Worker.Result.FAILURE);
-
- // 执行doWork方法并验证结果
- assertEquals(Worker.Result.FAILURE, worker.doWork());
- }
- }