Android平台中的Service和IntentService之间的区别
Android平台中的Service和IntentService之间的区别
我正在寻找一个使用IntentService
可以完成但使用Service
无法完成的示例(反之亦然)?
我也认为IntentService
在不同的线程中运行,而Service
则不会。因此,在其自己的线程中启动服务就像启动IntentService
。这个说法正确吗?
如果有人可以向我展示一个仅可使用
IntentService
完成的功能,而Service
不能完成该功能,或者方式恰好相反。
根据定义,这是不可能的。 IntentService
是Java中Service
的子类。因此,任何IntentService
可以完成的功能,Service
也可以通过包含IntentService
使用的相关代码实现。
使用其自己的线程启动服务就像启动IntentService一样,不是吗?
一个IntentService
的三个主要特点是:
-
后台线程
-
将传递到
onStartCommand()
的Intent
自动排队,因此,如果一个Intent
正在后台线程上通过onHandleIntent()
处理,其他命令会排队等待它们的机会。 -
队列为空后,通过调用
stopSelf()
自动关闭IntentService
任何一个Service
都可以在不扩展IntentService
的情况下实现上述任何一个或全部特点。
Tejas Lagvankar写了一篇关于这个主题的不错的文章。post下面是服务和IntentService之间的一些关键区别。
何时使用?
-
服务可以在没有UI的任务中使用,但不应太长。如果需要执行长时间任务,则必须在服务内使用线程。
-
IntentService通常用于需要较长时间的任务而又不需要与主线程进行通信的情况。如果需要通信,可以使用主线程处理程序或广播意图。另一种使用情况是需要回调的情况(Intent触发任务)。
如何触发?
-
通过调用方法
startService()
触发服务。 -
使用意图触发IntentService,它会生成一个新的工作线程,并在该线程上调用
onHandleIntent()
方法。
触发自
- 服务和IntentService可以从任何线程、活动或其他应用程序组件触发。
运行在
-
服务在后台运行,但在应用程序的主线程上运行。
-
IntentService在单独的工作线程上运行。
限制/缺陷
-
服务可能会阻塞应用程序的主线程。
-
IntentService无法并行运行任务。因此,所有连续的意图将进入工作线程的消息队列,并按顺序执行。
何时停止?
-
如果你实现了一个Service,那么当它完成所有工作后,你应该通过调用
stopSelf()
或stopService()
来停止该服务。(如果你只想提供绑定,不必实现此方法。) -
IntentService在处理完所有启动请求后自动停止服务,因此无需调用
stopSelf()
。