我正在寻找的东西,可以用做一个例子IntentService
,不能用一个来完成Service
(反之亦然)?
我也相信IntentService
a在不同的线程中运行,而a Service
没有。因此,据我所知,在自己的线程中启动服务就像启动IntentService
。那是对的吗?
我正在寻找的东西,可以用做一个例子IntentService
,不能用一个来完成Service
(反之亦然)?
我也相信IntentService
a在不同的线程中运行,而a Service
没有。因此,据我所知,在自己的线程中启动服务就像启动IntentService
。那是对的吗?
Answers:
Tejas Lagvankar 就此主题写了一篇不错的文章。以下是Service和IntentService之间的一些主要区别。
什么时候使用?
该Service可以用于没有UI的任务中,但不应太长。如果需要执行长任务,则必须使用Service中的线程。
该IntentService可以在较长的任务中使用通常与主线程没有沟通。如果需要通信,则可以使用主线程处理程序或广播意图。另一个使用情况是需要回调(意图触发的任务)时。
如何触发?
该服务是通过调用方法所触发startService()
。
该IntentService使用触发的意图,它产生一个新的工作线程和方法onHandleIntent()
调用这个线程。
触发自
运行
该服务在后台运行,但在应用程序的主线程上运行。
该IntentService运行在一个单独的工作线程。
局限性/缺点
该服务可能会阻止该应用程序的主线程。
该IntentService不能并行运行的任务。因此,所有连续的意图都将进入工作线程的消息队列,并将按顺序执行。
什么时候停止?
如果您实施服务,则您有责任在服务完成时通过调用stopSelf()
或停止服务stopService()
。(如果只想提供绑定,则不需要实现此方法)。
在处理完所有启动请求之后,IntentService将停止服务,因此您无需调用stopSelf()
。
如果有人可以向我展示一个示例,该示例可以用
IntentService
和而不可以用Service
和来完成。
根据定义,这是不可能的。IntentService
是Service
Java编写的的子类。因此,通过包含所使用的相关代码位IntentService
,a Service
可以做什么都可以做IntentService
。
用自己的线程启动服务就像启动IntentService。不是吗
an的三个主要特征IntentService
是:
后台线程
Intent
传递给的s 的自动排队onStartCommand()
,因此,如果Intent
正在onHandleIntent()
后台线程上处理,则其他命令排队等候
队列为空后IntentService
,通过调用来自动关闭stopSelf()
可以通过a来实现所有这些,Service
而无需扩展IntentService
。
Service
with startService
只能在运行ANR之前运行大约10秒钟- IntentService
从广播意图开始似乎没有这个限制
onStartCommand()
的Service
。您不能在不冻结UI的情况下将线程占用超过几毫秒的时间,并且如果花费很多时间,您将获得相当于ANR的服务。
onStartCommand
,而不是onHandleIntent
-看起来就像onStartCommand
是在UI线程上运行,但一个单独的线程中催生的onHandleIntent
执行。
IntentService
在onHandleIntent()
返回后自行调用。
服务
startService()
Thread
Main Thread
stopSelf()
或stopService()
意图服务
Handler
或BroadcastReceiver
Intent
Main Thread
IntentService扩展了Service类,这显然意味着它IntentService
是出于相同目的而有意制造的。
那么目的是什么?
`IntentService的目的是使我们的工作更轻松地运行后台任务,而无需担心
创建工作线程
队列由一个处理多个请求一个(Threading
)
Service
所以NO,Service
能做到其中的任何任务IntentService
会做。如果您的要求符合上述条件,则不必在Service
类中编写这些逻辑。所以不要重新发明轮子,因为IntentService
它是发明的轮子。
服务在UI线程上运行,而IntentService在单独的线程上运行
当您要一个活动执行一个范围之外的多个后台任务时,这IntentService
是完美的选择。
IntentService
制成的Service
普通服务在UI线程上运行(默认情况下Activity
,任何Android组件类型在UI线程上运行BroadcastReceiver
,,ContentProvider
和Service
)。如果您需要做一些工作可能需要一段时间才能完成,那么您必须创建一个线程。如果有多个请求,则必须处理synchronization
。
IntentService
提供了一些默认实现,可以为您完成这些任务。
根据开发者页面
IntentService
创建一个工作线程
IntentService
创建一个工作队列,将请求onHandleIntent()
一一发送给方法
IntentService
调用stopSelf()
方法onBind()
null的方法的默认实现onStartCommand()
将Intent
请求发送到WorkQueue并最终发送到的默认实现onHandleIntent()
在接受的答案中加分:
查看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版开始,所有网络操作都应处于后台进程,否则应用程序编译/构建将失败。与用户界面分开的线程。AsyncTask类提供了从UI线程触发新任务的最简单方法之一。有关此主题的更多讨论,请参阅博客文章。
IntentService是Services的基类,可根据需要处理异步请求(表示为Intent)。客户端通过startService(Intent)调用发送请求;服务会根据需要启动,依次使用工作线程处理每个Intent,并在工作用尽时自行停止。
IntentService中使用的设计模式
:此“工作队列处理器”模式通常用于从应用程序的主线程卸载任务。存在IntentService类是为了简化此模式并注意机制。要使用它,请扩展IntentService并实现onHandleIntent(Intent)。IntentService将接收Intent,启动工作线程,并在适当时停止服务。
所有请求都在单个工作线程上处理-它们可能会花费必要的时间(并且不会阻塞应用程序的主循环),但是一次只会处理一个请求。
IntentService类提供了用于在单个后台线程上运行操作的简单结构。这使其可以处理长时间运行的操作,而不会影响用户界面的响应能力。另外,IntentService不受大多数用户界面生命周期事件的影响,因此它会在可能会关闭AsyncTask的情况下继续运行。
IntentService有一些限制:
它不能直接与您的用户界面进行交互。要将其结果放入用户界面,您必须将其发送到活动。工作请求按顺序运行。如果某个操作正在IntentService中运行,并且您向它发送了另一个请求,则该请求将等待直到第一个操作完成。在IntentService上运行的操作不能被中断。但是,在大多数情况下
IntentService是进行简单后台操作的首选方式
**
凌空图书馆
有一个名为volley-library的库,用于开发android网络应用程序 。源代码在GitHub上可供公众使用。
我敢肯定,您可以通过简单地搜索“ Android IntentService vs Service”之类的内容找到大量差异
每个示例最重要的区别之一是IntentService完成后便会自行结束。
一些例子(迅速组成)可能是:
IntentService:如果要在打开应用程序开始时下载一堆图像。这是一次性的过程,一旦下载了所有内容,便可以自行清理。
服务:一种服务,将经常用于通过Web API调用在您的应用程序和后端之间进行通信。即使完成当前任务,您仍然希望它在几分钟后才能进行更多的交流。
IntentService
在自己的线程上运行。完成后它将自行停止。更像是火与忘。随后的呼叫将排队。非常适合排队。IntentService
如果需要,还可以在其中旋转多个线程-可以使用实现此目的ThreadPoolExecutor
。我之所以这样说,是因为许多人问我“为什么使用IntentService
它,因为它不支持并行执行”。
IntentService
只是一个线程。您可以在其中执行所需的任何操作-甚至旋转多个线程。唯一的警告是,IntentService
一旦旋转这些多线程,该操作就会结束。它不等待这些线程返回。您需要注意这一点。因此,我建议ThreadPoolExecutor
在这些情况下使用。
默认Service
情况下在主线程上运行。您需要旋转辅助线程来完成工作。您需要service
明确停止。我将它用于需要在后台运行某些内容的情况下,即使您离开应用程序而返回更多内容以实现Headless service
。
您可以随时BroadcastReceivers
根据需要与活动交流 。
IntentService是Service的扩展,旨在简化需要在后台和单独线程中执行的任务的执行。
IntentService启动,创建线程并在线程中运行其任务。一旦完成,它将清理所有内容。IntentService的一个实例只能同时运行,将多个调用排队。
它非常易于使用,并且对于许多用途(例如下载内容)非常方便。但是它有局限性,可能使您想使用更基本(而不是简单)的服务。
例如,连接到xmpp服务器并受活动限制的服务不能简单地使用IntentService来完成。您最终将忽略或覆盖IntentService。
Android IntentService与服务
1.服务
2. IntentService
从这里参考
IntentService is used for short tasks (etc) and a service is for long ones
你在哪里读的?