安卓应用生命周期澄清

15

有人能否确认以下与 Android 应用程序生命周期相关的内容吗?

1)当应用程序处于前台时,内存将包含 Application 对象的实例,所有活动的实例(未被销毁),以及从任一根引用的所有对象引用(尚未被垃圾回收)。

2)当应用程序转到后台时,Android Framework 可以在某个时刻: a)杀死赋予应用程序目的的整个进程,这将从内存中清除所有对象 b)仅杀死活动(通过完成它们并本质上也包括任何片段),保存它们的状态并创建活动堆栈,并留下其他任何东西(Application 对象、任何其他静态对象、从任何根可达的引用)。

我最感兴趣的是 2b,但我会感激对所有这些观点的确认,因为我正在试图从头到尾理解整个概念。


如果你在询问2a和2b中的语句是否正确,它们大多数是正确的。对于2b,操作系统只能调用适当的生命周期方法并将其引用置空以释放所需的Activity,并让垃圾回收器完成其工作。但是,如果进程的其他部分(即用户程序)仍然持有这些对象的引用,则不会进行垃圾回收,进程可能会被终止以释放所需的内存。 - Kai
感谢您的回复。您是在官方渠道阅读到的还是基于个人开发经验? - Lucas
这就是Java的工作原理,Activites只是标准的Java对象,而虚拟机在对象仍在使用时不会释放它。这就是为什么Drawables不应该被缓存(它具有对所有者上下文/Activity的引用),以及为什么有一个lint检查来确保Handler子类是静态类(以防止过于容易的Activity泄漏)。 - Kai
2
请查看此链接:http://developer.android.com/training/basics/activity-lifecycle/index.html - Krunal Patel
6个回答

4
当应用程序处于前台时,内存中将包含Application对象的实例、所有活动的实例(未被杀死)以及从根之一引用的所有对象引用(尚未进行垃圾回收)。
> There will only ever be a few such processes in the system, and these
> will only be killed as a last resort if memory is so low that not even
> these processes can continue to run. Generally, at this point, the
> device has reached a memory paging state, so this action is required
> in order to keep the user interface responsive.

2) 当应用程序进入后台时,Android框架会在某些时候执行以下操作:

a) 终止用于应用程序目的的整个进程,这将从内存中完全擦除所有对象。

> These processes have no direct impact on the user experience. Provided
> they implement their Activity life-cycle correctly (see Activity for
> more details), the system can kill such processes at any time to
> reclaim memory for one of the three previous processes types. Usually
> there are many of these processes running, so they are kept in an LRU
> list to ensure the process that was most recently seen by the user is
> the last to be killed when running low on memory.

b) 仅结束活动(实质上不会删除任何其他对象引用),保存它们的状态,创建活动堆栈并离开其他所有内容(应用程序对象、任何其他静态对象、可从任何根可达的引用)。

部分地解释如2.a.所述

> Usually there are many of these processes running, so they are kept in an LRU
> list to ensure the process that was most recently seen by the user is
> the last to be killed when running low on memory.

Source - developer.android.com


4

如果您正在寻找官方确认,则最好只向Google提问:)

但是,阅读此内容后,您将更好地了解这些概念。

Android内存管理

Android进程生命周期

第一个问题的答案:使用DDMS进行确认。

第二个问题的答案:

2a问题的答案:是的,操作系统可以在需要为其他进程腾出内存时随时终止进程,这将导致所有与该进程相关的对象都被终止。

2b问题的答案:

来自官方文档

进程生命周期3. 后台活动(不可见并已暂停的活动)不再关键,因此系统可以安全地杀死其进程,以回收其他前台或可见进程的内存。如果其进程需要被终止,则当用户返回到该活动(再次在屏幕上可见)时,将调用其onCreate(Bundle)方法,并使用它先前在onSaveInstanceState(Bundle)中提供的savedInstanceState重新启动自己,以便它可以以用户上次离开的状态重新启动。


谢谢提供链接!这是一个很好的概述,但问题是它并没有真正回答我的问题2b,因为我的问题只问关于活动本身(而不是整个过程)。顺便说一句,感谢您对其他问题的回答。 - Lucas
尽管我没有得到关于我的2b问题的确切答案(事实上,正如Dianne Hackborn所解释的那样,系统不会有选择性地杀死活动,而只会全部或全部不杀死它们),也没有其他人给出答案,但是我必须公平,因为你的回答对我最有帮助,所以赏金归你。谢谢。 - Lucas

4

关于2b)的问题,你说得大多数正确。

如果一个活动被暂停或停止,系统可以通过要求其完成或仅仅杀死其进程来将该活动从内存中删除。

然而,在以下情况下不会调用onSaveInstantSate:

请注意,在onPause()中保存持久数据比在onSaveInstanceState(Bundle)中保存重要,因为后者不是生命周期回调的一部分,所以不会像其文档中描述的那样在每种情况下都被调用。

Android文档来源

您可以通过启用以下开发人员选项,请求Android始终销毁后台活动。如果您正在调试应用程序,则应能够逐步执行生命周期方法并查看发生了什么。

设置 -> 开发人员选项 -> 应用程序 -> 不保留活动


4

没有一种典型的应用程序生命周期存在。应用程序对象会一直存活在内存中,直到被Android本身或用户手动杀死。

针对上述问题,以下是您的答案:

1)这是真的。

2)a)那也是真的。 2)b)当应用程序进入后台时,只能保存当前处于前台的活动的数据。此外,当您杀死应用程序本身(通过从最近列表中删除它)时,所有应用堆栈中的活动及其保存的数据(非持久数据)都将被杀死,因为应用程序是所有活动的基础。


0

好的,在最近几周的搜索过程中,我能够获得更多信息,现在我可以回答自己的问题(希望也能为其他人解答):

1)正确

2a)正确

2b)错误。如果Android框架需要内存,或者由于其他原因必须“杀死/减少”应用程序,它只能通过杀死专门为该应用程序分配的整个进程来实现。Android框架既不能杀死选定的活动,也不能杀死所有活动,但保留所有其他对象(如应用程序对象、单例等)。


0

嗯,这个问题取决于Android操作系统的运行方式。Android设备是一个嵌入式系统,但几乎与个人电脑相同,当我说Android作为一个操作系统时,它肯定具备所有操作系统的功能。你所指的是Android操作系统的内存管理和调度特性。

  1. 视图(无论是XML生成还是Java代码生成,它们都是动态生成的)。
  2. Android操作系统将所有应用程序作为进程在Dalvik虚拟机上运行。
  3. 在创建之前,所有的活动都是空的,当它们被创建后,它们的实例就会生成。再次打开它们时,它们的保存实例会再次显示(单例设计模式的概念)。

所以让我告诉你,我不认为这两个选项都是正确的。我相信以下几点: 1. 视图始终是动态生成的。 2. 实例将保存在内存中。 3. 在应用程序后台运行时,整个进程及其可用实例将保留在内存中。


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