服务vs IntentService
有人可以告诉我一个可以用一个Service
无法完成的IntentService
(反之亦然)可以完成的事情的例子吗?
我也相信一个IntentService
运行在另一个线程中,一个Service
不运行。 所以,据我所知,在自己的线程中启动一个服务就像启动一个IntentService
。 不是吗?
如果有人能帮我解决我的两个问题,我将不胜感激。
Tejas Lagvankar写了一个关于这个问题的好post 。 以下是Service和IntentService之间的一些关键区别。
何时使用?
-
该服务可以用于没有UI的任务,但不应该太长。 如果您需要执行长时间的任务,则必须在Service中使用线程。
-
IntentService可用于长时间的任务,通常不会与主线程通信。 如果需要通信,可以使用主线程处理程序或广播意图。 另一个使用情况是需要callback(意图触发的任务)。
如何触发?
-
该服务由调用方法
startService()
触发。 -
IntentService是使用一个Intent来触发的,它产生一个新的工作者线程,并且在这个线程上调用
onHandleIntent()
方法。
触发
- Service和IntentService可以从任何线程,活动或其他应用程序组件中触发。
运行
-
该服务在后台运行,但在应用程序的主线程上运行。
-
IntentService在单独的工作线程上运行。
限制/缺点
-
该服务可能会阻止应用程序的主线程。
-
IntentService不能并行运行任务。 因此,所有连续的意图都将进入工作线程的消息队列,并将按顺序执行。
何时停止?
-
如果你实现了一个服务 ,那么你的责任就是通过调用
stopSelf()
或者stopService()
来完成它的工作。 (如果你只想提供绑定,你不需要实现这个方法)。 -
IntentService在处理完所有启动请求后停止服务,因此您不必调用
stopSelf()
。
如果有人能够向我展示一个你可以用intentService完成的事情的例子,而不能用Service来完成,反之亦然。
根据定义,这是不可能的。 IntentService
是Service
一个子类,用Java代码编写。 因此,通过包含IntentService
使用的相关代码位, IntentService
可以执行任何Service
。
用自己的线程启动一个服务就像启动一个IntentService一样。 不是吗?
IntentService
的三个主要function是:
-
后台线程
-
传递给
onStartCommand()
的Intent
的自动排队,所以如果一个Intent
被后台线程的onHandleIntent()
处理,其他命令排队等待轮到他们 -
一旦队列为空,则通过调用
stopSelf()
来自动closuresIntentService
任何和所有这些都可以通过Service
来实现,而不需要扩展IntentService
。
差异
- 服务类使用应用程序的
main
线程,而IntentService创buildworker
线程并使用该线程运行服务。 - IntentService创build一个队列,每次将一个意图传递给
onHandleIntent()
。 因此,应该通过直接扩展Service类来实现multithreading。 - 服务类需要使用
stopSelf()
手动停止。 同时,IntentService在队列中没有意图时自动停止,所有排队的意图都被处理。 - IntentService实现了返回null的
onBind()
。 这意味着IntentService不能被默认绑定。 - IntentService实现了将Intent发送到队列和onHandleIntent()的onStartCommand()。
服务
- 由startService()调用
- 从任何线程触发
- 在主线上运行
- 可能会阻塞主(UI)线程。 长时间使用服务内的线程
- 一旦任务完成,我们有责任通过调用stopSelf()或stopService()来停止服务。
IntentService
- 如果需要通信,则执行长任务,通常不与主线程通信,然后由Handler或广播完成
- 通过意向调用
- 从主线引发
- 在单独的线程上运行
- 无法并行运行任务,并且多个意图在同一个工作线程上排队。
添加点接受答案:
在Android API中查看IntentService的用法。 例如:
public class SimpleWakefulService extends IntentService { public SimpleWakefulService() { super("SimpleWakefulService"); } @Override protected void onHandleIntent(Intent intent) { ...}
要为您的应用程序创build一个IntentService组件,请定义一个扩展IntentService的类,并在其中定义一个覆盖onHandleIntent()的方法。
另请参阅IntentService的源代码,它是像onStartCommand这样的consutructor和生命周期方法。
@Override public int More ...onStartCommand(Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; }
一起服务一个AsyncTask是有效载荷不是很大的许多用例的最佳方法之一。 或者只是创build一个扩展IntentSerivce的类。 从Android 4.0版本开始,所有networking操作都应该在后台进程中,否则应用程序编译/生成失败。 从UI分离线程。 AsyncTask类提供了从UI线程中引发新任务的最简单方法之一。 有关此主题的更多讨论,请参阅博文
来自Android开发者指南 :
IntentService是一个服务的基类,用于处理asynchronous请求(表示为Intents)。 客户通过startService(Intent)调用发送请求; 该服务根据需要启动,使用工作线程处理每个Intent,并在工作不正常时自行停止。
IntentService中使用的devise模式
:这个“工作队列处理器”模式通常用于卸载应用程序主线程中的任务。 IntentService类的存在是为了简化这种模式,并照顾机制。 要使用它,扩展IntentService并实现onHandleIntent(Intent)。 IntentService将收到Intents,启动一个工作线程,并根据需要停止服务。
所有请求都在单个工作线程上处理 – 它们可能需要的时间(并且不会阻塞应用程序的主循环),但是一次只能处理一个请求。
IntentService类为在单个后台线程上运行操作提供了一个简单的结构。 这使它可以处理长时间运行的操作,而不会影响用户界面的响应。 而且,IntentService不会受到大多数用户界面生命周期事件的影响,因此它将继续在closuresAsyncTask的情况下运行。
IntentService有一些限制:
它不能直接与您的用户界面进行交互。 要将其结果放入UI中,您必须将它们发送到一个活动。 工作请求按顺序运行。 如果一个操作正在IntentService中运行,并且您发送了另一个请求,则该请求将一直等到第一个操作完成。 运行在IntentService上的操作不能被中断。 但是,在大多数情况下
IntentService是简单后台操作的首选方式
**
排球图书馆
有一个名为volley-library的库,用于开发androidnetworking应用程序。源代码在github中可用。
有关后台作业最佳实践的android官方文档:有助于更好地理解intent服务,线程,处理程序和服务。 并执行networking操作
我相信你可以通过简单地search诸如“Android IntentService vs Service”
每个示例的一个更重要的区别是IntentService一旦完成就自行结束。
一些例子(很快就可以完成)可能是;
IntentService:如果你想在打开你的应用程序的开始下载一堆图像。 这是一个一次性的过程,一旦下载完成,就可以自行清理。
服务:服务将不断用于您的应用程序和后端与Web API调用之间的通信。 即使它完成了它目前的任务,你仍然希望它在几分钟后,为更多的沟通。
IntentService
IntentService
在其自己的线程上运行。 完成后它将自行停止。 更像火和忘记。 随后的电话将排队。 很适合排队呼叫。 您也可以在IntentService
旋转多个线程(如果需要的话) – 您可以使用ThreadPoolExecutor
来实现此目的。 我这样说是因为很多人问我“为什么使用IntentService
因为它不支持并行执行”。 IntentService
只是一个线程。 你可以在里面做任何你需要的东西 – 甚至可以旋转多个线程。 唯一需要注意的是IntentService
只要旋转多个线程就完成了。 它不会等待那些线程回来。 你需要照顾这个。 所以我build议在这些场景中使用ThreadPoolExecutor
。
- 很适合同步,上传等
服务
默认Service
在主线程上运行。 你需要旋转一个工作线程来完成你的工作。 你需要明确地停止service
。 当你需要在后台运行的时候,即使当你离开你的应用程序,并回来更多的无头service
我用它的情况。
- 如果需要的话,你可以再次运行多个线程。
- 可以用于音乐播放器等应用程序。
如果需要,您可以随时使用BroadcastReceivers
回传给您的活动。
一个IntentService是一个服务的扩展,用来减轻需要在后台和分离的线程中执行的任务的执行。
IntentService启动,创build一个线程并在线程中运行它的任务。 一旦完成,它清理一切。 只有一个IntentService实例可以同时运行,几个调用被排队。
使用非常简单,很多用途都很方便,比如下载东西。 但它有限制,可以使你想使用,而不是更简单的服务。
例如,连接到xmpp服务器并由活动绑定的服务不能简单地使用IntentService完成。 你会最终忽略或重写IntentService的东西。
如果有人能告诉我一个你可以用
IntentService
完成的事情的IntentService
,不能用service
来完成,IntentService
。
IntentService
不能用于长时间监听,就像XMPP Listeners一样,它是一个单一的时间操作员,做这个工作并挥手告别。
另外它只有一个线程员,但有一个技巧,你可以使用它作为无限的。
主要区别:
-
服务类需要使用stopSelf()手动停止。 同时,IntentService在队列中没有意图时会自动停止。
-
IntentService通常可用于长时间任务,但如果需要执行较长时间的任务,则必须在Service中使用线程。
Service
和IntentService
之间的主要区别如下所述:
服务:
1.A Service
默认在应用程序的主线程上运行(这里没有默认的工作线程可用),所以用户需要创build一个单独的线程并在该线程中执行所需的工作。
2.一次允许多个请求(multithreading)
IntentService:
现在,来到意向服务,在这里一个默认的工作线程可用于执行任何操作。 请注意 – 您需要实现onHandleIntent()方法,该方法接收每个启动请求的意图,您可以在其中完成后台工作。
但是一次只允许一个请求。
不要重新发明轮子
IntentService扩展了Service类,这明显意味着IntentService是故意为了某个目的而创build的。
目的
IntentService的目的是使我们的工作更轻松地运行后台任务,而不用担心
-
创build工作线程
-
Queunig处理多个请求(Threading)
- 破坏服务
所以不行,Service可以完成一个IntentService会做的任务。 如果您的要求属于所提及的标准,那么您不必在Service类中编写这些逻辑。 不要重新发明轮子,因为IntentService是发明的轮子。
服务如何提供意向服务
一个正常的服务在UI线程上运行。 如果你必须做一些可能需要一段时间才能完成的工作,那么你必须创build一个线程。 在多个请求的情况下,你将不得不处理同步。 意向服务给予了一些默认的实现,为您完成这些任务。
根据开发者页面
-
意向服务创build一个工作线程
-
IntentService创build一个工作队列,
onHandleIntent()
发送请求到onHandleIntent()
方法 - 当没有工作,然后意向服务调用
stopSelf()
方法 - 为null的
onBind()
方法提供默认实现 - onStartCommand()的默认实现,它将Intent请求发送到WorkQueue并最终发送到
onHandleIntent()
- Android:如何获得RecyclerView的当前X偏移量?
- androidanimation没有在onAnimationEnd中完成
- 尽pipe类(ListFragment)实现LoaderManager.LoaderCallbacks <cursor>,但getLoaderManager()。initLoader()不接受“this”作为参数。
- 在onPause,onStop和onDestroy方法中调用超类方法的正确顺序是什么? 为什么?
- 如何在Android中自定义Toast
- Android图像视图捏缩放
- Android – 模拟后退button
- 我们为什么要在Android中使用字体大小的sp?
- 按名字上课