我正在寻找一个可以用IntentService完成但不能用Service完成的示例(反之亦然)?
我还认为IntentService在不同的线程中运行,而Service则不运行。因此,就我所见,在自己的线程中启动服务就像启动IntentService一样。这是正确的吗?
我正在寻找一个可以用IntentService完成但不能用Service完成的示例(反之亦然)?
我还认为IntentService在不同的线程中运行,而Service则不运行。因此,就我所见,在自己的线程中启动服务就像启动IntentService一样。这是正确的吗?
当前回答
轮子
IntentService扩展了Service类,这显然意味着IntentService是为了相同的目的而故意创建的。
那么目的是什么呢?
`IntentService的目的是让我们的工作更容易运行后台任务,而不用担心
创建工作线程逐一排队处理多个请求(线程)破坏服务
所以不,Service可以完成IntentService所能完成的任何任务。如果您的需求符合上述标准,那么您不必在Service类中编写这些逻辑。所以不要再发明轮子,因为IntentService是发明的轮子。
“主要”区别
服务在UI线程上运行,而IntentService在单独的线程
你什么时候使用IntentService?
当您希望逐个执行超出“活动”范围的多个后台任务时,IntentService是完美的。
IntentService是如何从服务生成的
正常服务在UI线程上运行(默认情况下,任何Android组件类型都在UI线程中运行,例如Activity、BroadcastReceiver、ContentProvider和service)。如果你必须做一些可能需要一段时间才能完成的工作,那么你必须创建一个线程。在多个请求的情况下,您必须处理同步。IntentService提供了一些为您执行这些任务的默认实现。根据开发者页面
IntentService创建工作线程IntentService创建一个工作队列,将请求逐个发送到onHandleIntent()方法当没有工作时,IntentService调用stopSelf()方法为空的onBind()方法提供默认实现onStartCommand()的默认实现,它将Intent请求发送到WorkQueue,并最终发送到onHandleIntent()
其他回答
如果有人能给我举一个例子,说明你可以用IntentService完成,但不能用服务完成,反之亦然。
IntentService不能用于长时间侦听,就像XMPP侦听器一样,它是一个单时间操作员,完成任务并挥手告别。
此外,它只有一个线程线程,但通过一个技巧,您可以无限使用它。
Tejas Lagvankar就这个主题写了一篇很好的帖子。以下是Service和IntentService之间的一些关键区别。
何时使用?
该服务可以在没有UI的任务中使用,但不应该太长。如果需要执行长任务,则必须在Service中使用线程。IntentService可用于长任务,通常与主线程没有通信。如果需要通信,可以使用主线程处理程序或广播意图。另一种使用情况是需要回调(意图触发任务)。
如何触发?
通过调用方法startService()来触发服务。IntentService是使用Intent触发的,它生成一个新的工作线程,并在此线程上调用onHandleIntent()方法。
触发自
服务和IntentService可以从任何线程、活动或其他应用程序组件触发。
运行时间
服务在后台运行,但它在应用程序的主线程上运行。IntentService在单独的工作线程上运行。
限制/缺点
服务可能会阻止应用程序的主线程。IntentService无法并行运行任务。因此,所有连续的意图都将进入工作线程的消息队列,并按顺序执行。
何时停止?
如果您实现了一个服务,那么您有责任在服务完成后停止服务,方法是调用stopSelf()或stopService()。(如果您只想提供绑定,则不需要实现此方法)。IntentService在处理完所有启动请求后停止服务,因此您不必调用stopSelf()。
服务
通过startService()调用从任何线程触发在主线程上运行可能会阻塞主(UI)线程。对于长任务,始终在服务中使用线程任务完成后,我们有责任通过调用stopSelf()或stopService()来停止服务
Intent服务
它执行长任务,通常不与主线程通信,如果需要通信,则由处理器或BroadcastReceiver完成通过Intent调用从主线程触发在单独的线程上运行无法并行运行任务,并且多个意图在同一工作线程上排队。
服务和IntentService之间的主要区别如下:
服务:
1.默认情况下,服务在应用程序的主线程上运行。(这里没有默认的工作线程可用)。因此用户需要创建一个单独的线程,并在该线程中执行所需的工作。
2.一次允许多个请求。(多线程)
意向服务:
1.现在,来到IntentService,这里有一个默认的工作线程可以执行任何操作。注意-您需要实现onHandleIntent()方法,该方法接收每个启动请求的意图,在那里您可以执行后台工作。
2.但它一次只允许一个请求。
IntentService是服务的扩展,用于简化需要在后台和单独线程中执行的任务的执行。
IntentService启动,创建一个线程并在线程中运行其任务。一旦完成,它就会清洁一切。IntentService的一个实例只能同时运行,多个调用被排队。
它的使用非常简单,对于很多用途都非常方便,例如下载东西。但它有一些限制,可能会让你想使用更基本(不简单)的服务。
例如,连接到xmpp服务器并由活动绑定的服务不能简单地使用IntentService完成。您最终将忽略或覆盖IntentService内容。