使用场景:
场景 | 推荐 |
---|---|
需系统触发,不必完成 | ThreadPool + Broadcast |
需系统触发,必须完成,可推迟 | WorkManager |
需系统触发,必须完成,立即 | ForegroundService + Broadcast |
不需系统触发,不必完成 | ThreadPool |
不需系统触发,必须完成,可推迟 | WorkManager |
不需系统触发,必须完成,立即 | ForegroundService |
WorkManager 是一个 Android 库, 它在工作的触发器 (如适当的网络状态和电池条件) 满足时, 优雅地运行可推迟的后台工作。WorkManager 尽可能使用框架 JobScheduler , 以帮助优化电池寿命和批处理作业。在 Android 6.0 (API 级 23) 下面的设备上, 如果 WorkManager 已经包含了应用程序的依赖项, 则尝试使用Firebase JobDispatcher 。否则, WorkManager 返回到自定义 AlarmManager 实现, 以优雅地处理您的后台工作。
也就是说,WorkManager可以自动维护后台任务,同时可适应不同的条件,同时满足后台Service和静态广播,内部维护着JobScheduler,而在6.0以下系统版本则可自动切换为AlarmManager
具体使用:
build.gradle
implementation "androidx.work:work-runtime:2.4.0"
要执行任务的具体类:
UploadWorker.java
package com.jxd.studyone.workmanager;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
public class UploadWorker extends Worker {
public UploadWorker(
@NonNull Context context,
@NonNull WorkerParameters params) {
super(context, params);
}
@Override
public Result doWork() {
// Do the work here--in this case
Log.d("work_tag","start======");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("work_tag","end======");
/**
* Result.success():工作成功完成。
* Result.failure():工作失败。
* Result.retry():工作失败,根据其重试政策在其他时间尝试。
*/
return Result.success();
}
}
启动任务:
package com.jxd.studyone.workmanager;
import androidx.appcompat.app.AppCompatActivity;
import androidx.work.Constraints;
import androidx.work.NetworkType;
import androidx.work.OneTimeWorkRequest;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;
import androidx.work.WorkRequest;
import android.os.Bundle;
import com.jxd.studyone.R;
import java.util.concurrent.TimeUnit;
public class WorkManagerActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_work_manager);
//一次性任务
WorkRequest myWorkRequest = OneTimeWorkRequest.from(UploadWorker.class);
WorkManager.getInstance(this).enqueue(myWorkRequest);
// //定期任务
// PeriodicWorkRequest saveRequest =
// new PeriodicWorkRequest.Builder(SaveImageToFileWorker.class, 1, TimeUnit.HOURS)
// .build();
//
// //上面的代码的含义是在每小时的最后 15 分钟内运行定期工作。
// WorkRequest saveRequest2 =
// new PeriodicWorkRequest.Builder(SaveImageToFileWorker.class,
// 1, TimeUnit.HOURS,
// 15, TimeUnit.MINUTES)
// .build();
//
// //上面代码的作用是,设置任务在加入队列后至少经过 10 分钟后再运行
// WorkRequest myWorkRequest =
// new OneTimeWorkRequest.Builder(MyWork.class)
// .setInitialDelay(10, TimeUnit.MINUTES)
// .build();
// Constraints myConstraints = new Constraints.Builder()
// .setRequiresDeviceIdle(true)//指定{@link WorkRequest}运行时设备是否为空闲
// .setRequiresCharging(true)//指定要运行的{@link WorkRequest}是否应该插入设备
// .setRequiredNetworkType(NetworkType.NOT_ROAMING)
// .setRequiresBatteryNotLow(true)//指定设备电池是否不应低于临界阈值
// .setRequiresCharging(true)//网络状态
// .setRequiresDeviceIdle(true)//指定{@link WorkRequest}运行时设备是否为空闲
// .setRequiresStorageNotLow(true)//指定设备可用存储是否不应低于临界阈值
// // .addContentUriTrigger(myUri,false)//指定内容{@link android.net.Uri}时是否应该运行{@link WorkRequest}更新
// .build();
}
}