理解片段的setRetainInstance(boolean)

从文档开始:

public void setRetainInstance(boolean retain)

控制是否在重新创建Activity时(例如从配置更改)保留片段实例。 这只能用于不在后端堆栈中的碎片。 如果设置,则在重新创建活动时,片段生命周期将略有不同:

  • onDestroy()不会被调用(但onDetach()仍然会,因为该片段正在从它当前的活动中分离出来)。
  • 由于片段不被重新创建,onCreate(Bundle)将不会被调用。
  • onAttach(Activity)和onActivityCreated(Bundle)仍然会被调用。
  • 我有一些疑问:

  • 片段是否也保留了它的视图,还是会在配置更改时重新创建? 什么是“保留”?

  • 当用户离开活动时,片段是否会被破坏?

  • 为什么它不适用于背部堆栈上的碎片?

  • 哪些是使用这种方法有意义的用例?


  • 首先,查看保留的碎片上的帖子 。 它可能有帮助。

    现在回答你的问题:

    片段是否还保留其视图状态,还是会在配置更改时重新创建 - 究竟是“保留”的?

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

    当用户离开活动时,片段是否会被破坏?

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

    为什么它不适用于背部堆栈上的碎片?

    可能有多种原因不支持它,但对我来说最明显的原因是Activity包含对FragmentManager的引用,并且FragmentManager管理后台堆栈。 也就是说,无论您是否选择保留FragmentActivity (以及FragmentManager的backstack)都会在配置更改时被销毁。 它可能无法正常工作的另一个原因是,如果允许保留的片段和非保留的片段存在于同一个后台堆栈中,情况可能会变得棘手。

    哪些是使用这种方法有意义的用例?

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

    一般来说,我会像使用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

    上一篇: Understanding Fragment's setRetainInstance(boolean)

    下一篇: Unable to override onCreateOptionsMenu in ListFragment