IntentService和Service有什么区别?

143

你能帮我理解 IntentServiceService 之间的区别吗?


2
http://techtej.blogspot.com.es/2011/03/android-thread-constructspart-4.html - Pratik Butani
6
非常好的比较:https://dev59.com/bmUp5IYBdhLWcg3wGEgR - Moemars
1
请访问上述链接,它们真的太好了。非常感谢它们。 - Renjith K N
1
一个较早的问题如何成为一个较新问题的重复? - Ojonugwa Jude Ochalifu
8个回答

131

Service是服务实现的一个基类。Service运行在应用程序的主线程上,这可能会降低应用程序的性能。因此,直接继承自ServiceIntentService可用于简化事情。

IntentService用于在后台执行某个任务。一旦完成,IntentService实例会自动终止。它的使用示例包括从Internet下载某些资源。

区别

  1. Service类使用应用程序的主线程,而IntentService创建一个工作线程并使用该线程运行服务。
  2. IntentService创建一个队列,每次将一个intent传递给onHandleIntent()。因此,通过直接扩展Service类来实现多线程。
  3. IntentService实现了返回nullonBind()。这意味着默认情况下无法绑定IntentService
  4. IntentService实现了发送Intent到队列和到onHandleIntent()onStartCommand()

简而言之,使用IntentService只需要做两件事。首先,实现构造函数。其次,实现onHandleIntent()。对于其他回调方法,需要调用super以便能够正确跟踪。


很好的解释。我正在制作音乐应用程序。那么,对于它来说哪一个更好?Service还是IntentService? - Shreyash Mahajan
11
对于音乐应用程序,我认为你需要使用 Service,因为默认情况下,IntentService 无法绑定,而且我认为你需要将你的音乐应用程序与音乐服务进行绑定才能启动和停止。正如先前所说,IntentService 更适合“启动并忘记”的场景。 - Premier
@Premier 你觉得IntentService和Service.START_NOT_STICKY有相似之处吗?因为根据你的例子,它们都是“启动并忘记”的。 - IgorGanapolsky
我有一个应用程序,可以通过服务在一段时间后同步数据,那么我应该使用Service还是Intent Service? - M.Raheel
@Jashan PJ 你能解释一下为什么IntentService不能从任何组件绑定吗? - Kushal
显示剩余2条评论

125
简而言之,Service 是开发者设置后台操作的更广泛实现,而 IntentService 适用于“点火并忘记”操作,负责处理后台线程的创建和清理。
从文档中可以看出:
Service Service 是一个应用程序组件,代表应用程序希望执行长时间运行操作但不与用户交互或为其他应用程序提供功能。
IntentService Service 是 IntentService 的基类,用于处理异步请求(表示为意图)。客户端通过 startService(Intent) 调用发送请求;服务根据需要启动,使用工作线程依次处理每个 Intent,当它没有任务时停止自身。
请参阅此文档 - http://developer.android.com/reference/android/app/IntentService.html

9
IntentService不是Service的基类,相反的情况才是正确的。请查看 - http://developer.android.com/reference/android/app/IntentService.html - Darpan
6
它是“处理异步请求的服务”的基类,而不仅仅是“服务”基类。这就是为什么上面的句子是正确的原因。 - afrish
大家好,我能在Service中编写IntentService吗?如果可以的话,能否请任何人提供一个示例/代码片段。谢谢 - Kaveesh Kanwal
2
@Phix 我正在制作一个应用程序,需要每半小时扫描本地数据库,使用IntentService还是Service更好? - Sagar Devanga

71

服务: 它在您的系统后台运行。例如,

  1. 如果你去酒店并向服务员点一份汤
  2. 服务员接受你的订单并发送给厨师
  3. 你不知道汤是如何在厨房里制作的以及制作汤需要哪些过程
  4. 当你的订单准备好后,服务员会把汤送到你面前。

后台进程: 厨师制作汤

IntentService:它是一个连续的服务...(即)当你同时向服务员订购多个食品项目时,服务员会逐个交付这些项目,而不是一次性交付它们。


8
我喜欢你解释事物的方式。 - Mansour Fahad
4
抱歉,但是这两者之间存在着重要的差别,需进行补充说明。 - eRaisedToX
“连续服务”是什么意思? - Ojonugwa Jude Ochalifu
3
这个解释是错误的。服务(service)不在后台运行,而是在前台运行。 - krtkush
解释很出色。 - Nikhil

61

请查看Tejas Lagvankar有关此主题的文章。 以下是Service、IntentService和其他组件之间的一些关键区别。

输入图像描述


1
漂亮的表格信息 - SIVAKUMAR.J

18

服务(Service)

  • 没有UI的任务,但不应用于长时间任务。对于长时间任务,请在服务内使用线程。
  • 通过onStartService()调用
  • 可以从任何线程触发
  • 在主线程上运行
  • 可能会阻塞main(UI)线程

意图服务(IntentService)

  • 通常是长时间任务,如果需要与主线程通信,则通过Handler或广播完成。
  • 通过意图(Intent)调用
  • 从主线程触发(意图在主线程上接收并生成工作线程
  • 在单独的线程上运行
  • 我们不能并行运行任务,并且多个意图排队在同一个工作线程上。

17

Service实际上在你的应用程序相同的线程上运行;当你扩展Service时,你必须手动生成新线程来运行CPU阻塞操作。

IntentServiceService的子类,它会生成一个线程来从那里执行后台工作(无需创建新线程来执行CPU阻塞操作)。


这不是为了防止CPU阻塞操作而不是运行它们吗?虽然我不确定。 - committedandroider
这是真的,服务需要一个新线程来运行CPU阻塞操作。 - raditya gumay

4

Service: 运行于主线程,因此在几秒钟后会导致ANR(Android Not Responding)。

IntentService: 具有另一个后台线程工作的Service,可独立执行某些操作而不与主线程交互。


2
服务:在主线程中运行,因此几秒钟后会导致ANR(Android未响应)。- 我可以让服务运行数小时,从未见过ANR,因此我怀疑这是不正确的。 - Tim

2

IntentService是Service的子类。

如果你想在打开应用程序时下载一堆图片,那么可以使用IntentService。这是一个一次性的过程,一旦所有内容都被下载完成,它就会自动清理自己。

Service是一个服务,用于通过Web API调用在你的应用程序和后端之间进行持续通信。即使它完成了当前的任务,你仍希望它在几分钟后继续存在,以进行更多的通信。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接