服务vs IntentService

有人可以告诉我一个可以用一个Service无法完成的IntentService (反之亦然)可以完成的事情的例子吗?

我也相信一个IntentService运行在另一个线程中,一个Service不运行。 所以,据我所知,在自己的线程中启动一个服务就像启动一个IntentService 。 不是吗?

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

Tejas Lagvankar写了一个关于这个问题的好post 。 以下是Service和IntentService之间的一些关键区别。

何时使用?

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

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

如何触发?

  • 服务由调用方法startService()触发。

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

触发

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

运行

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

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

限制/缺点

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

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

何时停止?

  • 如果你实现了一个服务 ,那么你的责任就是通过调用stopSelf()或者stopService()来完成它的工作。 (如果你只想提供绑定,你不需要实现这个方法)。

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

如果有人能够向我展示一个你可以用intentService完成的事情的例子,而不能用Service来完成,反之亦然。

根据定义,这是不可能的。 IntentServiceService一个子类,用Java代码编写。 因此,通过包含IntentService使用的相关代码位, IntentService可以执行任何Service

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

IntentService的三个主要function是:

  • 后台线程

  • 传递给onStartCommand()Intent的自动排队,所以如果一个Intent被后台线程的onHandleIntent()处理,其他命令排队等待轮到他们

  • 一旦队列为空,则通过调用stopSelf()来自动closuresIntentService

任何和所有这些都可以通过Service来实现,而不需要扩展IntentService

差异

  1. 服务类使用应用程序的main线程,而IntentService创buildworker线程并使用该线程运行服务。
  2. IntentService创build一个队列,每次将一个意图传递给onHandleIntent() 。 因此,应该通过直接扩展Service类来实现multithreading。
  3. 服务类需要使用stopSelf()手动停止。 同时,IntentService在队列中没有意图时自动停止,所有排队的意图都被处理。
  4. IntentService实现了返回null的onBind() 。 这意味着IntentService不能被默认绑定。
  5. IntentService实现了将Intent发送到队列和onHandleIntent()的onStartCommand()。

服务

  • 由startService()调用
  • 从任何线程触发
  • 在主线上运行
  • 可能会阻塞主(UI)线程。 长时间使用服务内的线程
  • 一旦任务完成,我们有责任通过调用stopSelf()或stopService()来停止服务。

IntentService

  • 如果需要通信,则执行长任务,通常不与主线程通信,然后由Handler或广播完成
  • 通过意向调用
  • 从主线引发
  • 在单独的线程上运行
  • 无法并行运行任务,并且多个意图在同一个工作线程上排队。

添加点接受答案:

