任何人都可以确认以下有关Android应用程序生命周期的内容吗?
1)当应用程序在前台时,内存将包含Application对象的实例,所有活动的实例(未被杀死)以及从其中一个根引用的所有对象引用(尚未被垃圾回收)< / p>
2)当应用程序进入后台时,Android Framework可以在某些时候: a)杀死给予应用程序目的的整个过程,这将完全删除内存中的所有对象 b)只杀死(所以很难删除其他对象引用)活动(通过完成它们,实质上是任何碎片)保存它们的状态并创建活动堆栈并留下任何其他东西(应用程序对象,任何其他静态对象,可以从任何根访问的引用。
我最感兴趣的是2b,但我会对所有这些观点进行确认,因为我试图从头到尾抓住整个概念。
答案 0 :(得分:4)
如果您正在寻找官方确认,那么最好只向Google询问:)。
但是在阅读本书后我会感觉到你会更好地理解这些概念。
回答第一个问题: 是的确认使用DDMS。
回答2a问题:是的OS可以在任何时间点杀死进程,当需要其他进程的内存时,这将导致杀死与进程相关的所有对象。
回答2b问题:
来自官方文件
流程生命周期3.后台活动(用户不可见且已暂停的活动)不再重要,因此系统可以安全地终止其进程以回收其他前台或可见进程的内存。如果需要杀死它的进程,当用户导航回活动(再次在屏幕上显示)时,将使用之前在onSaveInstanceState(Bundle)中提供的savedInstanceState调用其onCreate(Bundle)方法,以便它可以在用户上次离开的状态下重启自己。
答案 1 :(得分:4)
是的,你对2b大多是正确的。
如果活动暂停或停止,系统可以放弃活动 从记忆中要么完成要么完全杀死它 过程
但是有些情况下没有调用onSaveInstantSate:
请注意,将持久数据保存在onPause()中非常重要 ofSaveInstanceState(Bundle)因为后者不属于 生命周期回调,因此不会在每种情况下调用 在其文档中描述。
您可以通过启用以下开发人员选项来请求android始终在后台销毁活动。如果您正在调试应用程序,您应该能够逐步完成生命周期方法,看看发生了什么。
设置 - &gt;开发者选项 - &gt;应用 - &gt;不要保持活动
答案 2 :(得分:4)
应用程序不存在典型的生命周期。应用程序对象存在于内存中,直到它本身没有被Android本身或用户手动杀死。
对于以上几点,以下是您的答案:
1)这是真的。
2)a)这也是事实。 2)b)当应用程序进入后台时,您只能保存前台当前活动的数据。此外,当您自行终止应用程序时(通过从最近的列表中删除它),应用程序堆栈中的所有活动及其保存的数据(非持久性数据)都被杀死,因为应用程序是所有活动的基础。
答案 3 :(得分:4)
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.
答案 4 :(得分:0)
这件事取决于Android OS的运作方式。 Android Device是一个嵌入式系统,但与PC几乎相同,当我说Android作为操作系统时,它将定义具有操作系统的所有功能。您指出的是Android OS的内存管理和调度功能。 MMU(存储器管理单元)在逻辑上优先考虑当前正在执行的任务,即你的启动器或任何其他应用程序。我想回答的两件事可以帮助你更多:
所以,让我告诉你,我不认为这两个选项都是正确的。我相信的是: 1.视图将始终动态生成。 2.实例将保存在内存中。 3.在应用程序的背景上,可用实例的整个过程将是它们的内存。
答案 5 :(得分:0)
好的,在我最近几周的搜索任务中,我能够获得更多信息,现在我可以回答我自己(并希望其他人)的问题:
1)正确
2a)正确
2b)错误。 android框架,如果需要内存或者由于某些其他原因它必须“杀死/减少”应用程序,它只能通过杀死专用于该应用程序的整个进程来实现。 android框架可以更好地杀死所选择的活动或杀死所有活动,但让所有其他对象保持活动状态(如Application对象,单例等)。