涉及到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,保证数据不会被清除

                    

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