Q: SaveStateHandle的作用?
ViewModel仅可实现应用在屏幕旋转等配置发生变化时保存与恢复数据,无法实现Activity在后台时因为内存不足被异常销毁时的数据恢复,也即其不具备类似onSaveInstanceState与onRestoreInstanceState的功能。
通过SavedStateHandle类即可完成当Activity被系统异常销毁时ViewModel数据的保存与恢复。
原理简析:
每个使用SavedState的ViewModel都会创建一个Bundle来保存“状态”数据,最后这些Bundle会被汇总到一个Bundle中,然后被保存到onSaveInstanceState(Bundle outState)的outState中;当恢复的时候,会从onCreate(Bundle savedInstanceState)中的savedInstanceState中取出原来存放的总Bundle,然后再取出一个个的属于ViewModel的分Bundle,于是我们就能通过封装好的SavedStateHandle来方便地存取“状态”了。其实就是利用Bundle可以保存另一个Bundle这么一个特点,分层分区保存数据,让数据之间相互分离,进而方便存取。
[ViewModel如何保存状态——SavedState源码解析](https://www.jianshu.com/p/589254d66dd9#comments)
绝不丢失的状态 androidx SaveState ViewModel-SaveState 分析
从源码看 Jetpack(7)-SavedStateHandle源码详解