SaveStageRegistry
是androidx.savedstate:savedstate
库中提供给开发者的工具,AndroidX中的FragmentActivity
和Fragment
都已经适配了工具。
作用
开发者通过此工具可以在符合条件的上下文环境中,方便的感知状态保存(暂存)时机,以及其数据恢复的时机。
用法
- 获取
SaveStageRegistry
对象实例,可以通过SavedStateRegistryOwner.get
或ComponentActivity.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原理
- AndroidX中的组件,其内部已经嵌入了一个
SavedStateRegistryController
对象,这个对象会在原生组件的暂存和恢复周期时被调用 - 而其在恢复时,注入了一个生命周期Observer,即
Recreator
- 而
Reacrator
会在onStateChanged
时反射构造开发者通过runOnNextRecreation
注入的类,并触发其onRecreated
方法