服务vs IntentService
有人可以向我展示一个可以用IntentService
完成的事情的例子,而这个IntentService
不能用一个Service
来完成(反之亦然)?
我也相信一个IntentService
运行在另一个线程中,一个Service
不运行。 所以,就我所知,在自己的线程中启动一个服务就像启动一个IntentService
。 不是吗?
如果有人能帮我解决我的两个问题,我将不胜感激。
Tejas Lagvankar就这个问题写了一篇不错的文章。 以下是Service和IntentService之间的一些主要差异。
何时使用?
该服务可以用于没有UI的任务,但不应该太长。 如果您需要执行长时间的任务,则必须在Service中使用线程。
IntentService可用于长时间的任务,通常不会与主线程通信。 如果需要通信,可以使用主线程处理程序或广播意图。 另一种使用情况是需要回调(意图触发任务)。
如何触发?
该服务由调用方法startService()
触发。
IntentService是使用Intent触发的,它产生一个新的工作线程,并且在这个线程上调用onHandleIntent()
方法。
触发
运行
该服务在后台运行,但它在应用程序的主线程上运行。
IntentService在单独的工作线程上运行。
限制/缺点
该服务可能会阻止应用程序的主线程。
IntentService不能并行运行任务。 因此,所有连续的意图都将进入工作线程的消息队列并将按顺序执行。
何时停止?
如果你实现了一个服务,你有责任通过调用stopSelf()
或stopService()
来完成它的工作。 (如果你只想提供绑定,你不需要实现这个方法)。
IntentService在处理完所有启动请求后停止服务,因此您不必调用stopSelf()
。
如果有人能够向我展示一个你可以用intentService完成的事情的例子,并且不能用Service来完成,反之亦然。
根据定义,这是不可能的。 IntentService
是Service
一个子类,用Java代码编写。 因此,任何一个IntentService
确实,一个Service
可以做,通过包括代码的相关位IntentService
使用。
用自己的线程启动服务就像启动IntentService一样。 不是吗?
IntentService
的三个主要功能是:
后台线程
传递给onStartCommand()
的Intent
自动排队,所以如果一个Intent
被后台线程上的onHandleIntent()
处理,其他命令排队等待轮到他们
一旦队列为空,则通过调用stopSelf()
来自动关闭IntentService
任何和所有这些都可以通过Service
来实现,而无需扩展IntentService
。
服务
startService()
调用 Thread
触发 Main Thread
上运行 stopSelf()
或stopService()
来停止服务。 IntentService
Handler
或BroadcastReceiver
Intent
调用 Main Thread
触发