Android平台上的Service vs IntentService

我正在寻找一个可以用IntentService完成的事情的例子,而不能用Service完成(反之亦然)?

我也相信IntentService在不同的线程中运行,而Service没有。所以,据我所知,在自己的线程中启动服务就像启动IntentService一样。这是正确的吗?

335102 次浏览

我相信你可以找到一个广泛的差异列表,只需谷歌搜索一些东西,如“Android IntentService vs Service”。

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

一些例子(快速制作)可能是;

IntentService:如果您想在打开应用程序开始时下载一堆图像。这是一个一次性过程,一旦所有内容下载完毕,就可以自行清理。

服务:一种服务,它将不断用于您的应用程序和后端之间通过Web API调用进行通信。即使它完成了当前任务,您仍然希望它在几分钟后出现,以便进行更多通信。

如果有人能给我一个例子,说明可以用IntentService完成的事情,不能用Service完成,反之亦然。

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

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

IntentService的三个主要特征是:

  • 的后台线程

  • 传递给onStartCommand()Intent的自动排队,因此如果后台线程上的onHandleIntent()正在处理一个Intent,则其他命令排队等待轮到它们

  • 一旦队列为空,通过调用stopSelf()自动关闭IntentService

所有这些都可以由Service实现,而无需扩展IntentService

IntentService是Service的扩展,用于简化需要在后台和单独线程中执行的任务的执行。

IntentService启动,创建一个线程并在线程中运行它的任务。完成后,它会清理所有内容。只有一个IntentService实例可以同时运行,多个调用将排队。

它使用起来非常简单,对于很多用途来说非常方便,例如下载东西。但它有一些限制,可能会让您想要使用更基本(不简单)的服务。

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

Tejas Lagvankar就此主题写了一篇很好的帖子。以下是Service和IntentService之间的一些主要区别。

什么时候使用?

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

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

如何触发?

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

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

触发自

  • 服务服务类型可以从任何线程、活动或其他应用程序组件触发。

运行

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

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

限制/缺点

  • Service可能会阻塞应用程序的主线程。

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

什么时候停止?

  • 如果你实现了一个Service,你有责任在服务完成后通过调用stopSelf()stopService()来停止它。(如果你只想提供绑定,你不需要实现这个方法)。

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

添加点到接受的答案:

查看Android API中IntentService的使用情况。例如:

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

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

另外,请参阅IntentService的源代码,它的构造函数和生命周期方法,例如onStartCommand…

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

一起服务AsyncTeam是许多人的最佳方法之一负载不是很大的用例。或者只是创建一个类扩展IntentSerivce。从Android版本4.0所有网络操作应在后台进程中,否则应用程序编译/构建失败。从UI中分离线程。AsyncTeam类提供了从UI线程启动新任务的最简单方法之一。有关此主题的更多讨论,请参阅博客文章

Android开发者指南

IntentService是按需处理异步请求(表示为Intents)的服务的基类。客户端通过start Service(Intent)调用发送请求;服务根据需要启动,依次使用工作线程处理每个Intent,并在工作结束时停止自身。

IntentService中使用的设计模式

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

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

IntentService类为在单个后台线程上运行操作提供了一个简单的结构。这允许它在不影响用户交互界面响应能力的情况下处理长时间运行的操作。此外,IntentService不受大多数用户交互界面生命周期事件的影响,因此它会在关闭Async任务的情况下继续运行。

IntentService有一些限制:

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

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

**

Volley图书馆

有一个名为的库,用于开发Android网络应用程序源代码可在GitHub中向公众提供。

Android官方留档背景工作的最佳实践:有助于更好地理解意图服务、线程、处理程序、服务。还有执行网络操作

服务

  • 调用startService()
  • 从任何Thread触发
  • 运行在Main Thread
  • 可能会阻塞主(UI)线程。始终在服务中使用线程进行长任务
  • 一旦任务完成,我们有责任通过调用stopSelf()stopService()来停止服务

