WorkManager :后台任务&WorkManager概述

2,045 阅读4分钟

为了创建既能迅速响应用户、又能遵守 Android 平台政策规定的 Android 应用,在后台处理数据是重要的一环。

后台任务的类别

后台任务分为以下几个主要类别:

  • 即时任务
  • 延期任务
  • 精确任务

如需对任务进行分类,请回答以下问题,并遍历图 1 中的相应决策树:

  • 任务是否需要在用户与应用进行互动时完成?

    如果是,则应将此任务归类为即时任务。 如果不是,请继续回答第二个问题。

  • 任务是否需要在精确的时间点运行?

    如果您确实需要在精确的时间点运行任务,则应将任务归类为精确任务。

大多数任务不需要在精确的时间点运行。通常,任务允许运行的时间点存在细微差异,具体取决于网络可用性和剩余电量等条件。无需在精确时间点运行的任务应归类为延期任务。

task-category-tree.png

推荐的解决方案

下面几部分将介绍针对各个后台任务类型的推荐解决方案。

即时任务

对于应在用户离开特定作用域或完成某项互动时结束的任务,我们建议使用 Kotlin 协程。许多 Android KTX 库都包含适用于常见应用组件(如 ViewModel)和常见应用生命周期的现成可用的协程作用域。

如果您是 Java 编程语言用户,可以使用线程,并且使用Handler跟主线程进行通信

对于应立即执行并需要继续处理的任务,即使用户将应用放在后台运行或重启设备,我们也建议使用WorkManager并利用其对长时间运行的任务的支持。

在特定情况下(例如使用媒体播放或主动导航功能时),您可能希望直接使用前台服务。

延期任务

凡是不直接与用户互动相关且日后可随时运行的任务,都可以延期执行。建议为延期任务使用 WorkManager解决方案。

如果您希望某些可延期异步任务即使在应用退出或设备重启后仍能正常运行,使用 WorkManager 可以轻松地调度这些任务。

精确任务

需要在精确时间点执行的任务可以使用 AlarmManager

WorkManager的概述

WorkManager 是一个 API,可供您轻松调度那些即使在退出应用或重启设备后仍应运行的可靠异步任务。WorkManager API 是一个适合用来替换所有先前的 Android 后台调度 API(包括 FirebaseJobDispatcherGcmNetworkManagerJobScheduler)的组件,我们也建议您这样做。WorkManager 在其现代、一致的 API 中整合了其前身的功能,该 API 支持 API 级别 14,在开发时即考虑到了对电池续航的影响。

在后台,WorkManager 根据以下条件使用底层作业来调度服务:

overview-criteria.png

WorkManager的优势

除了具备更为简单且一致的 API 之外,WorkManager 还具备许多其他关键优势,其中包括:

工作约束

使用工作约束明确定义工作运行的最佳条件。(例如,仅在设备采用 Wi-Fi 网络连接时、当设备处于空闲状态或者有足够的存储空间时运行。)

强大的调度

WorkManager 允许您使用灵活的调度窗口调度工作,以运行一次性重复工作。您还可以对工作进行标记或命名,以便调度唯一的、可替换的工作以及监控或取消工作组。已调度的工作存储在内部托管的 SQLite 数据库中,由 WorkManager 负责确保该工作持续进行,并在设备重新启动后重新调度。此外,WorkManager 遵循低电耗模式等省电功能和最佳做法,因此您在这方面无需担心。

灵活的重试政策

有时工作会失败。WorkManager 提供了灵活的重试政策,包括可配置的指数退避政策。

工作链

对于复杂的相关工作,您可以使用流畅自然的接口将各个工作任务串联起来,这样您便可以控制哪些部分依序运行,哪些部分并行运行。

WorkManager.getInstance(...)
    .beginWith(Arrays.asList(workA, workB))
    .then(workC)
    .enqueue();

对于每项工作任务,您可以定义工作的输入和输出数据。将工作串联在一起时,WorkManager 会自动将输出数据从一个工作任务传递给下一个工作任务。

内置线程互操作性

WorkManager 无缝集成 RxJava协程,并可灵活地插入您自己的异步 API

参考文献: developer.android.google.cn/guide/backg… developer.android.google.cn/topic/libra…