17

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

4

3 回答 3

26

我建议阅读这篇文章,解释意图服务和工作意图服务之间的区别。当我们第一次查看这些术语ServiceIntentServiceJobIntentService它们看起来几乎相似——以某种方式,它们会在后台执行一些操作(用户不会注意到)。但是它们的操作方式几乎没有区别,

  • 服务 - 这在调用此服务并执行一些后台操作的同一主线程上运行。对于主线程上发生的任何长时间运行的操作,建议创建一个新线程并Handler通过不影响主线程的性能来完成工作(例如;)。

    缺点:在主线程上运行

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

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

  • JobIntentService - 工作意图服务与 IntentService 非常相似,但没有什么好处,例如应用程序可以随时终止此工作,并且一旦应用程序重新创建/启动,它就可以从头开始工作。

但是从奥利奥,如果应用程序在后台运行,则不允许在后台启动服务。Android 要求我们显式地启动服务,context.startForegroundService而不是context.startService当服务在 5 秒内启动时,它必须与通知相关联,以便有一个与之关联的 UI 元素。

参考:https ://developer.android.com/about/versions/oreo/background.html

于 2019-07-13T09:58:06.703 回答
5

两者的工作方式相同,但与 JobIntentService 的唯一区别是,如果应用程序在服务执行时被终止,则 JobIntentService 会重新启动。OnHandleWork() 在应用程序被杀死后重新启动。

于 2019-06-24T05:42:43.740 回答
2

基本上,两者遵循相同的角色,不同之处在于 IntentService 它是 Service 的基类,它根据需要处理带有 Intent 的显式异步请求,它通过 startService 启动(传递服务的 Intent ),因此该服务按照您的意愿启动,从 Android Oreo JobIntentService 它也执行工作处理,但是它能够在旧版本中继续运行,它也使过程更简单。事实上,这 2 个 API 具有相同的后续功能。对于 Oreo 使用的工作的执行,如果JobScheduler.enqueue已经在旧版本的平台中,它将被使用Context.startService

希望这可以帮助。

于 2019-01-21T21:10:15.597 回答