在ui中保存状态
tags: Android
doc
viewState
只要有 id ,就可以自动保存到 onSaveInstanceState,不用做额外处理
SavedState
对于类别内部分变数,希望可以在旋转或被 os 杀死后仍然恢复状态,可用 onSaveInstanceState,但仅是用少量数据
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putBoolean(IS_EDITING_KEY, isEditing) outState.putString(RANDOM_GOOD_DEED_KEY, randomGoodDeed)}override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) isEditing = savedInstanceState?.getBoolean(IS_EDITING_KEY, false) randomGoodDeed = savedInstanceState?.getString(RANDOM_GOOD_DEED_KEY) ?: viewModel.generateRandomGoodDeed()}
onConfig
交给 viewModel
权责分离 SavedStateRegistry
和 DefaultLifecycleObserver 相似,将生命週期相关的操作,由各类别进行实作,以减少 activity 和 fragment 里的代码,提高覆用和内聚性
class SearchManager(registryOwner: SavedStateRegistryOwner) : SavedStateRegistry.SavedStateProvider { companion object { private const val PROVIDER = "search_manager" private const val QUERY = "query" } private val query: String? = null init { // Register a LifecycleObserver for when the Lifecycle hits ON_CREATE registryOwner.lifecycle.addObserver(LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_CREATE) { val registry = registryOwner.savedStateRegistry // Register this object for future calls to saveState() registry.registerSavedStateProvider(PROVIDER, this) // Get the previously saved state and restore it val state = registry.consumeRestoredStateForKey(PROVIDER) // Apply the previously saved state query = state?.getString(QUERY) } } } override fun saveState(): Bundle { return bundleOf(QUERY to query) } ...}class SearchFragment : Fragment() { private var searchManager = SearchManager(this) ...}