何时使用JobIntentService而不是WorkManager?

26

谷歌最近将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之间有什么区别,并且在哪些情况下推荐使用哪个?

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

1个回答

45
自从Android Oreo版本开始,我们不能再让普通服务在后台持续运行了,因为系统会:
1. 如果应用程序在启动服务后进入后台,则在大约一分钟后杀死服务。 2. 如果应用程序本身在后台运行时启动服务,则抛出异常。
IntentService只是普通服务的一个子类,它在后台线程上按顺序执行所有工作,并在完成所有工作后停止自己。但作为服务,它也受到上述限制的影响。
现在来看JobIntentService:
在Oreo之前的设备上,它将像普通的IntentService一样运行(因为我们没有任何限制),而在Oreo及以上版本中,它将使用jobScheduler来实现与IntentService类似的行为。它会尽快启动工作,通过JobScheduler安排其工作,JobScheduler可能会稍微延迟这些工作,但在低内存情况下、Doze模式或达到时间限制(约10分钟)时,它的工作更有可能被推迟或中断。
使用JobIntentService,有些配置是不可能的,比如明确定义我们希望在哪些情况下启动作业(例如当设备当前正在充电或者我们有WIFI连接),但是使用WorkManager我们可以设置这些约束条件。

使用WorkManager处理带有一些约束条件的作业,或用于事务性的非持续性作业,或者可在未来某个时间发生的作业;而当你想要在Android Oreo+上复制正常IntentService的行为并且作业可能会稍微延迟并且可能需要大约1分钟但不到10分钟时,请使用JobIntentService。

希望我解答了您的问题。

敬礼


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接