Android应用程序生命周期澄清

任何人都可以确认以下关于android应用程序生命周期?

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

2)当应用程序进入后台时,在某种程度上,Android框架可以:a)杀死为应用程序的目的而设置的全部进程,这将彻底清除内存中的所有对象b)仅仅杀死(所以必须不要其他对象引用将被删除)(通过完成它们,本质上还有任何片段)来保存它们的状态并创buildActivities Stack并保留其他任何内容(Application对象,任何其他静态对象,可从任何根访问的引用)。

我主要是对2b感兴趣,但是我会在所有这些点上进行确认,因为我试图从头到尾把握整个概念。

Solutions Collecting From Web of "Android应用程序生命周期澄清"

如果你正在寻找官方确认,那么最好只问Google。

但是我觉得在阅读之后你会对这些概念有更好的理解。

Android内存pipe理

android进程生命周期

第一个问题的答案是肯定使用DDMS。

回答为2a的问题:是的,OS可以杀死进程中的任何时间点,当其他进程需要的内存将导致杀死所有与进程相关的对象。

答案为2b问题:

从官方文件

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

是的,你大多是正确的关于2b)。

如果某个活动暂停或停止,则系统可以通过要求完成或仅干脆停止活动。

但是有些情况下,onSaveInstantSate没有被调用:

请注意,将持久数据保存在onPause()而不是onSaveInstanceState(Bundle)中是非常重要的,因为后者不是生命周期callback的一部分,所以不会在文档中描述的每种情况下调用。

Android文档来源

您可以通过启用以下开发人员选项来请求android始终销毁后台上的活动。 如果你正在debugging你的应用程序,你应该能够遍历生命周期方法,看看发生了什么。

设置 – >开发者选项 – >应用程序 – >不要保留活动

应用程序不存在典型的生命周期。 应用程序对象驻留在内存中,直到它不被Android本身或用户手动中止。

对于以上几点,这里是你的答案:

1)这是真的。

2)a)也是如此。 2)b)应用程序进入后台时,只能保存前台当前活动的数据。 另外,当你自己杀掉应用程序(通过从最近列表中删除它)时,应用程序堆栈中的所有活动以及它们保存的数据(不是持久数据)都被杀死,因为应用程序是所有活动的基础。

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

> 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 Framework可以:

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)仅杀死所有活动(通过完成它们,实质上还有任何碎片),保存它们的状态并创build活动堆栈,并留下其他任何东西(应用程序对象,任何其他静态对象,可以从任何根访问的引用)。

部分与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. 

来源 – developer.android.com

那么这个东西取决于Android操作系统的运行方式。 Android设备是一个embedded式系统,但function与PC几乎一样,当我将Android作为一个操作系统时,它将定义为一个操作系统的所有function。 您指向的是Android OS的内存pipe理和调度function。 MMU(内存pipe理单元)在逻辑上优先考虑当前正在执行的任务,即你的启动程序或任何你正在工作的其他应用程序。 我想回答的两件事可以帮助你多一点:

  1. 视图(无论是生成xml还是生成Javacode,它们都是dynamic生成的)。
  2. Android操作系统将所有应用程序作为Dalvik虚拟机上的subprocess(活动)进行处理。
  3. 所有活动在创build之前都是空的,创build它们的实例时就会生成它们。 当他们再次打开他们的保存的实例再次被查看(单一devise模式的概念)。

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

好的,在我最近几周的search任务中,我得到了更多的信息,现在我可以回答自己的问题了(希望对其他人)

1)正确

2a)正确

2b)错误。 android框架,如果需要内存,或者由于其他原因必须“杀死/减less”应用程序,只能通过杀死专用于该应用程序的整个进程来实现。 android框架可以更加杀死select的活动,或者杀死所有活动,但是保留所有其他活动(像Application对象,单例等)