考虑到这种情况:如果我创建了一个活动并将其移至后台,而该活动包含一个设置为
setRetainInstance(true)
的 Fragment
,那么 Android 操作系统有可能在某个时刻仍然会决定关闭活动的主进程以释放内存。
然后,Activity
的状态通过 onSaveInstanceState(Bundle)
保存,相关的 Bundle
被写入文件系统以便在进程关闭后保留状态(因此要求包中的对象是可序列化的)。稍后,应用程序状态可以通过 onRestoreInstanceState(Bundle)
在新进程中恢复。
相比之下,我的 Fragment
可以包含不一定是可序列化的变量。因此,我想,Fragment
不能像 Bundle
一样存储在磁盘上。那么当进程被杀死时,我的 fragment 会发生什么呢?
我在阅读开发人员指南(http://developer.android.com/guide/components/processes-and-threads.html)时对此感到好奇:
持有一个当前没有显示给用户的活动的进程 (已调用活动的 onStop() 方法)。这些进程对用户体验没有直接影响, 而且系统可以随时杀死它们以回收内存 用于前台、可见或服务进程。通常有许多后台进程正在运行,因此它们 保存在 LRU(最近最少使用)列表中,以确保 最后一个被杀死的是最近被用户看到的活动所在的进程。如果活动实现其生命周期方法 正确,并保存其当前状态,则杀死其进程不会 对用户体验产生可见效果,因为当用户 返回到该活动时,活动将恢复所有可见状态。
我理解以上的killing是指VM实例被关闭并将进程状态写入文件系统(此时需要用到 Bundle
)。稍后,会读取bundles以恢复进程。由于保留片段与生命周期方法无关,并且我不知道如何保留例如网络连接指针之类的内容(无论如何,您永远不应该在片段中有这样的指针),因此我想知道如果进程在此期间关闭,是否仍然会恢复片段。 我得出结论,它们肯定需要重新创建,并且尽可能使用生命周期方法而不是setRetainInstance(true)
。
这种假设有意义吗?
onRetainNonConfigurationInstance
已经过时了。 - Rafael WinterhaltersetRetainInstance
的javadoc条目说控制片段实例是否在Activity重新创建(例如从配置更改)时保留让我感到困惑,因为它只是谈到了_重新创建_。我把它理解为这会影响任何片段的重新创建。onRetainNonConfigurationInstance
的条目更清晰明了。更不用说你上面的解释了。所以再次感谢! - Rafael Winterhalter