后台活动的本地对象被Xamarin Android垃圾收集

时间:2013-10-15 05:01:20

标签: android android-activity garbage-collection xamarin

我的应用导航了一堆活动(在同一个任务中)

A - > B - > ç

前进是可以的,但我注意到在我弹回B(从C)或A(从B)后,该Activity中的所有CLR对象都为空。这包括本地字段和事件处理程序。

我的猜测是Android在内部序列化Activity堆栈(忽略CLR字段),从而导致CLR GC收集这些Activity的对象。这显然是不可取的,肯定有办法防止这种情况发生。

有没有人设法在进入后台然后恢复活动后保留活动的CLR对象?

1 个答案:

答案 0 :(得分:2)

你是对的。当你在活动C上时,A和B都处于“已停止”状态,因此有资格被清理(移动到“已销毁”状态,然后收集垃圾)。看起来文档中的相关文章在这里:

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

最基本的想法:您覆盖onSaveInstanceState,Android会在适当时调用它。然后它会传递给您的onCreate()方法,以便您可以在重新创建活动时将其恢复。

编辑:当然还有其他选择。当你的状态信息笨重时,你应该特别关注替代方案,因为上面的方法(de)将你的状态序列化,这会花费很多。

就个人而言,我倾向于在数据库中保存我需要的信息,并在onCreate()甚至onStart()中检查它(当我需要对其他活动中发生的变化作出反应时,在此活动仍在内存中时发生)。您还可以将所需信息保存到文件或任何其他持久存储中。不同之处在于你有责任知道什么时候应该恢复状态,什么时候开始新的。

请注意,静态变量中的保存状态也不起作用。静态变量往往比活动的实例变量更多持久性,但是它们可以在没有通知的情况下被擦除,例如,当你接到电话时。