1

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

A -> B -> C

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

我的猜测是,Android 在内部序列化了 Activity 堆栈(忽略 CLR 字段),从而导致 CLR GC 收集这些 A​​ctivity 的对象。这显然是不希望的,并且肯定有一种方法可以防止这种情况发生。

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

4

1 回答 1

2

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

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

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

编辑:当然,还有其他选择。当您的状态信息很庞大时,您应该特别考虑替代方案,因为上面的方法(反)序列化您的状态,这可能会变得很昂贵。

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

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

于 2013-10-15T05:09:28.557 回答