在Android中,Service和Thread的区别是什么?

7

我只需要知道当我可以使用独立线程执行某些操作时,为什么需要Service。 Service 能做什么,而 Thread 不能做什么? 我阅读了很多帖子,但没有找到令人满意的答案。

3个回答

49

服务:是Android的一个组件,可以在后台执行长时间运行的操作,大多数情况下没有用户界面。

线程:是操作系统级别的功能,允许您在后台执行某些操作。

虽然从概念上看两者相似,但有一些重要的区别。

1.服务 - 如果由于低内存情况而被Android在中间销毁正在执行其任务,则Android会确保重新启动您的服务,如果您已从onStartCommand()返回START_STICKY或START_REDELIVER_INTENT。

2.线程 - 如果由于低内存原因在中间被Android销毁,则Android不会保证再次启动它。这意味着用户失去了他的一半工作。

3.服务 - 是Android的一个组件,因此在销毁应用程序时由于低内存需要考虑优先级级别。

4.线程 - 不是Android的一个组件,因此在杀死应用程序时Android不会考虑线程优先级。

我将尝试解释第三个要点。

假设您需要从活动连接到互联网。您可以使用带有线程的服务或直接在活动中创建线程来完成此操作。考虑第二种情况,您在线程中连接到互联网。然后

i. 如果用户关闭活动,而线程仍在后台运行,那么该线程是否会继续在后台运行?答案是您无法真正预测。

ii. 假设在上述场景的延续中,即使在杀死活动之后,您的线程仍然继续执行其预期操作。然后在您的手机上发生了低内存情况。那么这个应用程序将是第一个易受攻击的应用程序,因为此应用程序没有优先级。

因此结论是:如果您想要进行一些重型后台功能,则最好使用带线程的服务。如果您觉得该后台功能只要活动处于活动状态就应保持活动状态,则可以选择带线程或带异步任务的活动。

希望对您有所帮助。


13

Service的主要好处是可以访问具有独立生命周期的Context对象。这允许许多活动和在公共或公开服务的情况下,许多应用程序重复使用通用代码。

线程是一种在不阻止其他工作的情况下完成工作的机制。

服务并不意味着线程,线程也不意味着服务。它们是两个非常不同的东西。我倾向于在需要上下文执行工作但希望代码与我的活动隔离以提高可重用性的情况下使用服务。


好的。如果我将上下文传递到工作线程中,那么它是否能够达到目的? - SAMD
你没有解释案例或目的,所以很难告诉你。 - Nick Campion
实际上,我正在寻找一些特殊情况,其中服务是必须使用的。有人问了我这个问题,我无法回答,所以我正在尝试使用Stack Overflow寻求帮助。 - SAMD
1
服务对许多事情都很方便。我制作的一些服务示例是DownloadService和RadioPlaybackService。服务的主要价值在于它具有独立的生命周期,不附加在正在显示的Activity上。如果仅使用线程,您很快就会遇到障碍,因为操作(如方向更改)将导致与Activity相关联的线程被销毁。您可以通过托管在Application对象中的Executors或AsyncTasks来规避此问题。服务的价值在于其生命周期,并且能够让多个活动访问相同的操作。 - Nick Campion

3
请访问此链接:Service和Thread的区别 简单来说,Service和Thread的主要区别是,Service运行在主(UI)线程上,而Thread运行在自己的线程上。如果我们使用Service进行长时间任务,则可能会阻塞主UI线程。更多详细信息请访问给定的链接。

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