SaveStageRegistry使用与原理浅析

SaveStageRegistryandroidx.savedstate:savedstate库中提供给开发者的工具,AndroidX中的FragmentActivityFragment都已经适配了工具。

作用

开发者通过此工具可以在符合条件的上下文环境中,方便的感知状态保存(暂存)时机,以及其数据恢复的时机。

用法

  • 获取SaveStageRegistry对象实例,可以通过SavedStateRegistryOwner.getComponentActivity.getSavedStateRegistry
  • 通过实例对象注入(registerSavedStateProvider)自己的Provider(SavedStateProvider)。这个Provider将在组件重制前被触发。开发者所返回的Bundle会被对应到注册时所提供的key上,进而放入组件的总缓存
  • 在对应的生命周期,如LifecycleObserver.onStateChanged触发时,调用consumeRestoredStateForKey拿出之前所埋入的那个Bundle,做自己的消费行为
  • 也可以调用runOnNextRecreation注入一个类,这个类实现AutoRecreated接口表示自己将在下次重制时被触发,在被回调时使用consume接口获取相关Bundle数据即可

关于SavedStateRegistryOwner.get

在Jetpack Compose的实现中,会调用ComponentActivity.setOwners的扩展方法,将SavedStateRegistryOwner进行注入。注入的对象是DecorView,原理是调用其setTag,以R.id.view_tree_saved_state_registry_owner为key。
而在get时会层层回溯View(通过View.getParent()),如果有调用过setOwners方法则无须担心,总会拿到。但目前看,源码中只是Jetpack Compose有调用,其他时候如果需要的话需要开发者自行调用了。

Recreation原理

  1. AndroidX中的组件,其内部已经嵌入了一个SavedStateRegistryController对象,这个对象会在原生组件的暂存和恢复周期时被调用
  2. 而其在恢复时,注入了一个生命周期Observer,即Recreator
  3. Reacrator会在onStateChanged时反射构造开发者通过runOnNextRecreation注入的类,并触发其onRecreated方法

猜你喜欢

转载自juejin.im/post/7031759914695393294