Android应用程序产生线程与服务之间的区别?

时间:2011-10-28 21:33:47

标签: android

我有一个Android应用程序需要在后台和单独的线程上执行工作。对于我的第一个概念验证,我将Application类子类化,并在onCreate()中生成一个执行后台工作的Thread。这很有用。但是,我刚才意识到,过去我曾在这种情况下使用过服务。

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

使用服务会阻止生命周期的案例吗?这是我对这种方法的唯一关注,但除此之外,我并没有以服务的好处出售。

2 个答案:

答案 0 :(得分:11)

不同之处在于,如果您希望线程仅在Activity正在运行时在后台运行,或者您希望它在用户离开时继续运行。

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

但是,如果您使用的线程需要根据结果不断更新UI,那么在Activity中启动它可能更有利,因为它没有真正的目的在服务中运行。在你的程序中,如果它在Activity而不是Service中,你可以更容易地与UI交谈。 (可能会有一些性能上的好处,因为Android不需要在其列表上处理另一个服务,但这纯粹是我的猜测。我没有证据。)

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

答案 1 :(得分:4)

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

请参阅http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html