场景:
我有一个成员变量,一个数组列表(不是静态的,私有成员),它包含Activity1中的自定义对象,
我转换到Activity 2,将activity1置于暂停状态。 截至目前,我没有保存数组列表的数据。
我从活动2回来,活动一是处于恢复状态。
我怀疑的是,当我转移到activity2时,是否必须在onPause()中保存array-list(成员变量)的数据,实际上,array-list持有对自定义对象的引用。
虽然通过快速测试,数组列表的数据仍然完好无损,但我怀疑这些对象是否可以自由地进行垃圾收集,我应该保存数组列表的数据并在onResume中重新加载它。
答案 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