-
概述
- 如果你希望在Activity销毁之后—无论是自行销毁还是被系统kill—都总是执行初始化逻辑来展示界面,这种情况下不需要任何保存和恢复。
- 另一种就是需要根据一些临时数据来恢复界面,但是注意这种情况下只对被系统杀死的Activity才会触发,自行杀死的将不会调用相关保存方法。比如我需要记住输入框输入的内容、当前滚动位置、当前查询的内容id、偏好设置等,这些数据是我当前界面操作的状态,按照它们的用处来说不需要保存到本地(数据库等),在配置变更(比如旋转屏幕)或者在后台被系统杀死后再重新启动这个Activity时,就需要重现当时的界面状态。
第一种是自然状态,不需要额外管理,状态的保存和恢复是针对第二种情况来说的。
-
ViewModel
如果界面数据使用的是ViewModel中的数据,ViewModel就会自动被复用,但是这是有条件的:
- 应用没被杀死,这是首要条件;
- 当前Activity没有被finish,手动调用finish方法的话表示是用户主动想要关闭的,因此不需要保存,若是调用finish方法后,ViewModel实例也会自动从内存中移除;
- 如果想要在应用被杀死后重启页面时也能继续复用的话则需要使用ViewModel的SavedStateHandle参数,这里的原理可以通过ViewModelProvider来了解,它其实本质上使用的也是Activity的onSaveInstanceState方法来保存的;
比如,当ViewModel在配置发生变更(比如旋转屏幕)但同时应用没有被杀死时实例会自动保存到内存中,也即是说,这个时候ViewModel的实例是保存在应用内存中的,等到Activity恢复时再次获取ViewModel时就会从内存中取回之前的实例,因此也就能复用之前的数据。
-
保存实例API
我们知道,当应用被系统杀死时(内存不足)—这个杀死不包括手动的kill(finish或者任务栈kill)—我们可以在onSaveInstanceState中保存一些数据,在onCreate或者onRestoreInstanceState中来恢复数据。
这种方式下,数据不是保存在内存中的,而是磁盘,因此应用被杀死时依然可以恢复,上面的ViewModel使用的SavedStateHandle也是通过这种方式来获取的。
-
概括
image-20230221104736828
网友评论