理解片段的setRetainInstance(boolean)
从文档开始:
public void setRetainInstance(boolean retain)
控制是否在重新创建Activity时(例如从配置更改)保留片段实例。 这只能用于不在后端堆栈中的碎片。 如果设置,则在重新创建活动时,片段生命周期将略有不同:
我有一些疑问:
片段是否也保留了它的视图,还是会在配置更改时重新创建? 什么是“保留”?
当用户离开活动时,片段是否会被破坏?
为什么它不适用于背部堆栈上的碎片?
哪些是使用这种方法有意义的用例?
首先,查看我保留的碎片上的帖子 。 它可能有帮助。
现在回答你的问题:
片段是否还保留其视图状态,还是会在配置更改时重新创建 - 究竟是“保留”的?
是的, Fragment
的状态将在配置更改中保留。 具体来说,“保留”意味着片段不会在配置更改时被破坏。 也就是说,即使配置更改导致底层Activity
被销毁,该Fragment
也将被保留。
当用户离开活动时,片段是否会被破坏?
就像Activity
一样,当内存资源不足时,系统可能会破坏Fragment
。 无论您的碎片是否在配置更改中保留其实例状态,都不会影响系统是否会在您离开Activity
摧毁Fragment
。 如果您离开Activity
(即通过按主页按钮), Fragment
可能会或可能不会被销毁。 如果通过按下后退按钮离开Activity
(因此调用finish()
并有效地销毁Activity
),则所有附加Fragment
的Activity
都将被销毁。
为什么它不适用于背部堆栈上的碎片?
可能有多种原因不支持它,但对我来说最明显的原因是Activity
包含对FragmentManager
的引用,并且FragmentManager
管理后台堆栈。 也就是说,无论您是否选择保留Fragment
, Activity
(以及FragmentManager
的backstack)都会在配置更改时被销毁。 它可能无法正常工作的另一个原因是,如果允许保留的片段和非保留的片段存在于同一个后台堆栈中,情况可能会变得棘手。
哪些是使用这种方法有意义的用例?
保留的片段对于跨活动实例传播状态信息(尤其是线程管理)非常有用。 例如,片段可以作为Thread
或AsyncTask
实例的主机,用于管理其操作。 有关更多信息,请参阅关于此主题的博客文章 。
一般来说,我会像使用onConfigurationChanged
一样使用Activity
来处理它...不要仅仅因为您懒得无法正确实现/处理方向更改而将它用作onConfigurationChanged
。 只有在需要时才使用它。
setRetaininstance
仅在您的activity
由于配置更改而被销毁并重新创建时有用,因为在调用onRetainNonConfigurationInstance
期间保存实例。 也就是说,如果您旋转设备,保留的碎片将保留在那里(它们不会被销毁并重新创建),但是当运行时间杀死活动以回收资源时,什么也不留下。 当您按下退出按钮并退出活动时,所有内容都将被销毁。
通常我使用这个功能来保存方向改变的时间。我从服务器下载了一堆Bitmaps,每个都是1MB,当用户不小心旋转他的设备时,我当然不想再做所有的下载工作。我创建了一个保存我的位图的Fragment
,并将其添加到经理并调用setRetainInstance
,即使屏幕方向更改,所有位图仍然存在。
SetRetainInstance(true)允许片段排序生存。 其成员将在配置更改期间保留,如旋转。 但是当活动在后台死亡时它仍然可能会被杀死。 如果系统终止了后台的包含活动,则它应该由您在onSaveInstanceState中正确处理的系统保存。 换句话说,onSaveInstanceState将始终被调用。 尽管如果SetRetainInstance为true并且片段/活动尚未终止,onCreateView将不会被调用,但如果它被终止并尝试被带回,它仍然会被调用。
这里有一些android活动/片段的分析,希望它有帮助。 http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html
链接地址: http://www.djcxy.com/p/63911.html