809

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

我也相信IntentServicea 在不同的线程中运行而 aService不会。因此,据我所知,在自己的线程中启动服务就像启动IntentService. 那是对的吗?

4

11 回答 11

1411

Tejas Lagvankar 写了一篇关于这个主题的好文章。以下是 Service 和 IntentService 之间的一些主要区别。

什么时候使用?

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

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

如何触发?

  • 通过调用方法触发服务startService()

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

触发自

  • Service和IntentService可以从任何线程、活动或其他应用程序组件触发

运行

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

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

限制/缺点

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

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

什么时候停止?

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

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

于 2013-04-02T18:57:02.880 回答
171

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

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

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

的三个主要特征IntentService是:

  • 后台线程

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

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

任何和所有这些都可以通过 a 来实现而Service无需扩展IntentService.

于 2013-03-20T13:19:17.787 回答
40

服务

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

意向服务

  • 它执行长任务,通常不与主线程通信,如果需要通信,则由Handleror完成BroadcastReceiver
  • 通过调用Intent
  • 触发自Main Thread
  • 在单独的线程上运行
  • 无法并行运行任务,并且多个意图在同一个工作线程上排队。
于 2014-05-19T04:47:40.987 回答
33

不要重新发明轮子

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

那么目的是什么?

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

  • 工作线程的创建

  • 将处理多个请求一一排队(Threading

  • 摧毁Service

所以NOService可以做任何可以做的任务IntentService。如果您的要求符合上述标准,那么您不必在Service课堂上编写这些逻辑。所以不要重新发明轮子,因为IntentService是发明的轮子。

“主要”区别

Service 在 UI 线程上运行,而 IntentService 在单独的线程上运行

你什么时候使用 IntentService?

当您想要一项一项地执行超出 Activity 范围的多个后台任务时,这IntentService是完美的。

是如何IntentService制成的Service

普通服务在 UI 线程上运行(任何 Android 组件类型默认在 UI 线程上运行,例如、Activity和)。如果您必须做一些可能需要一段时间才能完成的工作,那么您必须创建一个线程。在多个请求的情况下,您将不得不处理. 给出了一些默认实现,可以为您完成这些任务。 根据开发者页面BroadcastReceiverContentProviderServicesynchronizationIntentService

  1. IntentService创建一个工作线程

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

  3. 当没有工作时IntentService调用stopSelf()方法
  4. onBind()为 null 的方法提供默认实现
  5. 将请求发送到 WorkQueue 并最终onStartCommand()发送到的默认实现IntentonHandleIntent()
于 2017-11-04T11:19:47.543 回答
15

为接受的答案加分:

请参阅 Android API 中 IntentService 的用法。例如:

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

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

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

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

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

来自Android 开发者指南

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

IntentService 中使用的设计模式

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

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

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

IntentService 有一些限制:

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

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

**

排球库

有一个名为volley-library 的库,用于开发 android 网络应用程序 ,源代码可在 GitHub 中向公众开放。

后台作业最佳实践的 android 官方文档 :有助于更好地理解意图服务、线程、处理程序、服务。以及执行网络操作

于 2014-01-02T12:22:57.190 回答
14

我相信你可以通过谷歌搜索诸如“Android IntentService vs Service”之类的东西来找到一个广泛的差异列表

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

一些例子(快速编造)可能是;

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

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

于 2013-03-20T13:03:44.087 回答
12

意向服务

IntentService在自己的线程上运行。完成后它会自行停止。更像是一发不可收拾。随后的呼叫将排队。适合排队通话。如果需要,您还可以在其中旋转多个线程IntentService- 您可以使用ThreadPoolExecutor. 我这么说是因为很多人问我“为什么要使用IntentService它,因为它不支持并行执行”。 IntentService只是一个线程。你可以在里面做任何你需要的事情——甚至可以旋转多个线程。唯一需要注意的是,IntentService一旦您旋转这些多个线程,它就会完成。它不会等待那些线程回来。你需要照顾好这个。所以我建议ThreadPoolExecutor在这些场景中使用。

  • 适合同步、上传等……</li>

服务

默认Service情况下在主线程上运行。您需要旋转一个工作线程来完成您的工作。您需要service明确停止。我将它用于当你需要在后台运行东西的情况下,即使你离开你的应用程序并返回更多的 Headless service

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

BroadcastReceivers如果需要,您可以随时使用 。

于 2015-07-19T15:51:17.270 回答
9

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

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

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

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

于 2013-03-20T13:20:30.667 回答
6

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

IntentService不能用于 Long Time Listening,就像 XMPP Listeners 一样,它是一个单一的时间运算符,完成工作并挥手告别。

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

于 2014-06-22T23:57:07.503 回答
6

Android IntentService 与服务

1.服务

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

2.意图服务

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

这里参考

于 2019-09-12T12:24:38.777 回答
5

Servicea和an之间的主要区别IntentService描述如下:

服务 :

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

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

意向服务:

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

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

于 2015-07-18T08:25:41.307 回答