在Android中FragmentManager进行片段回收的目的是什么?

时间:2015-02-11 05:14:02

标签: android fragment fragmenttransaction fragmentmanager

我知道在第一次使用片段时,应使用Fragment创建FragmentTransaction并将其添加到管理器中。但稍后可以在配置更改(例如屏幕旋转)后findFragmentByIdfindFragmentbyTag找到它。

但是在屏幕旋转时,我发现了片段onAttachonCreateonCreateViewonStart,{{1}的构造函数和所有回调方法即使从onResume返回的片段没有明确地调用构造函数,也会再次调用它。

调用构造函数意味着片段对象可以被垃圾收集。然后片段的哪一部分实际存储在配置更改中?如果碎片对象被垃圾收集并重新创建,那么重新计算它的目的是什么?

1 个答案:

答案 0 :(得分:2)

片段不会被回收。如果您在屏幕方向后记录Fragment.toString(),则会得到一个不同的值,这意味着这些片段实例是不同的,从头开始创建。所有生命周期方法都称为 BUT ,您可以通过onSaveInstanceState(Bundle)保留一些值。

对于您调用setRetainInstance(true)的片段,情况并非如此。现在唯一重复的生命周期方法是onCreateViewonViewCreated,(长暂停),onDestroyView。实例是相同的,保留了字段变量。

修改

  

在托管活动上调用onCreate之前,Android操作系统会自动销毁并创建片段并设置相同的标记和ID吗?

TL; DR:是的。

FragmentState类字段变量包含有关始终保留的一个片段的信息(其中包括tag和id)。

当你旋转屏幕FragmentManagerImpl.restoreAllState(...)被调用时,它会抓取保留的片段或实例化新片段并将它们重新连接到新活动。这是Activity.onCreate(Bundle)的一部分。

  

然后片段的哪一部分实际存储在配置更改中?

如上所述的FragmentState以及您或框架在onSaveInstanceState(Bundle)中写入的任何内容。如果片段标记为保留,则保存除视图层次结构之外的所有内容。

  

如果片段对象被垃圾收集并重新创建,那么重新编写它的目的是什么?

如果它从头开始销毁和创建(新实例),它根本不会回收。您可以保留片段实例 - 同一个实例保持屏幕方向更改 - 或保存并恢复实例状态 - 销毁旧片段实例,创建新片段实例并填充旧实例中的一些数据。