翻译自android官网,可直接去官网观看
Jetpack ---- WorkManager入门(一)
一、使用 WorkManager 调度任务
Android Jetpack 的一部分。
WorkManager 是一个 API,使您可以轻松调度那些即使在退出应用或重启设备时仍应运行的可延期异步任务。WorkManager API 是一个针对先前的 Android 后台调度 API(包括 FirebaseJobDispatcher、GcmNetworkManager 和 JobScheduler)的合适的建议替换组件。WorkManager 在新版一致性 API 中整合了其前身的功能,该 API 支持 API 级别 14,同时可保证电池续航时间。
在后台,WorkManager 根据以下条件使用底层作业调度服务:
如果设备在 API 级别 23 或更高级别上运行,系统会使用 JobScheduler。在 API 级别 14-22 上,系统会使用 GcmNetworkManager(如果可用),否则会使用自定义 AlarmManager 和 BroadcastReciever 实现作为备用。
注意:如果您的应用以 Android 10(API 级别 29)或更高版本为目标平台,那么在搭载 Android Marshmallow (6.0) 及更高版本的设备上将不再支持 FirebaseJobDispatcher 和 GcmNetworkManager API 调用。如需迁移指导,请参阅 FirebaseJobDispatcher 和 GcmNetworkManager 迁移指南。此外,请参阅统一 Android 上的后台任务调度公告,详细了解与弃用这些 API 相关的信息。
功能
除了具备更为简单且一致的 API 之外,WorkManager 还具备许多其他关键优势,其中包括:
工作约束
使用工作约束明确定义工作运行的最佳条件。(例如,仅在设备采用 Wi-Fi 网络连接时、当设备处于空闲状态或者有足够的存储空间时运行。)
强大的调度
WorkManager 允许您使用灵活的调度窗口调度工作,以运行一次性或重复工作。还可以对工作进行标记或命名,以便调度唯一的、可替换的工作以及监控或取消工作组。已调度的工作存储在内部托管的 SQLite 数据库中,由 WorkManager 负责确保该工作持续进行,并在设备重新启动后重新调度。此外,WorkManager 遵循低电耗模式等省电功能和最佳做法,因此您在这方面无需担心。
灵活的重试政策
有时工作会失败。WorkManager 提供了灵活的重试政策,包括可配置的指数退避政策。
工作链接
对于复杂的相关工作,请使用流畅自然的界面将各个工作任务链接在一起,这样您便可以控制哪些部分依序运行,哪些部分并行运行。
WorkManager.getInstance(...)
.beginWith(Arrays.asList(workA, workB))
.then(workC)
.enqueue();
对于每项工作任务,您可以定义工作的输入和输出数据。将工作链接在一起时,WorkManager 会自动将输出数据从一个工作任务传递给下一个工作任务。
内置线程互操作性
WorkManager 无缝集成 RxJava 和 协程,并可灵活地插入您自己的异步 API。
使用 WorkManager 实现可延期、可靠的工作
WorkManager 适用于可延期工作,即不需要立即运行但需要可靠运行的工作,即使用户退出或设备重启也不受影响。例如:
- 向后端服务发送日志或分析数据
- 定期将应用数据与服务器同步
WorkManager 不适用于应用进程结束时能够安全终止的运行中后台工作,也不适用于需要立即执行的工作。请查看后台处理指南,了解哪种解决方案符合您的需求。
二、WorkManager 使用入门
如需开始使用 WorkManager,请先将库导入您的 Android 项目中。
将以下依赖项添加到应用的 build.gradle 文件中:
dependencies {
def work_version = "2.4.0"
// (Java only)
implementation "androidx.work:work-runtime:$work_version"
// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"
// optional - RxJava2 support
implementation "androidx.work:work-rxjava2:$work_version"
// optional - GCMNetworkManager support
implementation "androidx.work:work-gcm:$work_version"
// optional - Test helpers
androidTestImplementation "androidx.work:work-testing:$work_version"
}
添加依赖项并同步 Gradle 项目后,下一步便是定义一些要运行的工作。
注意:您始终可以在 WorkManager 版本页面上找到最新版本的 WorkManager,包括 Beta 版、Alpha 版和候选版本。
定义work
Work 使用 Worker 类定义。doWork() 方法在 WorkManager 提供的后台线程上同步运行。
如需为 WorkManager 创建一些要运行的工作,请扩展 Worker 类并替换 doWork() 方法。例如,如需创建上传图像的 Worker,您可以执行以下操作:
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, upload the images.
uploadImages();
// Indicate whether the work finished successfully with the Result
return Result.success();
}
}
从 doWork() 返回的 Result 会通知 WorkManager 服务工作是否成功,以及工作失败时是否应重试工作。
- Result.success():工作成功完成。
- Result.failure():工作失败。
- Result.retry():工作失败,应根据其重试政策在其他时间尝试。
创建 WorkRequest
定义工作后,必须使用 WorkManager 服务进行调度该工作才能运行。对于如何调度工作,WorkManager 提供了很大的灵活性。您可以将其安排为在某段时间内定期运行,也可以将其安排为仅运行一次。
不论您选择以何种方式调度工作,请始终使用 WorkRequest。Worker 定义工作单元,WorkRequest(及其子类)则定义工作运行方式和时间。在最简单的情况下,您可以使用 OneTimeWorkRequest,如以下示例所示。
WorkRequest uploadWorkRequest =
new OneTimeWorkRequest.Builder(UploadWorker.class)
.build();
将 WorkRequest 提交给系统
最后,您需要使用 enqueue() 方法将 WorkRequest 提交到 WorkManager。
WorkManager
.getInstance(myContext)
.enqueue(uploadWorkRequest);
执行worker 的确切时间取决于 WorkRequest 中使用的约束和系统优化方式。WorkManager 经过设计,能够在满足这些约束的情况下提供最佳行为。
后续步骤
本入门指南只介绍了一些简单信息。WorkRequest 中还可以包含其他信息,例如在运行工作时应遵循的约束、工作输入、延迟,以及重试工作的退避时间政策。下一部分定义工作请求将更详细地介绍这些选项,以及如何调度唯一工作和重复性工作。