服务类型

  • 它执行长任务,通常不与主线程通信,如果需要通信,则由HandlerBroadcastReceiver完成
  • 通过Intent调用
  • 触发自Main Thread
  • 在单独的线程上运行
  • 无法并行运行任务,并且多个意图在同一工作线程上排队。

如果有人能给我举个例子,说明你可以用IntentService完成,不能用service完成,反之亦然。

IntentService不能用于长时间监听,就像XMPP监听器一样,它是一个单一的时间运算符,完成工作并挥手告别。

它也只有一个线程工作器,但有一个技巧,你可以无限地使用它。

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

服务:

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

2.允许一次多个请求。(多线程)

意图服务:

1.现在,来到IntentService,这里有一个默认的工作线程可用于执行任何操作。注意-您需要实现onHandleIntent()方法,它接收每个启动请求的意图,您可以在其中进行后台工作。

2.但它一次只允许一个请求。

服务类型

IntentService在自己的线程上运行。当它完成时,它会停止自己。更像是火和忘记。后续呼叫将排队。适合排队呼叫。如果需要,您还可以在IntentService中旋转多个线程-您可以使用ThreadPoolExecutor实现这一点。我这么说是因为很多人问我“为什么要使用IntentService,因为它不支持并行执行”。IntentService只是一个线程,你可以在里面做任何你需要做的事情——甚至可以旋转多个线程。唯一需要注意的是,一旦你旋转了这些多线程,IntentService就会结束。它不会等待那些线程回来。你需要照顾好这一点。所以我建议在这种情况下使用ThreadPoolExecutor

  • 适合同步、上传等…

服务

By DefaultService在主线程上运行。您需要旋转一个工作线程来完成您的工作。您需要明确停止service。我用它来处理你需要在后台运行东西的情况,即使你离开你的应用程序并回来更多地使用无头service

  • 同样,如果需要,您可以运行多个线程。
  • 可用于音乐播放器等应用程序。

如果需要,您始终可以使用BroadcastReceivers与您的活动进行通信。

不要重新发明轮子

服务类型扩展了服务类,这显然意味着IntentService是故意为相同目的而制作的。

那么目的是什么?

IntentService的目的是让我们的工作更容易运行后台任务,甚至不用担心

  • 创建工作线程

  • 将正在处理的多请求逐个排队(Threading

  • 毁灭Service

所以Service可以完成IntentService可以完成的任何任务。如果您的需求符合上述条件,那么您不必在Service类中编写这些逻辑。所以不要重新发明轮子,因为IntentService是发明的轮子。

“主要”区别

服务在UI线程上运行,而IntentService在分离式线程

什么时候使用IntentService?

当你想一个接一个地执行多个后台任务时,这些任务超出了活动的范围,那么IntentService是完美的。

IntentService是如何从Service中产生的

一个正常的服务在UI线程上运行(默认情况下,任何Android组件类型都在UI线程上运行,例如ActivityBroadcastReceiverContentProviderService)。如果你必须做一些可能需要一段时间才能完成的工作,那么你必须创建一个线程。在多个请求的情况下,你将不得不处理synchronizationIntentService被赋予了一些默认实现,它为您执行这些任务。
开发者页

  1. IntentService创建一个Worker线程

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

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

安卓意图服务vs服务

1.服务

  • 服务是使用start Service()调用的。
  • 可以从任何线程调用服务。
  • 服务在主线程上运行后台操作默认情况下的应用程序。因此它可以阻止您的应用程序的UI。
  • 多次调用的服务将创建多个实例。
  • 一个服务需要停止,使用的方法是停止self()或停止Service()。
  • Android服务可以运行并行操作。

2.意图服务

  • 使用Intent调用IntentService。
  • IntentService只能从主线程调用。
  • 一个IntentService创建一个单独的工作线程来运行后台操作。
  • 多次调用的IntentService不会创建多个实例。
  • 一个IntentService在队列完成后自动停止。没有#需要触发停止服务()或停止自我()。
  • 在IntentService中,多个意图调用会自动排队它们将按顺序执行。
  • IntentService不能像Service一样运行并行操作。

引用这里