我很想知道当活动被旋转时,ViewModel 是如何生存的,因为它被破坏并再次重新创建。从逻辑上讲,如果我们看到,如果负责创建视图模型的活动被销毁,则视图模型将被销毁。当我们旋转设备时,活动正在破坏。
视图模型如何知道活动已完全完成,以便我可以摧毁自己?因为如果设备旋转,onDestroy 也会被多次调用,那么当活动完全销毁时,ViewModel 的 onCleared 方法是如何触发的呢?
理论 -> 在ViewModelStore中有一个类型为HashMap<String,ViewModel>的哈希图(您可以从您的活动中调用getViewModelStore((来获取它(,它存储ViewModel状态及其用于在下一个onCreate中获取现有viewModel的状态,这就是ViewModel在配置更改中幸存下来的方式。 因此,当 viewModel 的 clear(( 方法被调用时,viewModelStore 的 clear 方法在内部调用 viewModel 的 clear 时,ViewModel 就会被销毁。
为了回答你的问题, 存在内部检查,如果由于配置更改,则可以避免在onDestroy中调用此清除方法。
参考组件活动源代码 ->
getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull LifecycleOwner source,
@NonNull Lifecycle.Event event) {
if (event == Lifecycle.Event.ON_DESTROY) {
// Clear out the available context
mContextAwareHelper.clearAvailableContext();
// And clear the ViewModelStore
if (!isChangingConfigurations()) {
getViewModelStore().clear();
}
}
}
});
请注意 if 检查 isChangeConfiguration,这就是为什么在配置更改时不调用 clear 的原因
再次从源代码 isChangeConfiguration((
返回: 如果正在拆除活动以便使用新配置重新创建,则返回 true;否则返回假。
ViewModels 是生命周期感知的,这意味着当您创建视图模型时,您将LifecycleOwner
传递给 VM。这有助于视图模型获取上下文的状态(无论是活动、片段等(。 这允许视图模型仅在状态处于活动状态时将更改广播到其观察者。
请参阅以下链接以更清晰地了解
https://developer.android.com/topic/libraries/architecture/lifecycle#lco https://codelabs.developers.google.com/codelabs/android-lifecycles/#4