Android应用程序生命周期澄清

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

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

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

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

  • 在startActivityForResult返回之后,Android parentActivity不会被重新创build
  • android finish()方法不会从内存中清除应用程序
  • 如何find最新的活动在Android中打开当前活动?
  • 保留活动之间的片段状态
  • 如何在Android中创build始终顶级的全屏叠加活动
  • 一次关闭所有最近打开/运行的应用程序按钮 - android
  • 是否有一个超级简单的List / ListAdapter示例为android
  • 如何设置FLAG_ACTIVITY_CLEAR_TASK以避免startActivity上的黑屏?
  • 如果你正在寻找官方确认,那么最好只问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对象,单例等)