1

假设我从活动 A -> 活动 B 开始。在活动 BI 中按 home 键退出。时间长了,可能会调用 gc,因为其他应用优先级更高。我的问题是,以下哪些类型的数据将被垃圾收集(我很确定静态字段可以随时被垃圾收集,但我不确定这些):

i) 声明的字段finalstatic final

ii) 我从活动 A 传递到活动 B 的意图及其数据

iii) onSavedInstanceState 在应用程序运行期间改变方向时

我问这个是因为我想确保我的应用程序在很长一段时间后从后台恢复活动 B 时不会崩溃。

4

4 回答 4

2

加载类时不能选择静态变量进行垃圾回收。当相应的类加载器(负责加载此类)本身被收集为垃圾时,可以收集它们。(见这个答案

除此之外,如果您正确设计您的应用程序并且不自己持有活动、片段等的引用,那么您的每个实例变量的对象都可以是 gc。但是不要担心 Android 生命周期会为您处理这些问题,它会为您提供已销毁/gc 的活动以及您保存的 onSavedInstanceState onCreate() 等等,因此您可以检索该状态您在去后台之前

于 2013-07-03T11:03:24.820 回答
1

我认为您将垃圾收集的概念与 Android 提供的组件生命周期混淆了。

垃圾回收只会释放内存中无法访问的对象,即不再存在对它们的强引用。如果您在收集对象时使用终结器来触发行为,那么您做错了什么。

同时,组件生命周期由 Android 操作系统以一种确定的方式管理——当它希望终止一个活动(或服务或应用程序)时,它会调用该组件上的一些方法(例如onDestroy()),仅此而已——一旦 Android 已经销毁那么它应该从你的角度消失。

当您希望开始保存和恢复活动状态时,唯一的困难出现 - 然后当您的活动被暂停/停止/销毁时管理一些事情对您来说变得很重要。同样,这些是完全确定的事件,与垃圾回收无关。

具体回答您的问题:

i)如何声明字段并不重要。如果你引用了一个对象,那么你会自动引用它的所有字段,这意味着它们不会被垃圾收集。

ii)当您创建意图时,您是否保留对它的引用?如果没有,那么它可能会被垃圾收集,但这不应该打扰你,因为你没有对它的引用:)

iii) 保存的实例状态将由 Android 系统保存,并在重新创建活动时返回给您。你不应该保留你自己的引用。

希望有帮助!

于 2013-07-03T09:41:27.237 回答
0

从后台恢复时,您的活动可能会被垃圾收集并重新创建。如果要保存一些数据,请使用SharedPreferences或其他持久存储。

于 2013-07-03T09:21:02.467 回答
0

这个线程很旧,但没有解决一个非常重要的问题:https ://developer.android.com/topic/performance/memory#release

Android 可以通过多种方式从您的应用程序中回收内存,或者在必要时完全终止您的应用程序,以便为关键任务释放内存

随时。

杀死您的应用程序进程意味着它会重新启动,这意味着如果您没有将任何状态保存到包、数据库或 sharedprefs 中,它将被重新初始化。还有ComponentCallbacks2接口回调来监听低内存事件。

.

于 2018-08-27T01:41:45.473 回答