转换到其他活动时保存成员变量

时间:2011-07-27 06:51:55

标签: java android arraylist

场景:

我有一个成员变量,一个数组列表(不是静态的,私有成员),它包含Activity1中的自定义对象,

我转换到Activity 2,将activity1置于暂停状态。 截至目前,我没有保存数组列表的数据。

我从活动2回来,活动一是处于恢复状态。

我怀疑的是,当我转移到activity2时,是否必须在onPause()中保存array-list(成员变量)的数据,实际上,array-list持有对自定义对象的引用。

虽然通过快速测试,数组列表的数据仍然完好无损,但我怀疑这些对象是否可以自由地进行垃圾收集,我应该保存数组列表的数据并在onResume中重新加载它。

4 个答案:

答案 0 :(得分:3)

最好将数据保存在onPause()中,因为这是保证调用的最后一种方法,之后不能保证调用任何Activity的生命周期方法。请参阅"Activity Lifecycle"

中的详情

如果活动成员中的数据不应在流程启动期间保留,您也可以将其保存在onDestroy()中。如果没有杀死进程,也可以保证调用onDestroy()

但是你应该知道,一旦Activity 2启动,Activity 1就可以随时销毁。所以你可能需要至少在onDestroy()中以某种方式持久保存你的成员对象,甚至在你的onPause()中更好。另一件需要注意的事情是配置更改(例如方向更改)。那些触发销毁旧Activity并创建新的Activity实例。如果您未在onPause() / onDestroy()中保留成员(然后在onCreate()中恢复),则配置更改后您将有空字段。

答案 1 :(得分:1)

android.app.Activity州的官方文档:

  

当调用一个activity的onPause()方法时,它应该提交给   支持内容提供商或提交用户所做的任何更改。

在这种情况下,Activity1尚未进行GC,但在其他情况下可能会这样做。在预蜂窝系统上,如果资源不足,操作系统可能会杀死处于“暂停”状态的活动。为了确保始终保持状态,您应该在onPause()上保留数据并在onResume()中重新加载。

答案 2 :(得分:1)

我不会尝试使用对象保存enitre数组列表。背景中的活动不太可能被杀死,可能发生的是一些位图被系统破坏,因为它们占用了大量内存。当单击主页按钮或设备使用安全密码锁定屏幕时,可能会发生这种情况。

因此,在活动恢复中,可以检查位图引用是否为空,然后在需要时重新加载位图。还可以测试arrayList中的对象是否仍然存在。

我不知道将类对象保存到永久存储器中的方法,如首选项,应用程序目录或SD,只能保存基本类型的数据。序列化对象属性以保存它们将是一项巨大的工作。

答案 3 :(得分:0)

如果数据是您活动的实例变量,则除非操作系统销毁整个活动,否则不会进行GC操作。测试此方法的一种好方法是将模拟器倾斜到横向模式,并查看如何重新创建活动(除非您将应用程序配置为忽略此事件)。

要保存数据,您可以通过多种方式执行此操作,将其保存在Application实例变量上,使用Bundles或使用持久性。查看文档:

http://developer.android.com/guide/topics/resources/runtime-changes.html