Android只要有 id ,就可以自動保存到 onSaveInstanceState,不用做額外處理
對於類別內部分變數,希望可以在旋轉或被 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()
}
交給 viewModel
和 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)
    ...
}