何时使用 JobIntentService 与 WorkManager?

Posted

技术标签:

【中文标题】何时使用 JobIntentService 与 WorkManager?【英文标题】:When to use JobIntentService vs WorkManager? 【发布时间】:2020-04-30 16:39:03 【问题描述】:

Google 最近弃用了 IntentService:https://android.googlesource.com/platform/frameworks/base.git/+/6f8b09029932dfd24945202017639754b00acc2e

IntentService 的文档现在说:

 * @deprecated IntentService is subject to all the
 *   <a href="/preview/features/background.html">background execution limits</a>
 *   imposed with Android 8.0 (API level 26). Consider using @link androidx.work.WorkManager
 *   or @link androidx.core.app.JobIntentService, which uses jobs
 *   instead of services when running on Android 8.0 or higher.

那么JobIntentService和WorkManager有什么区别,在什么情况下推荐使用哪一个?

Google 甚至没有在这个页面上提到 JobIntentService,他们只提到了 WorkManager:https://developer.android.com/guide/background

【问题讨论】:

【参考方案1】:

由于 Android Oreo 我们不能再让正常的服务在后台运行,因为系统会:

如果应用程序本身在启动服务后进入后台,大约一分钟后终止服务

2-如果应用本身在后台启动服务,则抛出异常

IntentService 只是普通服务的一个子类,它在后台线程上按顺序执行所有工作,并在完成所有工作后自行停止。但作为一项服务,它也受到上述限制的影响。

现在是 JobIntentService:

将在 Pre-Oreo 设备上充当普通 IntentService(因为我们没有任何限制),并且在 Oreo+ 上将使用 jobScheduler 来实现与 IntentService 类似的行为。 它只是尽快开始工作,通过 JobScheduler 和 JobScheduler 可能会选择推迟工作一段时间,但它的工作更有可能在内存不足的情况下、打瞌睡模式或达到时间限制时有所不同或中断(~ 10 分钟)

使用 JobIntentService,做一些配置是不可能, 比如具体定义我们希望在什么情况下开始工作(例如设备当前正在充电或我们是否有 WIFI 连接),但是使用 workmanager 我们可以设置这些限制。

将 WorkManager 用于具有一些约束的工作,或用于事务性非持续的工作/工作,或用于未来某个时间可能发生的工作,当您想要复制 Android Oreo+ 上的普通 IntentService 的行为以及可能会稍微延迟并且可能需要超过 1 分钟但大约不到 10 分钟的作业时,请使用 JobIntentService。

希望我回答了你的问题。

问候

【讨论】:

以上是关于何时使用 JobIntentService 与 WorkManager?的主要内容,如果未能解决你的问题,请参考以下文章

JobIntentService 的 onDestroy 被调用后会发生啥?

JobIntentService onHandleWork 无法正常工作

Activity 和 JobIntentService 生命周期

【原创】JobIntentService使用

我们如何在 Scala 中使用 android JobIntentService?

在 JobIntentService 中可以在没有 onHandleWork() 的情况下调用 onDestroy() 吗?