android 为什么当我旋转屏幕时ViewModel对象没有被破坏?

yuvru6vn  于 2023-02-20  发布在  Android
关注(0)|答案(3)|浏览(167)

我读过ViewModel的生命周期。
我创建了一个活动,并将一个viewModel与活动生命周期相关联,viewModel的生命周期等于活动的生命周期。
1:当我完成Activity的时候,Activity的onDestroy()会被触发,viewModel的onCleared()会被触发,然后viewModel会被销毁,它是这样运行的。
2:如果我旋转Activity的一个屏幕,Activity会先被销毁,然后再重新创建。所以当我旋转屏幕时,Activity的onDestroy()会被触发,Activity的生命周期也会结束,所以我认为viewModel的生命周期也会结束,viewModel的onCleared()会被触发,然后viewModel会被销毁,对吗?

rqdpfwrv

rqdpfwrv1#

视图模型存储所有者:ViewModelStoreOwner仅仅是一个接口,任何实现该接口定义的getViewModelStore()的类都成为ViewModelStore的所有者。
Fragment和Activity都实现了ViewModelStoreOwner。这些类维护一个viewModelStore,并且值被适当地恢复。
ViewModelStore可被视为在HashMap中存储ViewModel的容器,其中key是字符串值,value是要保存的ViewModel(ViewModelProvider使用string_key + ViewModel类规范名称的串联)。
ViewModel如何经受配置更改:每个Activity和片段都有一个ViewModelStore,这使它们成为ViewModelStoreOwner。每当Activity首次启动时,都会调用getViewModelStore()方法,如果该方法为空,则会创建一个ViewModelStore示例。CustomViewModelFactory用于创建ViewModel,因为如果尚未为该特定ViewModelStoreOwner创建新示例,Android会为您提供一个新示例。然后,ViewModel会存储到ViewModelStore中。
如果继续旋转屏幕,则调用onRetainNonConfigurationInstance(),并将viewModelStore示例保存到NonConfigurationInstance中,以便在配置更改后使用。
应用完成旋转后,将调用getViewModelStore()方法,并从NonConfigurationInstance对象向Activity提供ViewModelStore的旧示例。这就是ViewModel如何在配置更改后继续存在的原因。
观察生命周期事件,如果发生onDestroy事件,且配置未更改(设备未旋转且应用程序正在关闭),则清除viewModel存储。

ws51t4hk

ws51t4hk2#

否,ViewModel仅在Activity结束时被销毁(由于用户完全取消Activity或由于在Activity上调用finish())。
图片来源:www.example.comhttps://developer.android.com/guide/components/activities/activity-lifecycle#ondestroy

rekjcdws

rekjcdws3#

感谢@alpha-1答案
https://stackoverflow.com/a/66634305/592217

  • 不要在Activity中放入逻辑来确定销毁Activity的原因,而应使用ViewModel对象来包含Activity的相关视图数据。如果由于配置更改而要重新创建Activity,则ViewModel无需执行任何操作,因为它将被保留并提供给下一个Activity示例。如果不打算重新创建“活动”,则ViewModel将调用onCleared()方法,以便在销毁之前清除任何需要清除的数据。*
  • 您可以使用isFinishing()方法区分这两种情况。*

https://developer.android.com/guide/components/activities/activity-lifecycle#ondestroy

相关问题