我正在寻找一个可以IntentService
用 a 不能完成的事情的例子Service
(反之亦然)?
我也相信IntentService
a 在不同的线程中运行而 aService
不会。因此,据我所知,在自己的线程中启动服务就像启动IntentService
. 那是对的吗?
我正在寻找一个可以IntentService
用 a 不能完成的事情的例子Service
(反之亦然)?
我也相信IntentService
a 在不同的线程中运行而 aService
不会。因此,据我所知,在自己的线程中启动服务就像启动IntentService
. 那是对的吗?
Tejas Lagvankar 写了一篇关于这个主题的好文章。以下是 Service 和 IntentService 之间的一些主要区别。
什么时候使用?
Service可以在没有 UI 的任务中使用,但不应该太长。如果需要执行长任务,则必须在 Service 中使用线程。
IntentService可用于通常不与主线程通信的长任务。如果需要通信,可以使用主线程处理程序或广播意图。另一种使用情况是需要回调时(意图触发的任务)。
如何触发?
通过调用方法触发服务startService()
。
IntentService使用 Intent 触发,它产生一个新的工作线程,并在该线程上调用该方法onHandleIntent()
。
触发自
运行
该服务在后台运行,但它在应用程序的主线程上运行。
IntentService在单独的工作线程上运行。
限制/缺点
服务可能会阻塞应用程序的主线程。
IntentService不能并行运行任务。因此,所有连续的意图都将进入工作线程的消息队列并按顺序执行。
什么时候停止?
如果你实现了一个服务,你有责任在服务完成后通过调用stopSelf()
或停止服务stopService()
。(如果只想提供绑定,则不需要实现此方法)。
IntentService在处理完所有启动请求后停止服务,因此您无需调用stopSelf()
.
如果有人可以向我展示一个可以
IntentService
用 a 完成而不能用 a 完成的事情的例子,反之亦然Service
。
根据定义,这是不可能的。IntentService
是 的子类Service
,用 Java 编写。因此,通过包含使用的相关代码位,任何 an可以做IntentService
的事情。Service
IntentService
使用自己的线程启动服务就像启动 IntentService。不是吗?
的三个主要特征IntentService
是:
后台线程
s的自动排队Intent
传递给onStartCommand()
,所以如果一个Intent
正在被onHandleIntent()
后台线程处理,其他命令排队等待轮到他们
一旦队列为空IntentService
,通过调用自动关闭stopSelf()
任何和所有这些都可以通过 a 来实现而Service
无需扩展IntentService
.
服务
startService()
Thread
Main Thread
stopSelf()
或停止服务stopService()
意向服务
Handler
or完成BroadcastReceiver
Intent
Main Thread
IntentService扩展了Service类,这显然意味着它是为相同目的IntentService
而故意制作的。
那么目的是什么?
`IntentService 的目的是让我们的工作更容易运行后台任务,甚至不用担心
工作线程的创建
将处理多个请求一一排队(Threading
)
Service
所以NO,Service
可以做任何可以做的任务IntentService
。如果您的要求符合上述标准,那么您不必在Service
课堂上编写这些逻辑。所以不要重新发明轮子,因为IntentService
是发明的轮子。
Service 在 UI 线程上运行,而 IntentService 在单独的线程上运行
当您想要一项一项地执行超出 Activity 范围的多个后台任务时,这IntentService
是完美的。
IntentService
制成的Service
普通服务在 UI 线程上运行(任何 Android 组件类型默认在 UI 线程上运行,例如、Activity
和)。如果您必须做一些可能需要一段时间才能完成的工作,那么您必须创建一个线程。在多个请求的情况下,您将不得不处理.
给出了一些默认实现,可以为您完成这些任务。
根据开发者页面BroadcastReceiver
ContentProvider
Service
synchronization
IntentService
IntentService
创建一个工作线程
IntentService
创建一个工作队列,将请求onHandleIntent()
一一发送到方法
IntentService
调用stopSelf()
方法onBind()
为 null 的方法提供默认实现onStartCommand()
发送到的默认实现Intent
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 版开始,所有网络操作都应在后台进程中进行,否则应用程序编译/构建将失败。与 UI 分离的线程。AsyncTask 类提供了一种从 UI 线程触发新任务的最简单方法。有关此主题的更多讨论,请参阅博客文章
IntentService 是按需处理异步请求(表示为 Intent)的服务的基类。客户端通过 startService(Intent) 调用发送请求;该服务根据需要启动,依次使用工作线程处理每个 Intent,并在其工作结束时自行停止。
IntentService 中使用的设计模式
:这种“工作队列处理器”模式通常用于从应用程序的主线程卸载任务。IntentService 类的存在是为了简化这种模式并处理机制。要使用它,请扩展 IntentService 并实现 onHandleIntent(Intent)。IntentService 将接收 Intent,启动工作线程,并酌情停止服务。
所有请求都在单个工作线程上处理——它们可能需要尽可能长的时间(并且不会阻塞应用程序的主循环),但一次只会处理一个请求。
IntentService 类为在单个后台线程上运行操作提供了一个简单的结构。这允许它处理长时间运行的操作,而不会影响用户界面的响应能力。此外,IntentService 不受大多数用户界面生命周期事件的影响,因此它会在会关闭 AsyncTask 的情况下继续运行。
IntentService 有一些限制:
它不能直接与您的用户界面交互。要将其结果放入 UI,您必须将它们发送到 Activity。工作请求按顺序运行。如果一个操作正在 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 的东西。
如果有人可以给我看一个例子,你可以用 a 完成,
IntentService
不能用 a 完成,service
反之亦然。
IntentService
不能用于 Long Time Listening,就像 XMPP Listeners 一样,它是一个单一的时间运算符,完成工作并挥手告别。
它也只有一个线程工作者,但有一个技巧,你可以无限使用它。
Android IntentService 与服务
1.服务
2.意图服务
从这里参考
Service
a和an之间的主要区别IntentService
描述如下:
服务 :
1.AService
默认运行在应用程序的主线程上。(这里没有默认的工作线程可用)。所以用户需要创建一个单独的线程并在该线程中完成所需的工作。
2.一次允许多个请求。(多线程)
意向服务:
1.现在,来到IntentService
这里,这里有一个默认的工作线程可以执行任何操作。请注意- 您需要实现onHandleIntent()
方法,该方法接收每个启动请求的意图,您可以在其中进行后台工作。
2.但它一次只允许一个请求。