关于android:了解Fragment的setRetainInstance(boolean)

Understanding Fragment's setRetainInstance(boolean)

从一个文档:

public void setRetainInstance (boolean retain)

Control whether a fragment instance is retained across Activity re-creation (such as from a configuration change). This can only be used with fragments not in the back stack. If set, the fragment lifecycle will be slightly different when an activity is recreated:

  • onDestroy() will not be called (but onDetach() still will be, because the fragment is being detached from its current activity).
  • onCreate(Bundle) will not be called since the fragment is not being re-created.
  • onAttach(Activity) and onActivityCreated(Bundle) will still be called.

我有一些问题:

  • 因此,它是保留的片段视图,或想这是在配置被改变吗?到底是"保留"的意思吗?

  • 将片段的时间当用户离开的活动?

  • 为什么不它与在反向片段堆栈?

  • 这是理解它的用例使用本法?


首先,看看我关于保留片段的帖子。也许有帮助。

现在回答您的问题:

Does the fragment also retain its view state, or will this be recreated on configuration change - what exactly is"retained"?

是的,Fragment的状态将在配置更改期间保留。具体来说,"保留"意味着在配置更改时不会销毁片段。也就是说,即使配置更改导致底层Activity被破坏,Fragment也将被保留。

Will the fragment be destroyed when the user leaves the activity?

就像Activitys一样,当内存资源不足时,系统可能会破坏Fragments。无论您的片段是否在配置更改中保留其实例状态,都不会影响系统在离开Activity后是否会销毁Fragment。如果您离开Activity(即按下Home(主页)按钮),Fragment可能会或不会被销毁。如果按后退按钮离开Activity(因此,调用finish(),并有效地销毁Activity,则所有Activity附加的Fragment也将被销毁。

Why doesn't it work with fragments on the back stack?

可能有多种原因不支持它,但对我来说最明显的原因是Activity引用了FragmentManagerFragmentManager管理了backbackback。也就是说,无论你是否选择保留你的Fragments,Activity(因此FragmentManager的backbackback)在配置更改时都会被破坏。另一个可能不起作用的原因是,如果保留的片段和未保留的片段都允许存在于同一个backstack上,那么事情可能会变得棘手。

Which are the use cases where it makes sense to use this method?

保留的片段对于跨活动实例传播状态信息(尤其是线程管理)非常有用。例如,一个片段可以作为一个主机,例如ThreadAsyncTask的实例来管理其操作。有关详细信息,请参阅我关于此主题的博客文章。

一般来说,我会把它和使用onConfigurationChangedActivity的方法相似。不要仅仅因为你太懒而不能正确地实现/处理方向改变就把它当作创可贴。只在需要时使用。


只有当您的Activity由于配置更改而被破坏和重新创建时,setRetaininstance才有用,因为在调用onRetainNonConfigurationInstance期间保存了实例。也就是说,如果旋转设备,保留的片段将保留在那里(它们不会被销毁和重新创建),但是当运行时终止活动以回收资源时,什么也不会留下。当您按下后退按钮并退出活动时,一切都将被破坏。

通常我使用这个功能来节省方向改变的时间,比如说我从服务器上下载了一堆位图,每一个都是1MB,当用户不小心转动他的设备时,我肯定不想再做所有的下载工作,所以我创建了一个Fragment,拿着我的位图,把它添加到管理器中,然后调用setRetaininstance,所有的位图即使屏幕方向改变,S仍然存在。


setRetainInstance(true)允许片段存活。其成员将在配置更改(如旋转)期间保留。但当活动在后台被杀死时,它仍然可能被杀死。如果后台包含的活动被系统终止,则应该由正确处理OnSaveInstanceState的系统保存其InstanceState。换句话说,将始终调用OnSaveInstanceState。尽管如果setRetainInstance为true且片段/活动尚未终止,则不会调用onCreateView,但如果它已被终止并试图恢复,则仍将调用onCreateView。

下面是对Android活动/片段的一些分析,希望它能有所帮助。网址:http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html


当您希望拥有一些与活动生命周期无关的组件时,setRetainInstance(布尔值)非常有用。例如,RxLoader使用这种技术"处理RxJava的Observable的Android活动生命周期"(我在这里找到)。