首先,查看我关于保留片段的帖子。它可能会有所帮助。
现在回答你的问题:
片段是否还保留其视图状态,或者会在配置更改时重新创建 - 究竟什么是“保留”?
是的,Fragment
的状态将在配置更改期间保留。具体来说,“保留”意味着片段不会在配置更改时被销毁。也就是说,即使配置更改导致底层被破坏,Fragment
也会保留。Activity
当用户离开activity时,fragment会被销毁吗?
就像Activity
s一样,Fragment
s可能会在内存资源不足的时候被系统销毁。无论您是否让您的片段在配置更改中保留其实例状态,都不会影响系统是否会在Fragment
您离开Activity
. 如果您离开Activity
(即按主页按钮),Fragment
s 可能会或可能不会被破坏。如果您Activity
通过按后退按钮离开 (因此,调用finish()
并有效地销毁Activity
),所有Activity
附加Fragment
的 s 也将被销毁。
为什么它不适用于后堆栈上的片段?
不支持它可能有多种原因,但对我来说最明显的原因是Activity
持有对 的引用FragmentManager
,并且FragmentManager
管理后台堆栈。也就是说,无论您是否选择保留您Fragment
的 s ,Activity
(以及因此FragmentManager
的 后堆栈)都将在配置更改时被销毁。它可能不起作用的另一个原因是,如果允许保留片段和非保留片段都存在于同一个 backstack 上,事情可能会变得棘手。
在哪些用例中使用此方法有意义?
保留的片段对于跨活动实例传播状态信息(尤其是线程管理)非常有用。例如,片段可以作为Thread
或的实例的主机AsyncTask
,管理其操作。有关更多信息,请参阅我关于此主题的博客文章。
一般来说,我会将它onConfigurationChanged
与使用Activity
...类似地对待它,不要仅仅因为您太懒而无法正确实现/处理方向更改而将其用作创可贴。仅在需要时使用它。