Android平台中的服务与IntentService

Android平台中的服务与IntentService,android,multithreading,android-service,android-intentservice,Android,Multithreading,Android Service,Android Intentservice,我正在寻找一个可以用IntentService完成而不能用服务完成的事情的例子(反之亦然) 我还相信IntentService运行在不同的线程中,而服务运行在不同的线程中。因此,在我看来,在自己的线程中启动服务就像启动IntentService。这是正确的吗?我相信,只要在谷歌上搜索“Android IntentService vs Service”之类的内容,你就可以找到大量的差异 每个示例更重要的区别之一是,一旦完成,IntentService就会自动结束 一些例子(迅速编造)可以是: In

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


我还相信
IntentService
运行在不同的线程中,而
服务运行在不同的线程中。因此,在我看来,在自己的线程中启动服务就像启动
IntentService
。这是正确的吗?

我相信,只要在谷歌上搜索“Android IntentService vs Service”之类的内容,你就可以找到大量的差异

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

一些例子(迅速编造)可以是:

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

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

如果有人能给我举一个例子,说明可以用
IntentService
来完成,而不能用
服务来完成,反之亦然

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

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

IntentService
的三个主要功能是:

  • 背景线

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

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


所有这些都可以通过
服务实现,而无需扩展
IntentService

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

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

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


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

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

何时使用?

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

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

如何触发?

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

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

从触发

  • 服务和IntentService可以从任何线程、活动或其他应用程序组件触发
运行于

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

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

限制/缺点

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

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

何时停止?

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

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


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

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

要为应用程序创建IntentService组件,请定义一个扩展IntentService的类,并在其中定义一个重写OnHandleContent()的方法

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

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }
对许多人来说,将异步任务一起服务是最好的方法之一 负载不大的用例。或者只是创建一个类 扩展意图驱动。来自安卓4.0版的所有网络 操作应在后台进程中进行,否则应用程序编译/构建失败。 从UI中分离线程。AsyncTask类提供了从UI线程启动新任务的最简单方法之一。更多讨论
  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }