协慌网

登录 贡献 社区

服务与 IntentService

有人可以给我展示一个示例,该示例可以通过IntentService进行但不能通过Service (反之亦然)?

我也相信IntentService在不同的线程中运行,而Service不在。因此,据我所知,在其自己的线程中启动服务就像启动IntentService 。不是吗

如果有人可以帮助我解决我的两个问题,我将不胜感激。

答案

Tejas Lagvankar 就此主题写了一篇不错的文章 。以下是 Service 和 IntentService 之间的一些关键区别。

什么时候使用?

  • Service可以用于没有 UI 的任务中,但不应太长。如果需要执行长任务,则必须使用 Service 中的线程。

  • IntentService可以用于长时间任务,通常无需与主线程通信。如果需要通信,则可以使用主线程处理程序或广播意图。另一个使用情况是需要回调(意图触发的任务)时。

如何触发?

  • 通过调用方法startService()触发服务

  • IntentService是使用 Intent 触发的,它产生一个新的工作线程,并在该线程上调用onHandleIntent()方法。

触发自

  • 可以从任何线程,活动或其他应用程序组件触发ServiceIntentService

运行

  • 服务在后台运行,但是在应用程序的主线程上运行。

  • IntentService在单独的工作线程上运行。

局限性 / 缺点

  • 服务可能会阻止应用程序的主线程。

  • IntentService无法并行运行任务。因此,所有连续的意图都将进入工作线程的消息队列,并将按顺序执行。

什么时候停止?

  • 如果实现服务 ,则有责任通过调用stopSelf()stopService()在服务完成时停止该服务。 (如果只想提供绑定,则不需要实现此方法)。

  • 在处理所有启动请求之后, IntentService 将停止服务,因此您不必调用stopSelf()

如果有人可以向我展示一个示例,该示例可以通过IntentService完成,而不能通过Service完成, IntentService

根据定义,这是不可能的。 IntentService是用 Java 编写的Service的子类。因此,任何一个IntentService确实,一个Service可以做,通过包括代码的相关位IntentService用途。

用自己的线程启动服务就像启动 IntentService。不是吗

IntentService的三个主要功能是:

  • 后台线程

  • 传递给onStartCommand()Intent的自动排队,因此,如果一个Intent正在由onHandleIntent()在后台线程上处理,则其他命令排队等候

  • 一旦队列为空,则通过调用stopSelf()自动关闭IntentService

所有这些都可以由Service实现,而无需扩展IntentService

服务

  • 通过startService()调用
  • 从任何Thread触发
  • Main Thread上运行
  • 可能会阻塞主(UI)线程。始终在服务中使用线程来完成长任务
  • 任务完成后,我们有责任通过调用stopSelf()stopService()来停止服务

意图服务

  • 它执行长时间的任务,如果需要通信,通常不与主线程通信,然后由HandlerBroadcastReceiver
  • 通过Intent调用
  • Main Thread触发
  • 在单独的线程上运行
  • 无法并行运行任务,并且多个意图在同一工作线程上排队。