服务与IntentService

问题描述 投票:716回答:10

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

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

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

android multithreading android-service android-intentservice
10个回答
1296
投票

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

什么时候用?

  • 该服务可用于没有UI的任务,但不应太长。如果需要执行长任务,则必须使用Service中的线程。
  • IntentService可用于长任务,通常不与主线程通信。如果需要通信,可以使用主线程处理程序或广播意图。另一种使用情况是需要回调时(Intent触发的任务)。

怎么触发?

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

触发来自

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

运行

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

限制/缺点

  • 服务可能会阻止应用程序的主线程。
  • IntentService无法并行运行任务。因此,所有连续的意图将进入工作线程的消息队列,并将按顺序执行。

什么时候停?

  • 如果您实施了服务,则通过调用stopSelf()stopService(),您有责任在工作完成后停止服务。 (如果您只想提供绑定,则不需要实现此方法)。
  • 在处理完所有启动请求后,IntentService会停止服务,因此您永远不必调用stopSelf()

4
投票

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

服务:

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

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

IntentService:

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

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


152
投票

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

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

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

IntentService的三个主要特征是:

  • 后台线程
  • Intents的自动排队发送到onStartCommand(),所以如果Intent在后台线程上处理一个onHandleIntent(),其他命令排队等待轮到他们
  • 一旦队列为空,通过调用IntentService自动关闭stopSelf()

任何和所有这一切都可以通过Service实现而不扩展IntentService


35
投票

服务

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

IntentService

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

14
投票

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

查看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中使用的设计模式

:此“工作队列处理器”模式通常用于从应用程序的主线程卸载任务。存在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


11
投票

我相信你可以通过谷歌搜索“Android IntentService vs Service”之类的东西找到大量的差异列表

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

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

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

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


11
投票

IntentService

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

  • 适用于同步,上传等...

Service

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

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

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


9
投票

Don't reinvent the wheel

IntentService延伸Service类,这显然意味着IntentService是故意为同一目的而制造的。

那么目的是什么?

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

  • 创建工作线程
  • 逐个排队处理多个请求(Threading
  • 摧毁Service

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

The "Main" difference

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

你什么时候使用IntentService?

当你想逐个执行多个后台任务时,这些任务超出了Activity的范围,那么IntentService就是完美的。

IntentService是如何由Service制成的

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

  1. IntentService创建了一个工作线程
  2. IntentService创建一个工作队列,逐个向onHandleIntent()方法发送请求
  3. 当没有工作时,IntentServicestopSelf()方法
  4. 提供onBind()方法的默认实现,该方法为null
  5. onStartCommand()的默认实现,它将Intent请求发送到WorkQueue并最终发送到onHandleIntent()

8
投票

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

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

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

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


5
投票

如果有人可以向我展示一些你可以用IntentService做的事情的例子,并且不能用service完成,反之亦然。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.