【问题标题】:SEPARATE THREAD VS SERVICE + SEPARATE THREAD单独的线程 VS 服务 + 单独的线程
【发布时间】:2012-12-07 15:36:03
【问题描述】:

刚刚看到 Google I/O 2010 - Android REST 客户端应用程序,其中说: 从服务开始长期运行的操作 据我了解(我的英语很差) 这样做的主要目的是防止应用程序被系统杀死。正确的? 执行所有长时间运行的操作而不仅仅是来自服务的 Web 操作是一种好习惯吗?

据我了解,如果我在活动中创建一个对象,然后应用程序进程将被终止,我将丢失此对象,但如果我在服务中创建此对象并且在进程将被终止后 - 我的对象仍然是活动的。正确的?

(单独的线程)VS(服务+单独的线程)

我的问题有什么不同?

【问题讨论】:

  • 没有人对这个主题感兴趣?

标签: android service android-service


【解决方案1】:

不完全是……

您以某种方式混合了 DestroyedKilled 的概念

销毁 这是您的应用程序应该准备好处理的事情。由于可能不同的原因(即设备方向更改等),操作系统可能会破坏您的活动(通常事先调用onDestroy(),因此您有机会保存重要的内容)并且您的活动中的所有对象都将丢失。但是,您的应用程序可能包含一个以上的活动和/或服务,并且有一个活动被销毁,并不意味着其他活动也会被销毁。

被杀 操作系统可能会出于某种原因决定终止您的应用程序。这是通过终止应用程序使用的进程来完成的,该进程是运行构成应用程序的所有活动和服务的进程。您的应用程序不会有任何警告,也无法阻止这种情况发生。您应用程序中的所有对象(由活动和服务使用)都将丢失。

话虽如此,Service 在长期活动中的优势是什么?

让我们用一个简单的例子:

如果您的 Activity 正在将大文件上传到服务器,并且用户决定更改设备方向,则该 Activity 将被销毁并中断上传。即使Activity重启后重新开始上传,也会从头再来。

如果您有服务根据 Activity 的请求执行上传内容,即使您的 Activity 被破坏,该服务仍然处于活动状态,并且上传继续而不会中断。

注意事项: 如果您有一个运行时间很长的服务(将运行半小时以上),请将其设置为 foregroung 服务,否则无论如何它都会被杀死。

【讨论】:

  • 如果一个活动被销毁,单独的线程会被杀死吗?不,我想。所以我的主要问题仍然没有得到答案。
  • 单独的线程与服务 + 单独的线程
  • 如果您在 Activity 中创建线程,则应在 Activity 完成时终止 Thread,或者您需要使用 onRetainNonConfigurationInstance() 才能将其重新连接到新的 Activity(如果要进行的话)被创建。否则,您将拥有一个无法再控制或与之通信的 orfan 线程。
  • 但我的主要问题仍然是“单独的线程 VS 服务 + 单独的线程”在 Android 开发的背景下有什么区别。 Luis,感谢您的反馈,但我仍然想了解从 Service 执行长时间运行操作的主要目的。
【解决方案2】:

1. Android 中的 Service API 是应用程序在后台工作的关键机制之一。

但它可以使用简单的线程轻松实现。

但是: *一旦应用程序不再对用户可见,它通常被认为是可消耗的,并且如果它需要其他地方的内存,它就会被系统杀死。应用程序解决此问题的主要方法是启动一个服务组件,该组件明确告诉系统他们正在做一些有价值的工作,并且希望系统在不需要时不要杀死他们的进程。*

据我了解,对于我们的案例来说,这是常规线程和服务之间的区别。

【讨论】: