【问题标题】:Android application lifecycle clarificationAndroid应用生命周期说明
【发布时间】:2016-02-18 12:06:56
【问题描述】:

有人可以确认以下关于 android 应用程序生命周期的信息吗?

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

2) 当应用程序进入后台时,Android 框架在某些时候可以: a)终止应用程序目的的整个过程,这将从本质上清除内存中的所有对象 b)仅杀死(因此基本上不会删除其他对象引用)活动(通过完成它们以及实质上任何片段)保存它们的状态并创建活动堆栈并留下任何其他东西(应用程序对象,任何其他静态对象,可以从任何根访问的引用)。

我对 2b 最感兴趣,但我会确认所有这些要点,因为我试图从头到尾掌握整个概念。

【问题讨论】:

  • 如果您要询问 2a 和 2b 中的陈述是否正确,它们大多是正确的。对于 2b,操作系统只能调用适当的生命周期方法并将其对要释放的活动的引用设为空,并让垃圾收集器完成它的工作。但是,如果进程的其他部分(即用户程序)仍然持有对这些对象的引用,则不会进行 GC,进程可能会被终止以释放所需的内存。
  • 感谢您的意见。您是在官方频道的某个地方读到的,还是基于您个人的开发经验?
  • 这就是 Java 的工作原理,Activites 只是标准的 Java 对象,并且虚拟机在对象仍在使用时不会释放它。这就是为什么 Drawables 不应该被缓存(它引用了所有者上下文/Activity),以及为什么有一个 lint 检查以确保 Handler 子类是一个静态类(以防止太容易的 Activity 泄漏)

标签: android android-activity


【解决方案1】:

好的,在最近几周的搜索任务中,我获得了更多信息,现在我可以回答我自己(也希望是其他人)的问题:

1) 正确

2a) 正确

2b) 错误。 android框架,如果需要内存或者由于其他原因它必须“杀死/减少”应用程序,它只能通过杀死专用于该应用程序的整个进程来做到这一点。 android 框架可以更接近地杀死选定的活动或杀死所有活动但让所有其他对象保持活动状态(如应用程序对象、单例等)

【讨论】:

    【解决方案2】:

    1) 当应用程序处于前台时,内存将包含实例 Application 对象的所有活动的实例(未终止) 以及从其中一个引用的所有对象引用 root 的(尚未被垃圾收集)

    > 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

    【讨论】:

      【解决方案3】:

      这件事取决于 Android 操作系统的运行方式。 Android 设备是一个嵌入式系统,但工作方式几乎与 PC 相同,当我说 Android 作为一个操作系统时,它肯定具有操作系统的所有功能。您所指的是 Android 操作系统的内存管理和调度功能。 MMU(内存管理单元)在逻辑上优先考虑当前正在执行的任务,即您的启动器或您正在处理的任何其他应用程序。我想回答的两件事可以帮助你更多:

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

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

      【讨论】:

        【解决方案4】:

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

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

        1) 这是真的。

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

        【讨论】:

          【解决方案5】:

          是的,您对 2b) 的看法基本正确。

          如果某个活动被暂停或停止,系统可以删除该活动 通过要求它完成或简单地杀死它来从内存中 过程。

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

          请注意,在 onPause() 中保存持久数据很重要 onSaveInstanceState(Bundle) 因为后者不是 生命周期回调,因此不会在每种情况下都被调用为 在其文档中描述。

          Android Docs Source

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

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

          【讨论】:

            【解决方案6】:

            如果您正在寻找官方确认,那么最好只询问 Google :)。

            但我觉得读完这篇文章你会更好地理解这些概念。

            Android memory management

            android process lifecycle

            第一个问题的答案: 是的,使用 DDMS 确认。

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

            2b 题的答案g:

            来自官方文档

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

            【讨论】:

            • 感谢您的链接!这是一个很好的概述,但问题是它并没有真正回答 2b,因为我的问题是单独询问活动(而不是整个过程)。附言。感谢您对其他观点的分析。
            • 虽然我没有得到我的 2b 问题的确切答案(问题是系统不会像 Dianne Hackborn 所解释的那样有选择地杀死活动,但只会杀死所有活动或不杀掉它们),更接近任何人否则,我必须是公平的,所以因为你的回答对我最有帮助,所以赏金给你。谢谢。
            猜你喜欢
            • 1970-01-01
            • 2011-07-29
            • 2014-12-29
            • 1970-01-01
            • 2015-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-05
            相关资源
            最近更新 更多