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

Android应用程序生成线程和服务之间的区别?,android,Android,我有一个Android应用程序,需要在后台和单独的线程上执行工作。在我的第一个概念证明中,我对应用程序类进行了子类化,并在onCreate()中生成了一个执行后台工作的线程。这真是太好了。然而,我刚刚意识到,在过去,我在这种情况下使用过服务 问题是,是否有理由对从服务派生的线程而不是Application.onCreate()派生的线程执行工作?服务应该执行独立于活动的“后台”工作(我知道,除非使用线程,否则它使用UI线程),并且可以在没有活动可见时运行。使用基于应用程序的线程似乎也能完成所有这

我有一个Android应用程序,需要在后台和单独的线程上执行工作。在我的第一个概念证明中,我对应用程序类进行了子类化,并在onCreate()中生成了一个执行后台工作的线程。这真是太好了。然而,我刚刚意识到,在过去,我在这种情况下使用过服务

问题是,是否有理由对从服务派生的线程而不是Application.onCreate()派生的线程执行工作?服务应该执行独立于活动的“后台”工作(我知道,除非使用线程,否则它使用UI线程),并且可以在没有活动可见时运行。使用基于应用程序的线程似乎也能完成所有这一切。通过不使用服务,它实际上消除了复杂性,因为活动只访问应用程序单例。据我所知,我没有必要绑定到该服务


我是否会遇到使用服务可以防止的生命周期困境?这是我对这种方法唯一关心的问题,但除此之外,我并不相信服务的好处。

区别在于,如果您希望线程仅在
活动运行时在后台运行,或者希望它在用户离开时继续运行

即使
活动
不再可用,服务也能够在后台运行。当你的应用程序在不久的将来应该在没有任何用户参与的情况下继续工作时,可以使用它们。如果在
服务
中运行
线程
,即使用户离开应用程序,该线程也将继续运行。这有时是有益的,因为用户可能希望您继续下载一个非常大的文件,但不希望应用程序继续在前台运行。然后,几小时(天、月、年)后,用户可以重新进入应用程序读取文件

但是,如果您使用的线程需要根据结果不断更新UI,那么在活动中启动它可能会更有益,因为它没有在服务中运行的真正目的。如果你的线程在活动中而不是在服务中,那么在你的程序中,它可能更容易与UI对话。(由于Android不必再处理其列表上的另一项服务,因此可能会有一些性能优势,但这纯粹是我的猜测。我没有证据证明这一点。)


注意:即使活动退出,在活动中创建的线程仍将继续运行。然而,这仅仅是因为应用程序仍在内存中。当活动不再在视图中时,从内存中删除活动及其线程的优先级高于从服务线程中删除活动的优先级。

如果您的应用程序既不在前台,也不可见,则它更有可能被系统终止。如果您将代码作为服务运行,而不是后台进程生成的线程,那么您的任务将持续更长的时间。没有保证,因此您仍然需要正确管理流程生命周期,但作为服务运行可能会提供更可靠的结果


请参见

对,我知道活动生命周期。问题是,如果不使用服务而只运行线程,我会损失什么?我在应用程序中生成线程,而不是活动(正如您所指出的,它与线程的生命周期无关)。我知道服务不太可能被系统杀死,但即使我的活动被破坏,也不能保证应用程序会被破坏。应用程序可以不带任何活动存在。哦,等等,我明白了。在这种情况下,如果需要共享线程,我认为您将失去从多个应用程序绑定到服务的能力。此外,我认为如果应用程序上没有运行任何服务,整个应用程序仍然会被删除,因此,一旦用户离开堆栈上的最后一个应用程序,线程就会被删除,就像它在第一个活动中生成一样。因此,如果我不关心应用程序在所有活动都隐藏后是否仍然存在,我现在做的应该很好吧?呃,是的!如果你真的不在乎你的代码是否运行,你可以从一个活动线程中产生它,它将是第一个被终止的任务。但是,如果您希望您的线程尽可能长时间地存在,您应该从服务线程中生成它。请参见以下内容: