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方法