幸存的配置更改机制是如何工作的



关于幸存的配置更改,我有三个类似的问题。我知道在配置更改中保留对象的三种方法,但我不知道它们是如何在后台工作的。

  1. 覆盖onSaveInstanceState。我知道它把数据放在包里。但它是如何在配置变化中幸存下来的呢?捆绑包到底是什么?它属于活动吗?我们的应用程序中只有一个捆绑包吗?(我知道我们可以制作不同的实例,但当我们用putExtraonSaveInstanceState或任何其他方法放置数据时,它们会去同一个地方吗?(

  2. 使用CCD_ 4和CCD_。这用于在配置更改期间保留CCD_ 6。那么它是如何工作的,数据放在哪里呢?(我知道去质子化(

  3. 保留(Holder(片段和片段中的setRatinInstance()方法。同样的问题(我认为活动只是使用了onRetainNonConfigurationInstance(),如果我错了,请纠正我(

我在网络和StackOverflow上搜索了这个,但什么都找不到。我也试着浏览实际的代码,但没有运气
由于这些问题是相关的,我想我把它们都放在一个问题里。希望一切都好。

覆盖SaveInstanceState。我知道它把数据放在包里。但它是如何在配置变化中幸存下来的呢?捆绑包到底是什么?它属于活动吗?我们的应用程序中只有一个捆绑包吗?(我知道我们可以创建不同的实例,但当我们用putExtra或onSaveInstanceState或任何其他方法放置数据时,它们会去同一个地方吗?(

这不是真的"通过配置改变的保留";,更是如此"在工艺水平上节省耐久性";然后将其重新用于配置更改。我之所以不考虑它"保留";是因为对象被分组为Parcelable,所以在恢复时会创建一个副本。

无论如何,ActivityRecord有一个捆绑包,每个任务堆栈都有自己的ActivityRecords,当进程死亡时,系统会保存和恢复任务堆栈。这种机制恰好发生在";也处理配置更改";。

Intent.putExtra的工作原理非常相似,是的。

使用onRetainNonConfigurationInstance((和getLastNonConfigurationInstance。这用于在配置更改期间保留viewModelStore。那么它是如何工作的,数据放在哪里呢?(我知道去质子化(

onSaveInstanceState不同,这实际上是一个操作系统级别的回调,只用于在配置更改期间保留对象。曾经有onRetainCustomNonConfigurationInstance/getLastCustomNonConfigurationInstance,但它被弃用,以支持ViewModel,因为ViewModel旨在成为";唯一的标准";跨配置更改保留的方式。不过,在内部,它只是viewModelStore中的onRetainNonConfigurationInstance(这是一个映射(。

片段中的Retained(Holder(Fragment和setRetainInstance((方法。同样的问题(我认为活动只是使用了onRetainNonConfigurationInstance((,如果我错了,请纠正我(

是的,尽管不幸的是,在最新的Jetpack Fragments版本中也不赞成这样做(为了简化碎片的交互及其生命周期(。片段管理器保留为非配置,保留的片段与之一起保留,使用FragmentActivityonRetainNonConfigurationInstance()(我认为现在它被称为FragmentManagerViewModel(。

非配置实例保存在ActivityClientRecord中,ActivityStack不会持久化这些实例。

希望这足够了。

最新更新