有人可以告诉我一个可以用IntentService
完成的事情的例子吗Service
无法完成(反之亦然)?
我也相信IntentService
在不同的主题中运行而Service
则不会。所以,据我所知,在自己的线程中启动服务就像启动IntentService
。不是吗?
如果有人可以帮我解决我的两个问题,我将不胜感激。
答案 0 :(得分:1277)
Tejas Lagvankar写了一篇关于这个主题的好post。 以下是Service和IntentService之间的一些主要区别。
何时使用?
服务可用于没有UI的任务,但不能太长。如果需要执行长任务,则必须使用Service中的线程。
IntentService 可用于长任务,通常不与主线程通信。如果需要通信,可以使用主线程处理程序或广播意图。另一种使用情况是需要回调(Intent触发任务)。
如何触发?
通过调用方法startService()
触发服务。
使用Intent触发 IntentService ,它会生成一个新的工作线程,并在此线程上调用方法onHandleIntent()
。
从
触发运行
服务在后台运行,但它在应用程序的主线程上运行。
IntentService 在单独的工作线程上运行。
限制/缺点
服务可能会阻止该应用程序的主线程。
IntentService 无法并行运行任务。因此,所有连续的意图将进入工作线程的消息队列,并将按顺序执行。
什么时候停止?
如果您实施服务,则您有责任在工作完成后停止服务,方法是致电stopSelf()
或stopService()
。 (如果您只想提供绑定,则无需实现此方法。)
IntentService 在处理完所有启动请求后停止服务,因此您无需致电stopSelf()
。
答案 1 :(得分:148)
如果有人可以向我展示一些可以使用intentService完成的事情的示例,而无法通过服务完成,反之亦然。
根据定义,这是不可能的。 IntentService
是Service
的子类,用Java代码编写。因此,通过包含IntentService
使用的相关代码位,Service
可以执行IntentService
所做的任何操作。
使用自己的线程启动服务就像启动IntentService一样。不是吗?
IntentService
的三个主要特征是:
后台主题
Intent
传递给onStartCommand()
的自动排队,因此如果后台线程上的Intent
处理了一个onHandleIntent()
,则其他命令会排队轮到他们了
一旦队列为空,通过调用IntentService
自动关闭stopSelf()
任何和所有这些都可以由Service
实施而不会延长IntentService
。
答案 2 :(得分:30)
<强>服务强>
startService()
Thread
Main Thread
stopSelf()
或stopService()
<强> IntentService 强>
Handler
或BroadcastReceiver
Intent
Main Thread
答案 3 :(得分:12)
在接受的答案中添加点数:
查看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中使用的设计模式
: 这个&#34;工作队列处理器&#34;模式通常用于从应用程序的主线程卸载任务。存在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
答案 4 :(得分:11)
我确信你可以通过搜索“Android IntentService vs Service”之类的内容找到大量的差异列表
每个示例中一个更重要的差异是IntentService一旦完成就会结束。
一些例子(快速编制)可能是;
IntentService:如果您想在打开应用程序时下载一堆图像。这是一次性过程,一旦下载完所有内容就可以自我清理。
服务:一种服务,它将不断用于通过Web API调用在您的应用和后端之间进行通信。即使它已完成当前任务,您仍然希望它在几分钟之后,以获得更多通信。
答案 5 :(得分:10)
IntentService
在自己的线程上运行。
完成后它会自动停止。更像是火和忘记。
后续调用将排队。适合排队电话。
如果需要,您还可以在IntentService
内旋转多个线程 - 您可以使用ThreadPoolExecutor
实现此目的。
我这样说是因为很多人问我“为什么使用IntentService
,因为它不支持并行执行”。
IntentService
只是一个主题。你可以做任何你需要的东西 - 甚至旋转多个线程。唯一需要注意的是,一旦你旋转了多个线程,IntentService
就会完成。它不等待那些线程回来。你需要照顾这个。因此,我建议在这些情况下使用ThreadPoolExecutor
。
默认情况下Service
在主线程上运行。你需要旋转一个工作线程来完成你的工作。
您需要明确停止service
。
我将它用于你需要在后台运行东西的情况,即使你离开你的应用程序并为无头service
回来更多。
如果需要,您可以随时使用BroadcastReceivers
与您的活动进行通信。
答案 6 :(得分:8)
IntentService是Service的扩展,用于简化需要在后台和独立线程中执行的任务的执行。
IntentService启动,创建一个线程并在线程中运行其任务。一旦完成,它就会清理一切。只有一个IntentService实例可以同时运行,多个调用都被排队。
使用非常简单,非常方便用于很多用途,例如下载东西。但它有一些限制,可以让你想要使用更基本(不简单)的服务。
例如,连接到xmpp服务器并受活动约束的服务不能使用IntentService完成。你最终会忽略或覆盖IntentService的东西。
答案 7 :(得分:7)
IntentService扩展了Service类,这明确表示IntentService
是为了相同目的而故意制作的。
那么目的是什么?
`IntentService的目的是让我们的工作更容易运行后台任务,甚至不用担心
创建工作线程
逐个排队处理多个请求(Threading
)
Service
所以否,Service
可以执行IntentService
会执行的任何任务。如果您的要求符合上述标准,那么您不必在Service
课程中编写这些逻辑。
所以不要重新发明轮子,因为IntentService
是发明轮子。
当IntentService在a上运行时,服务在UI线程上运行 单独的线程
如果要逐个执行多个后台任务,这些任务超出了“活动”的范围,那么IntentService
就是完美的。
IntentService
Service
正常服务在UI线程上运行(默认情况下,任何Android组件类型都在UI线程上运行,例如Activity
,BroadcastReceiver
,ContentProvider
和Service
)。如果你需要完成一些可能需要一段时间才能完成的工作,那么你必须创建一个线程。如果有多个请求,您必须处理synchronization
。
IntentService
有一些默认实现,可以为您完成这些任务
根据{{3}}
IntentService
创建工作线程
IntentService
创建一个工作队列,逐个向onHandleIntent()
方法发送请求
IntentService
会调用stopSelf()
方法onBind()
方法的默认实现,该方法为空onStartCommand()
的默认实施,它向WorkQueue发送Intent
请求,最终发送到onHandleIntent()
答案 8 :(得分:5)
如果有人可以向我展示一些可以使用
IntentService
完成某项操作的示例,而无法使用service
进行操作,反之亦然。
IntentService
不能用于长时间聆听,就像XMPP听众一样,它是一个单一的时间操作员,完成工作并挥手告别。
它也只有一个线程工作者,但有一个技巧,你可以无限制地使用它。
答案 9 :(得分:4)
Service
和IntentService
之间的主要区别如下:
服务:
1.A Service
默认情况下,在应用程序的主线程上运行。(此处没有默认的工作线程可用)。因此,用户需要创建一个单独的线程并在该线程中执行所需的工作。 / p>
2.一次允许多个请求。(多线程)
IntentService:
1.现在,来到IntentService
,这里有一个默认的工作线程可用于执行任何操作。 请注意 - 您需要实现onHandleIntent()
方法,该方法接收每个启动请求的意图,您可以在其中执行后台工作。
2.但它一次只允许一个请求。
答案 10 :(得分:2)
Android IntentService与服务
1。服务
2。 IntentService
从Here引荐