我正在寻找一个可以用IntentService完成但不能用Service完成的示例(反之亦然)?
我还认为IntentService在不同的线程中运行,而Service则不运行。因此,就我所见,在自己的线程中启动服务就像启动IntentService一样。这是正确的吗?
我正在寻找一个可以用IntentService完成但不能用Service完成的示例(反之亦然)?
我还认为IntentService在不同的线程中运行,而Service则不运行。因此,就我所见,在自己的线程中启动服务就像启动IntentService一样。这是正确的吗?
当前回答
IntentService是服务的扩展,用于简化需要在后台和单独线程中执行的任务的执行。
IntentService启动,创建一个线程并在线程中运行其任务。一旦完成,它就会清洁一切。IntentService的一个实例只能同时运行,多个调用被排队。
它的使用非常简单,对于很多用途都非常方便,例如下载东西。但它有一些限制,可能会让你想使用更基本(不简单)的服务。
例如,连接到xmpp服务器并由活动绑定的服务不能简单地使用IntentService完成。您最终将忽略或覆盖IntentService内容。
其他回答
我相信你只需在谷歌上搜索诸如“Android IntentService vs Service”之类的内容,就能找到一系列不同之处
每个示例中一个更重要的区别是IntentService在完成后会自动结束。
一些例子(很快编好)可能是:;
IntentService:如果你想在打开应用程序时下载一堆图片。这是一个一次性的过程,一旦下载完所有内容,就可以自行清理。
服务:一种服务,它将不断用于通过web API调用在应用程序和后端之间进行通信。即使它完成了当前任务,您仍然希望它在几分钟后出现,以便进行更多的交流。
如果有人能向我展示一个可以用IntentService完成而不能用Service完成的事情的例子。
根据定义,这是不可能的。IntentService是服务的一个子类,用Java编写。因此,IntentService所做的任何事情,服务都可以通过包含IntentService使用的相关代码位来完成。
使用自己的线程启动服务就像启动IntentService。不是吗?
IntentService的三个主要功能是:
后台线程传递给onStartCommand()的Intent的自动排队,因此如果后台线程上的onHandleIntent()正在处理一个Intent,其他命令将排队等待一旦队列为空,通过调用stopSelf()自动关闭IntentService
所有这些都可以由服务实现,而无需扩展IntentService。
服务和IntentService之间的主要区别如下:
服务:
1.默认情况下,服务在应用程序的主线程上运行。(这里没有默认的工作线程可用)。因此用户需要创建一个单独的线程,并在该线程中执行所需的工作。
2.一次允许多个请求。(多线程)
意向服务:
1.现在,来到IntentService,这里有一个默认的工作线程可以执行任何操作。注意-您需要实现onHandleIntent()方法,该方法接收每个启动请求的意图,在那里您可以执行后台工作。
2.但它一次只允许一个请求。
为接受的答案加分:
请参阅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服务在一起是最好的方法之一有效负载不是很大的用例。或者创建一个类延伸IntentDrive。从Android 4.0版所有网络操作应该在后台进行,否则应用程序编译/构建失败。将线程与UI分离。AsyncTask类提供了从UI线程启动新任务的最简单方法之一。有关此主题的更多讨论,请参阅博客文章
来自Android开发者指南:
IntentService是按需处理异步请求(表示为Intents)的服务的基类。客户端通过startService(Intent)调用发送请求;该服务根据需要启动,依次使用工作线程处理每个Intent,并在其耗尽工作时自行停止。
IntentService中使用的设计模式
:这种“工作队列处理器”模式通常用于从应用程序的主线程卸载任务。IntentService类的存在是为了简化此模式并处理机制。要使用它,请扩展IntentService并实现onHandleIntent(Intent)。IntentService将接收Intent,启动一个工作线程,并根据需要停止服务。
所有请求都在一个工作线程上处理——它们可能需要尽可能长的时间(并且不会阻塞应用程序的主循环),但一次只能处理一个请求。
IntentService类为在单个后台线程上运行操作提供了一种简单的结构。这允许它处理长时间运行的操作,而不会影响用户界面的响应能力。此外,IntentService不受大多数用户界面生命周期事件的影响,因此它会在关闭AsyncTask的情况下继续运行。
IntentService有几个限制:
它不能直接与用户界面交互。要将其结果放在UI中,必须将其发送到“活动”。工作请求按顺序运行。如果一个操作正在IntentService中运行,并且您向它发送了另一个请求,则该请求将等待第一个操作完成。无法中断IntentService上运行的操作。然而,在大多数情况下
IntentService是简单后台操作的首选方式
**
沃尔利图书馆
有一个名为volleylibrary的库,用于开发android网络应用程序源代码可在GitHub中向公众提供。
后台作业最佳实践的android官方文档:帮助更好地理解intent服务、线程、处理程序和服务。以及执行网络操作
轮子
IntentService扩展了Service类,这显然意味着IntentService是为了相同的目的而故意创建的。
那么目的是什么呢?
`IntentService的目的是让我们的工作更容易运行后台任务,而不用担心
创建工作线程逐一排队处理多个请求(线程)破坏服务
所以不,Service可以完成IntentService所能完成的任何任务。如果您的需求符合上述标准,那么您不必在Service类中编写这些逻辑。所以不要再发明轮子,因为IntentService是发明的轮子。
“主要”区别
服务在UI线程上运行,而IntentService在单独的线程
你什么时候使用IntentService?
当您希望逐个执行超出“活动”范围的多个后台任务时,IntentService是完美的。
IntentService是如何从服务生成的
正常服务在UI线程上运行(默认情况下,任何Android组件类型都在UI线程中运行,例如Activity、BroadcastReceiver、ContentProvider和service)。如果你必须做一些可能需要一段时间才能完成的工作,那么你必须创建一个线程。在多个请求的情况下,您必须处理同步。IntentService提供了一些为您执行这些任务的默认实现。根据开发者页面
IntentService创建工作线程IntentService创建一个工作队列,将请求逐个发送到onHandleIntent()方法当没有工作时,IntentService调用stopSelf()方法为空的onBind()方法提供默认实现onStartCommand()的默认实现,它将Intent请求发送到WorkQueue,并最终发送到onHandleIntent()