Android平台中的服务与IntentService
我正在寻找一个可以用Android平台中的服务与IntentService,android,multithreading,android-service,android-intentservice,Android,Multithreading,Android Service,Android Intentservice,我正在寻找一个可以用IntentService完成而不能用服务完成的事情的例子(反之亦然) 我还相信IntentService运行在不同的线程中,而服务运行在不同的线程中。因此,在我看来,在自己的线程中启动服务就像启动IntentService。这是正确的吗?我相信,只要在谷歌上搜索“Android IntentService vs Service”之类的内容,你就可以找到大量的差异 每个示例更重要的区别之一是,一旦完成,IntentService就会自动结束 一些例子(迅速编造)可以是: In
IntentService
完成而不能用服务
完成的事情的例子(反之亦然)
我还相信
IntentService
运行在不同的线程中,而服务运行在不同的线程中。因此,在我看来,在自己的线程中启动服务就像启动IntentService
。这是正确的吗?我相信,只要在谷歌上搜索“Android IntentService vs Service”之类的内容,你就可以找到大量的差异
每个示例更重要的区别之一是,一旦完成,IntentService就会自动结束
一些例子(迅速编造)可以是:
IntentService:如果你想在开始打开应用程序时下载一堆图像。这是一个一次性的过程,一旦下载了所有内容,就可以进行自我清理
服务:通过web API调用在应用程序和后端之间不断进行通信的服务。即使它完成了当前任务,您仍然希望它在几分钟后出现,以便进行更多的交流
如果有人能给我举一个例子,说明可以用IntentService
来完成,而不能用服务来完成,反之亦然
根据定义,这是不可能的IntentService
是用Java编写的Service
的子类。因此,IntentService
所做的任何事情,服务
都可以通过包含IntentService
使用的相关代码位来完成
使用自己的线程启动服务就像启动IntentService一样。不是吗
IntentService
的三个主要功能是:
- 背景线
- 将
Intent
自动排队发送到onStartCommand()
,因此,如果后台线程上的onHandleIntent()
正在处理一个Intent
,其他命令将排队等待轮到它们
- 一旦队列为空,通过调用
stopSelf()
自动关闭IntentService
所有这些都可以通过服务实现,而无需扩展IntentService
IntentService是一种服务的扩展,用于简化需要在后台和单独线程中执行的任务的执行
IntentService启动、创建线程并在线程中运行其任务。一旦完成,它会清理一切。一个IntentService只能同时运行一个实例,多个调用被排队
它使用起来非常简单,对于很多用途来说非常方便,比如下载东西。但它有一些限制,可能会让您希望使用更基本(而不是简单)的服务
例如,连接到xmpp服务器并由活动绑定的服务不能简单地使用IntentService完成。你最终会忽略或覆盖IntentService的内容。Tejas Lagvankar写了一篇关于这个主题的好文章。
下面是Service和IntentService之间的一些关键区别
何时使用?
- 该服务可以在没有UI的任务中使用,但不能太长。若需要执行长任务,则必须在服务中使用线程
- IntentService可以在长任务中使用,通常不与主线程通信。如果需要通信,可以使用主线程处理程序或广播意图。另一种使用情况是需要回调时(意图触发的任务)
如何触发?
- 该服务是通过调用方法
startService()
触发的
- IntentService是使用Intent触发的,它生成一个新的工作线程,并在此线程上调用方法
onHandleIntent()
从触发
- 服务和IntentService可以从任何线程、活动或其他应用程序组件触发
运行于
- 该服务在后台运行,但在应用程序的主线程上运行
- IntentService在单独的工作线程上运行
限制/缺点
- 该服务可能会阻止应用程序的主线程
- IntentService无法并行运行任务。因此,所有连续的意图都将进入工作线程的消息队列并按顺序执行
何时停止?
- 如果您实现了一项服务,则您有责任在服务完成后通过调用
stopSelf()
或stopService()
停止服务。(如果您只想提供绑定,则不需要实现此方法)
- IntentService在处理完所有启动请求后停止服务,因此您不必调用
stopSelf()
在接受的答案中添加分数:
请参阅Android API中IntentService的用法。
例如:
要为应用程序创建IntentService组件,请定义一个扩展IntentService的类,并在其中定义一个重写OnHandleContent()的方法
另外,请参阅IntentService的源代码,它的构造函数和生命周期方法,如onStartCommand
@Override
public int More ...onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
对许多人来说,将异步任务一起服务是最好的方法之一
负载不大的用例。或者只是创建一个类
扩展意图驱动。来自安卓4.0版的所有网络
操作应在后台进程中进行,否则应用程序编译/构建失败。
从UI中分离线程。AsyncTask类提供了从UI线程启动新任务的最简单方法之一。更多讨论
@Override
public int More ...onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}