【发布时间】: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 泄漏)