服务与IntentService

时间:2013-03-20 13:00:27

标签: android multithreading android-service android-intentservice

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

我也相信IntentService在不同的主题中运行而Service则不会。所以,据我所知,在自己的线程中启动服务就像启动IntentService。不是吗?

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

11 个答案:

答案 0 :(得分:1277)

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

何时使用?

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

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

如何触发?

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

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

触发
  • 可以从任何线程,活动或其他应用程序组件触发服务 IntentService

运行

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

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

限制/缺点

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

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

什么时候停止?

  • 如果您实施服务,则您有责任在工作完成后停止服务,方法是致电stopSelf()stopService()。 (如果您只想提供绑定,则无需实现此方法。)

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

答案 1 :(得分:148)

  

如果有人可以向我展示一些可以使用intentService完成的事情的示例,而无法通过服务完成,反之亦然。

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

  

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

IntentService的三个主要特征是:

  • 后台主题

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

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

任何和所有这些都可以由Service实施而不会延长IntentService

答案 2 :(得分:30)

<强>服务

  • startService()
  • 调用
  • 从任何Thread
  • 触发
  • Main Thread
  • 上运行
  • 可能阻止主(UI)线程。始终在服务中使用线程以执行长任务
  • 任务完成后,我们有责任致电stopSelf()stopService()
  • 停止服务

<强> IntentService

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

答案 3 :(得分:12)

在接受的答案中添加点数:

查看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 developers guide

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

  

IntentService中使用的设计模式

: 这个&#34;工作队列处理器&#34;模式通常用于从应用程序的主线程卸载任务。存在IntentService类以简化此模式并处理机制。要使用它,请扩展IntentService并实现onHandleIntent(Intent)。 IntentService将接收Intents,启动工作线程,并根据需要停止服务。

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

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

IntentService有一些限制:

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

  

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

**

  排球图书馆

有一个名为volley-library for developing android networking applications的图书馆 源代码在GitHub中可供公众使用。

Best practices for Background jobs的android官方文档: 有助于更好地理解意图服务,线程,处理程序,服务。还有Performing Network Operations

答案 4 :(得分:11)

我确信你可以通过搜索“Android IntentService vs Service”之类的内容找到大量的差异列表

每个示例中一个更重要的差异是IntentService一旦完成就会结束。

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

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

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

答案 5 :(得分:10)

IntentService

IntentService在自己的线程上运行。 完成后它会自动停止。更像是火和忘记。 后续调用将排队。适合排队电话。 如果需要,您还可以在IntentService内旋转多个线程 - 您可以使用ThreadPoolExecutor实现此目的。  我这样说是因为很多人问我“为什么使用IntentService,因为它不支持并行执行”。 IntentService只是一个主题。你可以做任何你需要的东西 - 甚至旋转多个线程。唯一需要注意的是,一旦你旋转了多个线程,IntentService就会完成。它不等待那些线程回来。你需要照顾这个。因此,我建议在这些情况下使用ThreadPoolExecutor

  • 适合同步,上传等......

服务

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

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

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

答案 6 :(得分:8)

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

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

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

例如,连接到xmpp服务器并受活动约束的服务不能使用IntentService完成。你最终会忽略或覆盖IntentService的东西。

答案 7 :(得分:7)

不要重新发明轮子

IntentService扩展了Service类,这明确表示IntentService是为了相同目的而故意制作的。

那么目的是什么?

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

  • 创建工作线程

  • 逐个排队处理多个请求(Threading

  • 销毁Service

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

“主要”差异<​​/ h1>
  

当IntentService在a上运行时,服务在UI线程上运行   单独的线程

您何时使用IntentService?

如果要逐个执行多个后台任务,这些任务超出了“活动”的范围,那么IntentService就是完美的。

如何从IntentService

制作Service

正常服务在UI线程上运行(默认情况下,任何Android组件类型都在UI线程上运行,例如ActivityBroadcastReceiverContentProviderService)。如果你需要完成一些可能需要一段时间才能完成的工作,那么你必须创建一个线程。如果有多个请求,您必须处理synchronizationIntentService有一些默认实现,可以为您完成这些任务 根据{{​​3}}

  1. IntentService创建工作线程

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

  3. 如果没有工作,则IntentService会调用stopSelf()方法
  4. 提供onBind()方法的默认实现,该方法为空
  5. onStartCommand()的默认实施,它向WorkQueue发送Intent请求,最终发送到onHandleIntent()

答案 8 :(得分:5)

  

如果有人可以向我展示一些可以使用IntentService完成某项操作的示例,而无法使用service进行操作,反之亦然。

IntentService不能用于长时间聆听,就像XMPP听众一样,它是一个单一的时间操作员,完成工作并挥手告别。

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

答案 9 :(得分:4)

ServiceIntentService之间的主要区别如下:

服务:

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

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

IntentService:

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

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

答案 10 :(得分:2)

Android IntentService与服务

1。服务

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

2。 IntentService

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

Here引荐