为什么使用片段 # setRetainInstance (boolean) ?

我发现片段 # setRetainInstance (true)令人困惑,下面是从 Android 开发者 API中提取的 Javadoc:

Public void SetRetainInstance(布尔值保留)

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

  • OnDestroy ()将不会被调用(但 onDetach ()仍然会被调用,因为片段正在从其当前活动中分离)。
  • 不会调用 onCreate (Bundle) ,因为没有重新创建片段。
  • OnAttach (Activity)和 onActivityCreated (Bundle) 威尔仍然被调用。

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

52962 次浏览

作为一个开发人员,您如何使用它

调用 setRetainInstance(true)。我通常在使用它的 onCreateView()onActivityCreated()中这样做。

为什么会让事情变得简单呢?

在处理跨配置更改的数据保留(例如,将设备从纵向旋转到横向)方面,它往往比 onRetainNonConfigurationInstance()更简单。非保留的片段会在配置更改时被销毁和重新创建,而保留的片段则不会。因此,这些保留的片段所持有的任何数据都可用于配置更改后的活动。

这对于保持长时间运行的资源(如套接字)是开放的非常有帮助。有一个没有用户界面的片段,其中包含对蓝牙插座的引用,当用户翻转手机时,您不必担心重新连接它们。

对于需要很长时间才能加载的资源(如位图或服务器数据) ,保存引用也很方便。加载一次,将其保留在一个保留的片段中,当重新加载活动时,它仍然存在,您不必重新构建它。

很晚的时候才加上这个答案,但是我认为这会让事情变得更清楚。跟着我说。当 setRetainInstance是:

假的

  • 片段在配置更改时重新创建。
  • 在配置更改时调用所有生命周期方法,包括 onCreate()onDestroy()

没错

  • 片段不会在配置更改时重新创建。
  • 所有的生命周期方法都是在配置更改时调用的,APART FROM onCreate()onDestroy()
  • 将实例添加到回退堆栈时,保留实例将不起作用。

不要忘记上面的内容同样适用于 DialogFragment和片段。

不推荐使用 setRetainInstance (boolean)方法,而应使用 ViewModel。

片段上的 setRetainInstance(boolean)方法从片段 API 的版本 1.3.0开始就是 不赞成

随着 视图模型的引入,开发人员有了一个保留状态的特定 API,它可以与活动、片段和导航图相关联。这允许开发人员使用一个正常的,而不是保留的片段,并保持他们想要保留的特定状态分开。

这样可以确保开发人员对这些片段有一个更易于理解的生命周期(一个匹配其所有其余片段的生命周期) ,同时保持单个创建和单个销毁的有用属性(在这种情况下,ViewModel的构造函数和来自 ViewModelonCleared()回调函数)。