【发布时间】:2013-04-24 05:24:47
【问题描述】:
考虑到这种情况:如果我创建了一个活动并且它移动到后台并且这个活动包含一个设置为setRetainInstance(true)的Fragment,那么Android操作系统可能在某个时候仍然决定关闭活动的托管进程为了释放内存。
然后Activity 的状态通过onSaveInstanceState(Bundle) 保存,据我所知,相关的Bundle 被写入文件系统以在进程关闭后继续存在。 (因此捆绑中对象的要求是Serializable)。稍后,可以通过onRestoreInstanceState(Bundle) 在新进程中检索应用程序状态。
相比之下,我的Fragment 允许包含不一定是Serializable 的变量。因此,我认为Fragment 不能像Bundle 那样存储在磁盘上。那么当进程被杀死时我的片段会发生什么?
我在阅读开发者指南 (http://developer.android.com/guide/components/processes-and-threads.html) 时对此感到疑惑:
持有用户当前不可见的活动的进程 (活动的 onStop() 方法已被调用)。这些过程有 对用户体验没有直接影响,系统可以杀死他们 随时为前景、可见或服务回收内存 过程。通常有很多后台进程在运行,所以它们 保存在 LRU(最近最少使用)列表中,以确保 用户最近看到的活动的进程是 最后一个被杀。 如果一个活动实现了它的生命周期方法 正确,并保存其当前状态,杀死其进程不会 对用户体验有明显的影响,因为当用户 导航回活动,活动恢复其所有 可见状态。
我理解了上面的killing,VM 实例被关闭并且进程的状态被写入文件系统(这里是Bundle 发挥作用)。稍后读取捆绑包以恢复该过程。由于片段的保留与生命周期方法无关,而且我不知道如何保留例如一个指向网络连接的指针(你当然不应该在片段中有这样的指针),我想知道如果进程同时关闭,片段是否仍然恢复。我得出的结论是,它们肯定需要重新创建,因此生命周期方法应尽可能优于setRetainInstance(true)。
这个假设有意义吗?
【问题讨论】:
标签: android process fragment lifecycle retain