服务与IntentService

roi*_*erg 753 multithreading android android-service android-intentservice

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

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

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

Jos*_*hez 1320

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

什么时候用?

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

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

怎么触发?

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

  • IntentService使用触发的意图,它产生一个新的工作线程和方法onHandleIntent()调用这个线程.

触发来自

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

运行

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

  • IntentService运行在一个单独的工作线程.

限制/缺点

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

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

什么时候停?

  • 如果您实施服务,则您有责任在工作完成后通过调用stopSelf()或停止服务stopService().(如果您只想提供绑定,则不需要实现此方法).

  • IntentService停止服务后,都开始请求被处理,所以你从来没有打电话stopSelf().

  • @Darpan服务是一种应用程序组件,可以在后台执行长时间运行的操作,但不提供用户界面.服务在其托管进程的主线程中运行.服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定).这意味着,如果您的服务要进行任何CPU密集型工作或阻止操作(例如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作. (12认同)
  • 简短而甜蜜,但如果你编辑你的答案包括CommonsWare的分数会更好,因为很多人只阅读被接受或最受欢迎的答案 (10认同)
  • @AshokBijoyDebnath你是对的!*Services*和*IntentServices*可以从任何线程,活动或其他应用程序组件启动.我刚刚编辑了答案的文本来解决这个问题.感谢您的编辑建议!:) (8认同)
  • "必须从主线程触发IntentService." 你确定吗?在我的MainActivity onCreate()中,当我从一个新的Thread(下面的代码)调用一个IntentService时,它仍然适用于我.new Thread(new Runnable(){@Override public void run(){Intent intent = new Intent(context,HelloIntentService.class); startService(intent);}}).start(); (7认同)
  • 没问题,去吧! (2认同)
  • _“该服务在后台运行,但在应用程序的主线程上运行。” _这是错误的。“服务”是一个对象。它不在任何线程上运行。“服务”的“方法”可以在任何线程上运行,生命周期方法**(“ onCreate()”,“ onStartCommand()”,“ onDestroy()”)由Android框架在主(UI)线程在实现“服务”时,通常将自己的“线程”作为工作线程或后台线程启动,并对这些线程执行长时间运行的操作。“ IntentService”只是对“ Service”的扩展,为您做一些。 (2认同)

Com*_*are 160

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

根据定义,这是不可能的.IntentServiceServiceJava代码编写的子类.因此,任何一个IntentService呢,一个Service可以做,通过包括代码的相关位IntentService使用.

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

a的三个主要特征Service是:

  • 后台线程

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

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

任何和所有这些都可以通过IntentService不扩展来实现stopSelf().

  • @edthethird:那是因为你正在捆绑主应用程序线程.所有组件上的所有生命周期方法,包括`Service`的`onStartCommand()`,都在主应用程序线程上调用.在不冻结UI的情况下,您不能将此线程占用超过几毫秒,如果您花费很多秒,您将获得与ANR相当的服务. (16认同)
  • 有点晚了,但我发现用`startService`调用的`Service`只能在抛出一个ANR之前运行大约10秒 - 一个`IntentService`开始广播一个意图似乎没有这个限制 (6认同)
  • 是的,我太快评论了.我正在做的工作`onStartCommand`而不是`onHandleIntent`--看起来`onStartCommand`在UI线程上运行,但是为onHandleIntent`执行产生了一个单独的线程. (3认同)
  • @IgorGanapolsky:``IntentService`在`onHandleIntent()`返回后调用它自己,如果没有更多的工作要做. (3认同)

Uma*_*ari 38

服务

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

IntentService

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


Sre*_*ama 15

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

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

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

    @Override
    protected void onHandleIntent(Intent intent) {  ...}
Run Code Online (Sandbox Code Playgroud)

要为您的应用程序创建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;
    }
Run Code Online (Sandbox Code Playgroud)

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

来自Android开发者指南:

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

IntentService中使用的设计模式

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

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

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

IntentService有一些限制:

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

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

**

排球图书馆

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

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


Roh*_*ngh 14

不要重新发明轮子

IntentService扩展了Service类,这明确意味着IntentService有意为同一目的而制作.

那么目的是什么?

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

  • 创建工作线程

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

  • 摧毁了 Service

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

"主要"差异

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

如何IntentService制作IntentService

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

  1. IntentService 创建一个工作线程

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

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

  • 从播放列表中一首一首下载歌曲。@维尼 (2认同)

Ste*_*ijn 12

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

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

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

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

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

  • 当我谷歌的时候,它把我带到了这里.现在我处于无限循环中. (20认同)
  • 这是非常重要的区别.例如,如果您使用服务来保持与服务器的持久连接,则不能使用intentservice,因为它在完成所有任务后立即终止 (5认同)
  • 它是另一个"如何使用"的例子.不是在专门使用服务时和在使用intentservice时.请给我一个理论上的例子,而不是链接到"如何使用"或任何其他类似的东西.我并没有要求你为我"工作",而我什么都不做,只是因为我已经看到了所有这些人,但仍然不确定. (4认同)
  • 我没有找到一个可以用一个而不用另一个做的例子.只是一些没有帮助我的解释. (2认同)

Say*_*san 12

IntentService

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

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

服务

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

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

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


njz*_*zk2 8

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

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

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

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


Dee*_*pta 6

Android IntentService 与服务

1.服务

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

2. 意向服务

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

这里参考


小智 5

如果有人可以向我展示一些你可以用a做的事情的例子,IntentService而不能用a service和其他方式完成.

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

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


Nar*_*mar 5

Servicea和 an的主要区别IntentService如下:

服务 :

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

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

意图服务:

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

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