ViewModel源码流程,Lifecycle生命周期管理
ViewModel源码流程,Lifecycle生命周期管理
涉及到ViewModel和Lifecycle使用


1. 什么是Lifecycle?
Lifecycle是Android Jetpack中的一个组件,用于管理和监听Activity、Fragment等组件的生命周期状态。
它通过LifecycleOwner(如Activity、Fragment)和LifecycleObserver(观察者)来实现生命周期的感知和管理。
2. Lifecycle的作用是什么?
解耦:将生命周期相关的逻辑从Activity/Fragment中分离出来,使代码更清晰、可维护。
避免内存泄漏:通过感知生命周期,及时释放资源或停止后台任务。
简化开发:开发者可以专注于业务逻辑,而不需要手动处理生命周期的回调。
3. LifecycleOwner和LifecycleObserver分别是什么?
LifecycleOwner:是一个接口,表示具有生命周期的组件(如Activity、Fragment)。它提供了一个Lifecycle对象,用于管理生命周期状态。
LifecycleObserver:是一个接口,用于观察LifecycleOwner的生命周期事件。通过注解(如@OnLifecycleEvent)或实现DefaultLifecycleObserver来监听生命周期变化。
4、LifecycleRegistry:核心类,也是Lifecycle抽象类的直接实现
-> handleLifecycleEvent()
5. 如何使用LifecycleObserver监听生命周期?
创建一个类实现LifecycleObserver接口。
使用注解(如@OnLifecycleEvent)或实现DefaultLifecycleObserver来监听生命周期事件。
在Activity/Fragment中注册观察者。
6. Lifecycle的常见生命周期事件(Event)有哪些?
Lifecycle定义了以下生命周期事件:
ON_CREATE:对应Activity.onCreate()。
ON_START:对应Activity.onStart()。
ON_RESUME:对应Activity.onResume()。
ON_PAUSE:对应Activity.onPause()。
ON_STOP:对应Activity.onStop()。
ON_DESTROY:对应Activity.onDestroy()。
ON_ANY:监听所有生命周期事件。
7. State 是一个枚举,表示宿主的状态,但是宿主的状态和宿主的生命周期不是同一个概念。
public enum State {
// 宿主的销毁状态,onDestory()之后
DESTROYED,
// 宿主的初始状态,onCreate()之前
INITIALIZED,
// 宿主的创建状态,onCreate()之后,onStop()之前
CREATED,
// 宿主的启动状态,onStart()之后,onPasue()之前
STARTED,
// 恢复状态,onResume()之后
RESUMED;
}
8. Lifecycle如何避免内存泄漏?
通过LifecycleObserver监听生命周期,及时释放资源或停止后台任务。
使用LiveData自动感知生命周期,避免在非活跃状态下更新UI。
在onDestroy()中移除观察者或取消任务。
关于四个核心组件的总结:
Lifecycle:描述的是存放和管理生命周期的容器
LifecycleRegistry:是Lifecycle的实现类
LifecycleObserver:是观察生命周期变化的监听器
LifecycleOwner:是对外提供Lifecycle的提供者。
使用 Lifecycle 观察宿主状态有三种实现方式。
1、实现 LifecycleObserver 接口
2、实现 DefaultLifecycleObserver 接口
3、实现 LifecycleEventObserver
生命周期管理:
Lifecycle生命周期监听:
1、ComponentActivity类
-> onCreate()
ReportFragment.injectIfNeededIn(this);
2、ReportFragment类
-> injectIfNeededIn()
LifecycleCallbacks.registerIn(activity); 注册监听事件
-> onActivityPostCreated()
-> dispatch()
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
其中event是Lifecycle.Event.ON_CREATE
Lifecycle生命周期的执行:
Fragment类:
-> performResume()
调用mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
ViewModel:存储和管理与UI相关的数据,并在配置变更(如屏幕旋转)时保持数据存活。
不持有Activity/Fragment的引用,避免内存泄漏。
通过ViewModelStore管理生命周期。
通常结合LiveData或Flow实现数据驱动UI。
是一个抽象类:abstract,不能直接new对象,那对象是怎么创建的呢?
ViewModelProvider类的AndroidViewModelFactory类的create()方法
ViewModelProvider:
负责创建和管理 ViewModel 实例,确保:
同一个 ViewModelStore 返回相同的 ViewModel(单例)。
通过 Factory 创建 ViewModel(支持自定义构造函数)。
调用ViewModelProvider(this)方法主要做了以下两件事:
1、获取ViewModelStore对象,如果ViewModelStore为null,会先尝试
调用getLastNonConfigurationInstance()方法获取,获取不到则直接通过new创建,内部通过HashMap实现ViewModel对象的存储;
2、创建AndroidViewModelFactory对象,其内部提供了create(),使用反射创建对应的ViewModel对象;
ViewModelStore:
用来存储ViewModel对象的,通过内部维护一个HashMap来实现对ViewMoel对象的存储与管理工作。
ViewModelStoreOwner:
接口,表示“拥有 ViewModelStore的对象”(如 Activity/Fragment)。
HasDefaultViewModelProviderFactory:
接口,表示“能提供默认 ViewModelProvider.Factory 的对象”。
AndroidViewModelFactory属于ViewModelProvider内部类
ViewModelProvider.Factory的实现类,用于创建ViewModel实例:
支持带 Application 参数的 AndroidViewModel。
默认通过反射调用构造函数。
Lifecycle:
管理Activity/Fragment的生命周期事件(如 ON_CREATE、ON_DESTROY)。
ViewModelStore 的清理由 Lifecycle 触发:
// ComponentActivity中
getLifecycle().addObserver(LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_DESTROY && !isChangingConfigurations) {
getViewModelStore().clear();
}
})
NonConfigurationInstances:
Android系统在配置变更时保留的临时数据(如 ViewModelStore)。
Activity销毁重建时,系统通过onRetainNonConfigurationInstance()保留ViewModelStore。
新Activity通过lastNonConfigurationInstance恢复。
旋转屏幕,Activity重启,经历onDestroy() -> onCreate(), ViewModel是如何实现配置更改后数据恢复的?
一:保存数据
1、ActivityThread类
-> handleDestroyActivity()
-> performDestroyActivity()
r.lastNonConfigurationInstances = r.activity.retainNonConfigurationInstances();
数据最终保存到ActivityClientRecord类的lastNonConfigurationInstances中
属于Activity.NonConfigurationInstances,是一个静态内部类。
然后才执行mInstrumentation.callActivityOnDestroy(r.activity);调用onDestroy()
2、Activity类
-> retainNonConfigurationInstances()
3、ComponentActivity类
-> onRetainNonConfigurationInstance() - 重要:创建NonConfigurationInstances
注意:
ComponentActivity类NonConfigurationInstances和Activity类NonConfigurationInstances父子类关系,类型转换安全
二:当Activity重新创建的时候,会执行ActivityThread.performLaunchActivity()方法:
1、ActivityThread类
-> performLaunchActivity()
调用activity.attach方法,传递已经保存的lastNonConfigurationInstances
2、Activity类
-> attach()
使用静态变量保存mLastNonConfigurationInstances = lastNonConfigurationInstances;
3、ComponentActivity类
-> getViewModelStore()
-> ensureViewModelStore()
-> getLastNonConfigurationInstance()
返回保存的mLastNonConfigurationInstances
mViewModelStore = nc.viewModelStore 获取保存下来的ViewModel,保证数据不会被清除
更多推荐

所有评论(0)