Android应用程序生成线程和服务之间的区别是什么?

10

我有一个Android应用程序,需要在后台和一个单独的线程中执行工作。为了进行首次概念验证,我继承了Application类,在onCreate()方法内部创建了一个Thread来执行后台工作,这个方式非常有效。然而,我刚意识到,在过去我曾经使用Service来处理这样的情况。

问题是,在一个从Application.onCreate()生成的线程中执行工作,是否比在一个从Service生成的线程中执行工作更好?Service被设计用来执行"后台"工作(它使用UI线程除非使用了另外的线程),并且独立于Activity运行,即使没有Activity可见也可以运行。使用基于Application的线程似乎同样可以实现这一点。不使用服务可以减少复杂性,因为Activity只需访问Application singleton。据我所知,我不需要绑定到Service。

我会因为使用Service会防止生命周期的角落案例而被影响吗?这是我对这种方法唯一的关注点,但除此之外,我并不认为Service有什么好处。


1
请参考:https://dev59.com/A3E85IYBdhLWcg3wvGOm - AlikElzin-kilaka
2个回答

11

如果你想要当Activity在后台运行时,仅仅让线程在后台运行,或者你希望线程继续运行,直到用户离开应用,那么它们之间的区别就在这里。

服务可以在Activity不可用时继续在后台运行。 它们旨在在近期内继续工作而无需任何用户参与。 如果在服务中运行线程,则即使用户离开应用程序,线程也将继续运行。 有时这是有益的,因为用户可能希望您继续下载一个非常大的文件,但又不想让应用程序继续在前台运行。 然后,几个小时(天、月、年)后,用户可以重新进入应用程序来读取该文件。

但是,如果您正在使用需要根据结果不断更新UI的线程,则在Activity中启动它可能更有益,因为它没有真正的必要在服务中运行。 如果线程在Activity中而不是服务中,则线程更容易与UI进行通信。 (我的推测是Android不必处理另一个服务列表,这可能会带来一些性能优势,但我没有证据。)

注意:在Activity中创建的线程仍将继续运行,即使Activity退出。 然而,这只是因为应用程序仍然在内存中。 在Activity不再可见时,Activity及其线程比服务线程具有更高的优先级被从内存中删除。


1
我知道Activity的生命周期。问题是,如果不使用Service而只是单独运行线程,我会失去什么?我在Application中生成线程,而不是Activity(并不影响线程的生命周期,正如您所指出的那样)。我知道服务不太可能被系统杀死,但即使我的Activity被销毁,也不能保证应用程序会被销毁。一个应用程序可以存在没有任何活动。 - Mark Herscher
哦,我明白了。在这种情况下,如果您需要共享的线程,则会失去从多个应用程序绑定到服务的能力。此外,我认为如果没有服务在运行,则整个应用程序仍然可能被删除,因此一旦用户离开堆栈中的最后一个应用程序,该线程就像在第一个活动中生成它一样可能被删除。 - DeeV

4
如果你的应用程序不在前台或者不可见,那么它更有可能被系统杀掉。如果你将你的代码作为服务运行,而不是由后台进程产生的线程,则你的任务将存活更长时间。不能保证,因此仍需要正确管理进程生命周期,但作为服务运行可能会给出更可靠的结果。
请参见http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html

那么,如果我不在意应用程序在所有活动都隐藏时是否能够继续运行,那么我的做法就可以了吗? - Mark Herscher
如果你并不在意你的代码是否运行,那么你可以从活动线程中生成它,这样它将是被终止的第一个任务。但是,如果你希望线程尽可能长时间地存在,你应该从服务线程中生成它。 - Teasel

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