在Android API中查看IntentService的用法。 例如:

 public class SimpleWakefulService extends IntentService { public SimpleWakefulService() { super("SimpleWakefulService"); } @Override protected void onHandleIntent(Intent intent) { ...} 

要为您的应用程序创build一个IntentService组件,请定义一个扩展IntentService的类,并在其中定义一个覆盖onHandleIntent()的方法。

另请参阅IntentService的源代码,它是像onStartCommand这样的consutructor和生命周期方法。

  @Override public int More ...onStartCommand(Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; } 

一起服务一个AsyncTask是有效载荷不是很大的许多用例的最佳方法之一。 或者只是创build一个扩展IntentSerivce的类。 从Android 4.0版本开始,所有networking操作都应该在后台进程中,否则应用程序编译/生成失败。 从UI分离线程。 AsyncTask类提供了从UI线程中引发新任务的最简单方法之一。 有关此主题的更多讨论,请参阅博文

来自Android开发者指南 :

IntentService是一个服务的基类,用于处理asynchronous请求(表示为Intents)。 客户通过startService(Intent)调用发送请求; 该服务根据需要启动,使用工作线程处理每个Intent,并在工作不正常时自行停止。

IntentService中使用的devise模式

:这个“工作队列处理器”模式通常用于卸载应用程序主线程中的任务。 IntentService类的存在是为了简化这种模式,并照顾机制。 要使用它,扩展IntentService并实现onHandleIntent(Intent)。 IntentService将收到Intents,启动一个工作线程,并根据需要停止服务。

所有请求都在单个工作线程上处理 – 它们可能需要的时间(并且不会阻塞应用程序的主循环),但是一次只能处理一个请求。

IntentService类为在单个后台线程上运行操作提供了一个简单的结构。 这使它可以处理长时间运行的操作,而不会影响用户界面的响应。 而且,IntentService不会受到大多数用户界面生命周期事件的影响,因此它将继续在closuresAsyncTask的情况下运行。

IntentService有一些限制:

它不能直接与您的用户界面进行交互。 要将其结果放入UI中,您必须将它们发送到一个活动。 工作请求按顺序运行。 如果一个操作正在IntentService中运行,并且您发送了另一个请求,则该请求将一直等到第一个操作完成。 运行在IntentService上的操作不能被中断。 但是,在大多数情况下

IntentService是简单后台操作的首选方式

**

排球图书馆

有一个名为volley-library的库,用于开发androidnetworking应用程序。源代码在github中可用。

有关后台作业最佳实践的android官方文档:有助于更好地理解intent服务,线程,处理程序和服务。 并执行networking操作

我相信你可以通过简单地search诸如“Android IntentService vs Service”

每个示例的一个更重要的区别是IntentService一旦完成就自行结束。

一些例子(很快就可以完成)可能是;

IntentService:如果你想在打开你的应用程序的开始下载一堆图像。 这是一个一次性的过程,一旦下载完成,就可以自行清理。

服务:服务将不断用于您的应用程序和后端与Web API调用之间的通信。 即使它完成了它目前的任务,你仍然希望它在几分钟后,为更多的沟通。

IntentService

IntentService在其自己的线程上运行。 完成后它将自行停止。 更像火和忘记。 随后的电话将排队。 很适合排队呼叫。 您也可以在IntentService旋转多个线程(如果需要的话) – 您可以使用ThreadPoolExecutor来实现此目的。 我这样说是因为很多人问我“为什么使用IntentService因为它不支持并行执行”。 IntentService只是一个线程。 你可以在里面做任何你需要的东西 – 甚至可以旋转多个线程。 唯一需要注意的是IntentService只要旋转多个线程就完成了。 它不会等待那些线程回来。 你需要照顾这个。 所以我build议在这些场景中使用ThreadPoolExecutor

  • 很适合同步,上传等

服务

默认Service在主线程上运行。 你需要旋转一个工作线程来完成你的工作。 你需要明确地停止service 。 当你需要在后台运行的时候,即使当你离开你的应用程序,并回来更多的无头service我用它的情况。

  • 如果需要的话,你可以再次运行多个线程。
  • 可以用于音乐播放器等应用程序。

如果需要,您可以随时使用BroadcastReceivers回传给您的活动。

一个IntentService是一个服务的扩展,用来减轻需要在后台和分离的线程中执行的任务的执行。

IntentService启动,创build一个线程并在线程中运行它的任务。 一旦完成,它清理一切。 只有一个IntentService实例可以同时运行,几个调用被排队。

使用非常简单,很多用途都很方便,比如下载东西。 但它有限制,可以使你想使用,而不是更简单的服务。

例如,连接到xmpp服务器并由活动绑定的服务不能简单地使用IntentService完成。 你会最终忽略或重写IntentService的东西。

如果有人能告诉我一个你可以用IntentService完成的事情的IntentService ,不能用service来完成, IntentService

IntentService不能用于长时间监听,就像XMPP Listeners一样,它是一个单一的时间操作员,做这个工作并挥手告别。

另外它只有一个线程员,但有一个技巧,你可以使用它作为无限的。

主要区别:

  1. 服务类需要使用stopSelf()手动停止。 同时,IntentService在队列中没有意图时会自动停止。

  2. IntentService通常可用于长时间任务,但如果需要执行较长时间的任务,则必须在Service中使用线程。

ServiceIntentService之间的主要区别如下所述:

服务:

1.A Service默认在应用程序的主线程上运行(这里没有默认的工作线程可用),所以用户需要创build一个单独的线程并在该线程中执行所需的工作。

2.一次允许多个请求(multithreading)

IntentService:

现在,来到意向服务,在这里一个默认的工作线程可用于执行任何操作。 请注意 – 您需要实现onHandleIntent()方法,该方法接收每个启动请求的意图,您可以在其中完成后台工作。

但是一次只允许一个请求。

不要重新发明轮子

IntentService扩展了Service类,这明显意味着IntentService是故意为了某个目的而创build的。

目的

IntentService的目的是使我们的工作更轻松地运行后台任务,而不用担心

  • 创build工作线程

  • Queunig处理多个请求(Threading)

  • 破坏服务

所以不行,Service可以完成一个IntentService会做的任务。 如果您的要求属于所提及的标准,那么您不必在Service类中编写这些逻辑。 不要重新发明轮子,因为IntentService是发明的轮子。

服务如何提供意向服务

一个正常的服务在UI线程上运行。 如果你必须做一些可能需要一段时间才能完成的工作,那么你必须创build一个线程。 在多个请求的情况下,你将不得不处理同步。 意向服务给予了一些默认的实现,为您完成这些任务。
根据开发者页面

  1. 意向服务创build一个工作线程

  2. IntentService创build一个工作队列, onHandleIntent()发送请求到onHandleIntent()方法

  3. 当没有工作,然后意向服务调用stopSelf()方法
  4. 为null的onBind()方法提供默认实现
  5. onStartCommand()的默认实现,它将Intent请求发送到WorkQueue并最终发送到onHandleIntent()