为什么使用Fragment#setRetainInstance(boolean)?

我发现Fragment#setRetainInstance(true)令人困惑。 这里是从Android开发者API提取的Javadoc:

public void setRetainInstance (boolean retain)

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

  • onDestroy()将不会被调用(但onDetach()仍然会,因为片段正在从它当前的活动分离)。
  • onCreate(Bundle)将不会被调用,因为片段不被重新创build。
  • onAttach(Activity)和onActivityCreated(Bundle)仍然会被调用。

问题:作为一名开发人员,你如何使用它,为什么它使事情变得更简单?

你作为开发人员如何使用这个

调用setRetainInstance(true) 。 我通常在onCreateView()onActivityCreated() ,我在那里使用它。

为什么它使事情变得更容易?

它通常比onRetainNonConfigurationInstance()更简单,用于处理configuration更改(例如,将设备从纵向旋转到横向)的数据保留。 未保留的碎片被破坏并在configuration更改时重新创build; 保留的片段不是。 因此,这些保留片段所保存的任何数据都可用于configuration后更改活动。

这对保持长时间运行的资源(如套接字)非常有帮助。 有一个无用户界面的片段,保存对蓝牙sockets的引用,当用户翻转手机时,您不必担心重新连接它们。

保持引用需要很长时间才能加载像位图或服务器数据的资源也非常方便。 加载一次,保留在一个保留的片段,当活动重新加载时,它仍然在那里,你不必重build它。

添加了这个答案很晚,但我认为这会让事情更清楚。 跟我说。 当setRetainInstance是:

  • 碎片重新创buildconfiguration更改。 NEW INSTANCE被创build。
  • 所有的生命周期方法都在configuration更改上调用,包括onCreate()和onDestroy()。

真正

  • 片段不会在configuration更改时重新创build。 使用相同的实例。
  • 所有的生命周期方法都在config change,APART FROM onCreate()和onDestroy()上调用。
  • 添加到后台时保留实例将不起作用。

不要忘记,上面的内容适用于DialogFragments和Fragments。