有人可以给我展示一个示例,该示例可以通过IntentService
进行但不能通过Service
(反之亦然)?
我也相信IntentService
在不同的线程中运行,而Service
不在。因此,据我所知,在其自己的线程中启动服务就像启动IntentService
。不是吗
如果有人可以帮助我解决我的两个问题,我将不胜感激。
Tejas Lagvankar 就此主题写了一篇不错的文章 。以下是 Service 和 IntentService 之间的一些关键区别。
什么时候使用?
该Service可以用于没有 UI 的任务中,但不应太长。如果需要执行长任务,则必须使用 Service 中的线程。
IntentService可以用于长时间任务,通常无需与主线程通信。如果需要通信,则可以使用主线程处理程序或广播意图。另一个使用情况是需要回调(意图触发的任务)时。
如何触发?
通过调用方法startService()
触发服务 。
IntentService是使用 Intent 触发的,它产生一个新的工作线程,并在该线程上调用onHandleIntent()
方法。
触发自
运行
该服务在后台运行,但是在应用程序的主线程上运行。
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
上运行stopSelf()
或stopService()
来停止服务意图服务
Handler
或BroadcastReceiver
Intent
调用Main Thread
触发