ViewModel在页面重建时的存取

本文详细解析了Android中ViewModel如何在页面配置变更时保存和恢复数据。当屏幕方向变化导致页面重建,ViewModel通过Activity的生命周期方法保存在ActivityClientRecord中,待重建时重新获取,确保其生命周期超越Activity,实现数据持久。这一机制使得ViewModel能够在屏幕旋转等配置改变场景下恢复之前的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ViewModel在页面重建时的存取

当页面配置发生改变,会调用ActivityThread的handleRelaunchActivity方法,里面会依次执行销毁页面handleDestroyActivity和重建页面handleLaunchActivity。在handleDestroyActivity中又会调用performDestroyActivity 方法。
最终我们的ViewModel容器就在performDestroyActivity 中存下来。
关键代码:
r.lastNonConfigurationInstances = r.activity.retainNonConfigurationInstances();
在Activity的retainNonConfigurationInstances方法中会调用onRetainNonConfigurationInstance方法。这个方法在ComponentActivity中实现
nci.viewModelStore = viewModelStore
至此我们看到了viewModelStore的保存方法和过程。

总的来说就是,在手机发生屏幕选择等改变页面配置的操作时,在页面的销毁过程中会将ViewModel容器保存下来。

在ViewModelProvider的构造函数中就要求提供ViewModelStore。
在ComponentActivity的getViewModelStore中会调用ensureViewModelStore
getLastNonConfigurationInstance
getLastNonConfigurationInstance
说白了就是从上次保存的记录中取出来

ViewModel之所以能在屏幕发生选择时恢复数据,就是因为他的生命周期比Activity长。而他的生命周期之所以长是因为他会在Activity被销毁时,存在了ActivityClientRecord中,在重建页面时又从ActivityClientRecord中取出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值