什么机制导致在 Fragment 到 Fragment 导航中调用 View.onSaveInstanceState?

Posted

技术标签:

【中文标题】什么机制导致在 Fragment 到 Fragment 导航中调用 View.onSaveInstanceState?【英文标题】:What mechanism causes a View.onSaveInstanceState to be called in Fragment to Fragment navigation? 【发布时间】:2020-09-08 07:47:07 【问题描述】:

在 SO 和 Google 上围绕这个主题有很多噪音,所以请耐心等待。

在执行片段到片段导航时,您会看到以下生命周期:

Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView

Fragment2: onCreateView
Fragment2: onStart
Fragment2: onResume

(你可以在这张从here盗取的图片中看到这一点)

没有调用 Fragment.onSaveInstanceState,因为 Fragment 实例仍然存在 - 只有它的视图已被破坏。

因此,什么机制可以保存和恢复 View 的状态,以及如何恢复?

【问题讨论】:

你试过旋转屏幕吗? IE。纵向到横向等等。 【参考方案1】:

onSaveInstanceState 将根据文档调用:

此方法将在应用程序的 onStop() 之后发生 针对以 Build.VERSION_CODES.P 开头的平台。为了 针对早期平台版本的应用程序此方法将 发生在 onStop() 之前,并且不能保证它是否 将在 onPause() 之前或之后发生。

在 onSaveInstanceState 中,您可以将所有要持久化的数据放入包中

override fun onSaveInstanceState(outState: Bundle) 
// put data you want to persist to outState
super.onSaveInstanceState(outState)

然后在onCreate 你可以检查是否需要恢复你的持久化数据:

  override fun onCreate(savedInstanceState: Bundle?) 
super.onCreate(savedInstanceState)
if (savedInstanceState == null) 
  // activity created for the first time
 else 
  // activity re-created, restore data from savedInstanceState

您还可以在此处阅读有关它的更多信息: https://developer.android.com/topic/libraries/architecture/saving-states

【讨论】:

感谢您的回答,但 Fragment 到 Fragment 导航不涉及 onSaveInstanceState() - 由于假设它使用与 Activity 到 Activity 相同的机制(或配置更改) 我已更新问题以突出我所询问的情况 如果你想持久化Fragment的数据,在导航的时候,你应该使用ViewModel。它始终与范围(片段或活动)关联创建,并且只要范围处于活动状态就会保留。例如。如果它是Fragment,直到它的onDestroy 被调用并且没有没有配置更改(设备轮换)。如果你想跨多个 Fragment 持久化数据,有一个通用的活动范围 ViewModel 并在那些需要它的 Fragment 中观察它的LiveData。让我知道,如果这是你想要的,我可以用一些代码示例更新我的答案。 ——

以上是关于什么机制导致在 Fragment 到 Fragment 导航中调用 View.onSaveInstanceState?的主要内容,如果未能解决你的问题,请参考以下文章

Android自学日记Android Fragment 真正的完全解析(上)

读书笔记-fragment的使用

Fragment

Fragment与ViewPager

Fragment常见问题

Fragment常见问题