JobIntentService和IntentService有哪些区别?

18

我不明白这两个API之间的区别,我的意思是什么时候使用第一个。为什么会有JobIntentService?

3个回答

33
我建议阅读这篇文章,了解Intent Service和Job Intent Service之间的区别。当我们第一次看到这些术语ServiceIntentServiceJobIntentService时,它们看起来几乎相似——以某种方式在后台执行一些操作(用户不会注意到)。但它们运作方式上有一些不同。
  • Service - 这在调用此服务的同一主线程上运行,并执行某些后台操作。对于在主线程上发生的任何长时间运行的操作,建议创建一个新线程并通过不影响主线程性能的方式进行工作(例如:Handler)。

    缺点:在主线程上运行

  • IntentService - Intent服务也有助于执行一些长时间运行(无限期)的后台任务。唯一的区别是它创建一个新线程来执行此任务,而不是在主线程上运行。在其onHandleIntent中执行给定的工作。

    缺点:当应用程序被杀死时,分配给IntentService的工作将丢失

  • JobIntentService - Job intent service与IntentService非常相似,但具有一些好处,例如应用程序可以随时终止此作业,并且可以在应用程序重新创建/更新后重新启动该作业。
但是从 Oreo 开始,如果应用程序在后台运行,则不允许在后台启动服务。Android 要求我们通过 context.startForegroundService 显式地启动服务,而不是 context.startService,并且当服务在 5 秒内启动时,必须将其绑定到通知以使其与 UI 元素相关联。
参考资料: https://developer.android.com/about/versions/oreo/background.html

4
IntentService的缺点似乎有点奇怪。我的意思是,如果我们使用setIntentRedelivery()方法启用mRedeliver布尔值,这将重新启动服务并再次传递intent,因此最终作业不会丢失。 - Mehroze Yaqoob
1
为什么我们仍然需要IntentService?我以为Google现在更倾向于推荐使用WorkManager... - IgorGanapolsky
IntentService类曾经是在单个后台线程上运行操作的方式。 IntentService在应用程序外部运行于后台进程中,因此即使您的应用程序关闭,该进程也会继续运行,因此作业不会丢失,除非它已完成。请参考此链接--> https://guides.codepath.com/android/starting-background-services - Wini
那么我们可以说JobIntentService是粘性IntentService吗? - NehaK

5

两者都可以工作,但是JobIntentService与其他服务的唯一区别在于,如果应用程序在服务执行时被杀死,则JobIntentService会重新启动。而OnHandleWork()则在应用程序被杀死后重新启动。


2
基本上,这两者扮演相同的角色,不同之处在于IntentService是处理基于Intent的显式异步请求的Service的基类,它可以根据需要通过startService(传递服务的Intent)启动,因此您可以按照自己的意愿启动服务。从Android Oreo开始,JobIntentService也执行工作处理,但它能够在旧版本中保持运行,并且使进程更加简单。实际上,这两个API有相同的后续操作。对于Oreo的工作执行,如果JobScheduler.enqueue已经在平台的旧版本中使用,则会使用Context.startService。希望这可以帮助您。"最初的回答"

2
“IntentService”不是太老了吗?我们更喜欢使用现代的JetPack解决方案,你觉得呢? - IgorGanapolsky

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