有人可以告诉我一个可以使用IntentService
无法完成的Service
的事情的例子(反之亦然)?
我也相信IntentService
在不同的线程中运行而Service
不会。所以,据我所知,在自己的线程中启动服务就像启动一个IntentService
。不是吗?
如果有人可以帮我解决我的两个问题,我将不胜感激。
Tejas Lagvankar写了一篇很好的关于这个主题的post。以下是Service和IntentService之间的一些主要区别。
什么时候用?
怎么触发?
startService()
触发服务。onHandleIntent()
。触发来自
运行
限制/缺点
什么时候停?
stopSelf()
或stopService()
,您有责任在工作完成后停止服务。 (如果您只想提供绑定,则不需要实现此方法)。stopSelf()
。Service
和IntentService
之间的主要区别描述如下:
服务:
1.默认情况下,Service
在应用程序的主线程上运行。(此处没有默认的工作线程可用)。因此,用户需要创建一个单独的线程并在该线程中执行所需的工作。
2.一次允许多个请求。(多线程)
IntentService:
1.现在,来到IntentService
,这里有一个默认的工作线程可以执行任何操作。请注意 - 您需要实现onHandleIntent()
方法,该方法接收每个启动请求的意图,您可以在其中执行后台工作。
但它一次只允许一个请求。
如果有人可以向我展示一些可以用
IntentService
完成的事情的例子,并且不能用Service
完成,反之亦然。
根据定义,这是不可能的。 IntentService
是用Java编写的Service
的子类。因此,通过包括IntentService
使用的相关代码,Service
可以做的任何事情都是IntentService
所做的。
使用自己的线程启动服务就像启动IntentService一样。不是吗?
IntentService
的三个主要特征是:
Intent
s的自动排队发送到onStartCommand()
,所以如果Intent
在后台线程上处理一个onHandleIntent()
,其他命令排队等待轮到他们IntentService
自动关闭stopSelf()
任何和所有这一切都可以通过Service
实现而不扩展IntentService
。
服务
startService()
发起Thread
触发Main Thread
上运行stopSelf()
或stopService()
来停止服务IntentService
Handler
或BroadcastReceiver
完成Intent
调用Main Thread
触发在接受的答案中添加点数:
查看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是服务的基类,可根据需要处理异步请求(表示为Intents)。客户端通过startService(Intent)调用发送请求;服务根据需要启动,依次使用工作线程处理每个Intent,并在工作失败时自行停止。
IntentService中使用的设计模式
:此“工作队列处理器”模式通常用于从应用程序的主线程卸载任务。存在IntentService类以简化此模式并处理机制。要使用它,请扩展IntentService并实现onHandleIntent(Intent)。 IntentService将接收Intents,启动工作线程,并根据需要停止服务。
所有请求都在一个工作线程上处理 - 它们可能需要多长时间(并且不会阻止应用程序的主循环),但一次只能处理一个请求。
IntentService类提供了一个简单的结构,用于在单个后台线程上运行操作。这使它能够处理长时间运行的操作,而不会影响用户界面的响应能力。此外,IntentService不受大多数用户界面生命周期事件的影响,因此它会在关闭AsyncTask的情况下继续运行。
IntentService有一些限制:
它无法直接与您的用户界面交互。要将结果放在UI中,您必须将它们发送到活动。工作请求按顺序运行。如果某个操作在IntentService中运行,并且您向其发送另一个请求,则该请求将一直等到第一个操作完成。无法中断在IntentService上运行的操作。但是,在大多数情况下
IntentService是简单后台操作的首选方式
**
排球图书馆
有一个名为volley-library for developing android networking applications的库。源代码在GitHub中可供公众使用。
Best practices for Background jobs的android官方文档:有助于更好地理解意图服务,线程,处理程序,服务。还有Performing Network Operations
我相信你可以通过谷歌搜索“Android IntentService vs Service”之类的东西找到大量的差异列表
每个示例的一个更重要的差异是IntentService一旦完成就会结束。
一些例子(快速编制)可能是;
IntentService:如果您想在打开应用程序时下载一堆图像。这是一次性过程,一旦下载完所有内容就可以自我清理。
服务:一种服务,它将不断用于通过Web API调用在您的应用和后端之间进行通信。即使它已完成当前任务,您仍然希望它在几分钟之后,以获得更多通信。
IntentService
运行自己的线程。完成后它会自动停止。更像是火和忘记。后续调用将排队。适合排队电话。您还可以在需要的IntentService
中旋转多个线程 - 您可以使用ThreadPoolExecutor
实现此目的。我这样说是因为很多人问我“为什么要使用IntentService
,因为它不支持并行执行”。 IntentService
只是一个主题。你可以做任何你需要的东西 - 甚至旋转多个线程。唯一的警告是,一旦你旋转那些多线程,IntentService
就会完成。它不等待那些线程回来。你需要照顾这个。所以我建议在这些场景中使用ThreadPoolExecutor
。
默认情况下,Service
在主线程上运行。你需要旋转一个工作线程来完成你的工作。你需要明确地停止service
。我使用它的情况是你需要在后台运行东西,即使你离开你的应用程序并回来更多的无头service
。
如果需要,您可以随时使用BroadcastReceivers
与您的活动进行沟通。
IntentService延伸Service类,这显然意味着IntentService
是故意为同一目的而制造的。
那么目的是什么?
`IntentService的目的是让我们的工作更容易运行后台任务,甚至不用担心
Threading
)Service
所以不,Service
可以做任何IntentService
会做的任务。如果您的要求符合上述标准,那么您不必在Service
类中编写这些逻辑。所以不要重新发明轮子,因为IntentService
是发明的轮子。
服务在UI线程上运行,而IntentService在单独的线程上运行
当你想逐个执行多个后台任务时,这些任务超出了Activity的范围,那么IntentService
就是完美的。
IntentService
是如何由Service
制成的正常服务在UI线程上运行(默认情况下,任何Android组件类型都在UI线程上运行,例如Activity
,BroadcastReceiver
,ContentProvider
和Service
)。如果你需要完成一些可能需要一段时间才能完成的工作,那么你必须创建一个线程。如果有多个请求,您将不得不处理synchronization
。 IntentService
有一些默认实现,可以为您完成这些任务。
根据developer page
IntentService
创建了一个工作线程IntentService
创建一个工作队列,逐个向onHandleIntent()
方法发送请求IntentService
称stopSelf()
方法onBind()
方法的默认实现,该方法为nullonStartCommand()
的默认实现,它将Intent
请求发送到WorkQueue并最终发送到onHandleIntent()
IntentService是Service的扩展,用于简化需要在后台和独立线程中执行的任务的执行。
IntentService启动,创建一个线程并在线程中运行其任务。一旦完成,它就会清理一切。只有一个IntentService实例可以同时运行,多个调用都会排队。
它使用起来非常简单,非常方便用于很多用途,例如下载东西。但它有一些限制,可以让你想要使用更基本(不简单)的服务。
例如,连接到xmpp服务器并受活动约束的服务不能使用IntentService简单地完成。你最终会忽略或覆盖IntentService的东西。
如果有人可以向我展示一些你可以用
IntentService
做的事情的例子,并且不能用service
完成,反之亦然。
IntentService
不能用于长时间聆听,就像XMPP听众一样,它是一个单一的时间操作员,完成工作并挥手告别。
它也只有一个线程工程师,但有一个技巧,你可以无限制地使用它。