【问题标题】:Difference between Android application spawning thread vs. Service?Android应用程序生成线程与服务之间的区别?
【发布时间】:2011-10-28 21:33:46
【问题描述】:

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

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

我会被使用 Service 会阻止的生命周期极端情况所困扰吗?这是我对这种方法的唯一顾虑,但除此之外,我不会因服务的好处而被推销。

【问题讨论】:

标签: android


【解决方案1】:

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

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

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

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

【讨论】:

  • 对,我知道 Activity 生命周期。问题是,不使用服务而只运行线程本身会失去什么?我在应用程序中生成线程,而不是在活动中(正如您所指出的,这对线程的生命周期并不重要)。我知道服务不太可能被系统杀死,但即使我的活动被破坏,也不能保证应用程序会被破坏。应用程序可以在没有活动的情况下存在。
  • 哦等等我明白了。在这种情况下,如果您需要共享线程,我认为您将失去从多个应用程序绑定到服务的能力。另外,我认为如果没有在其上运行的服务,应用程序作为一个整体仍然会被删除,因此一旦用户离开堆栈中的最后一个应用程序,线程就会被删除,就像它被生成时一样在第一个 Activity 中。
【解决方案2】:

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

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

【讨论】:

  • 所以如果我不在乎应用程序是否在所有活动都被隐藏时仍然存在,我在做什么应该没问题?
  • 错误,是的!如果您真的不介意您的代码是否运行,您可以从活动线程中生成它,这将是第一个被终止的任务。但是,如果您希望您的线程尽可能长时间地存在,您应该从服务线程中生成它。
猜你喜欢
  • 2018-09-12
  • 2012-05-23
  • 2013-02-03
  • 2022-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 2015-05-08
  • 2011-02-07
相关资源
最近更新 更多