Lifecycle的生命周期状态事件和状态
Lifecycle是一个抽象类,其内部包括了添加和移除观察者的方法,还包括了此前说到的Event和State枚举。Lifecycle使用两个枚举来跟踪其关联组件的生命周期状态,这两个枚举分别是Event和State。 State指的是Lifecycle的生命周期所处的状态。 Event代表Lifecycle生命周期对应的事件,这些事件会映射到Activity和Fragment中的回调事件中。
Lifecycle如何观察Activity和Fragment的生命周期
Activity和Fragment已经默认实现了LifecycleOwner接口,LifecycleOwner可以理解为被观察者
ComponentActivity内创建了LifecycleRegistry,LifecycleRegistry是Lifecycle的实现类,并注入到了ReportFragment。ReportFragment中会调用dispatch方法,对生命周期event事件进行分发。
到了LifecycleRegistry.handleLifecycleEvent进行处理。
ComponentActivity中-->onCreate-->ReportFragment.injectIfNeededIn(this);-->dispatchCreate/dispatchStart/dispatchResume-->dispatch-->LifecycleRegistry.handleLifecycleEvent-->moveToState-->sync-->backwardPass/forwardPass-->observer.dispatchEvent-->mLifecycleObserver.onStateChanged
在activity中,getLifecycle().addObserver(LifecycleObserver)将观察者和被观察者联系在一起 Lifecycle的实现类LifecycleRegistry中handleLifecycleEvent处理页面生命周期的走向,通过event的事件,驱动state状态的改变observer.dispatchEvent(lifecycleOwner, event);-->mLifecycleObserver.onStateChanged(owner, event);
onStateChanged-->ReflectiveGenericLifecycleObserver-->invokeCallbacks-->ClassesInfoCache(反射优化) 在createInfo中获取方法上的注解OnLifecycleEvent通过反射调用invokeCallback
Android Jetpack架构组件(三)带你了解Lifecycle(原理篇) | BATcoder - 刘望舒 实现LifecycleObserver接口的类中,注解修饰的方法和事件会被保存起来,通过反射对事件的对应方法进行调用。或者使用注解处理器,生成的Java代码里就是接口的回调。
利用events事件来改变states状态:
Lifecycle包含了移除、添加观察者,还 使用两个枚举来跟踪其关联组件的生命周期状态,这两个枚举分别是Event和State。 State指的是Lifecycle的生命周期所处的状态。 Event代表Lifecycle生命周期对应的事件,这些事件会映射到Activity和Fragment中的回调事件中。
Android Jetpack架构组件(三)带你了解Lifecycle(原理篇) | BATcoder - 刘望舒
Lifecycle 使用与源码分析——彻底搞懂Lifecycle原理_薛瑄的博客-CSDN博客_lifecycle原理
生命周期事件管理利器 —— Lifecycle 原理详解 - 简书
二、ViewModel原理ViewModel管理的数据有一个特点,就是不会随着页面配置改变而销毁,但在页面销毁时则会正常跟着销毁。整体流程比较清楚:Android ViewModel 实现原理 - 知乎
ViewModel原理 - 掘金
1、viewmodel的获取:首先调用ViewModelProvider.get()方法,从ViewModelStore中获取ViewModel,有则直接返回,没有就创建后返回。
ComponentActivity持有一个ViewModelStore,可以通过ViewModelStoreOwner中的getViewModelStore()方法获取。
HashMap mMap = new HashMap();
mMap
是ViewModelStore 中有且仅有的成员变量,看它的泛型类型参数就能明白,它就是 ViewModelStore 用来存储 ViewModel 的池子。
(String key, ViewModel viewModel)final void put
ViewModelStore 顾名思义,它是负责储存 ViewModel 的一个类。引用 ViewModelStore 代码注释中的一段话表示它的功能:
ViewModelStore 的实例必须在发生配置更改时得以保留:如果此 ViewModelStore 的所有者由于配置的改变而被销毁并重新创建,那么所有者的新实例应该具有相同的 ViewModelStore 旧实例。2、viewmodel中值的保存和恢复:
1,系统配置改变时,构建一个NonConfigurationInstance,将ViewModelStore保持到NonConfigurationInstance,再将NonConfigurationInstance保存到ActivityClientRecord的lastNonConfigurationInstances
2,恢复时,将ActivityClientrecord的lastNonConfigurationInstances传递给新的Activity,再通过getViewModelStore()获取时就能从新的Activity的lastNonConfigurationInstances获取ViewModelStore,进而获取之前的ViewModel
Android Jetpack(二)ViewModel 组件原理剖析_Chiclaim-CSDN博客
ViewModel 的基本原理就是:
Q1:viewModel什么时候保存值?
在 configuration changes 的时候,在界面 destroy 的时候(ActivityThread.performDestroyActivity)通过 onRetainNonConfigurationInstance 方法将 NonConfigurationInstances 对象(里面包含 ViewModel) 保存起来。
Q2:viewModel什么时候恢复?
在重建 Activity 的时候在 attach 方法中(ActivityThread.performLaunchActivity)将上次保存的 NonConfigurationInstances 对象赋值给 Activity 的成员变量 mLastNonConfigurationInstances,然后在 onCreate 中通过 getLastNonConfigurationInstance 方法获取上次保存的 NonConfigurationInstances 对象。
ViewModel.onCleared() 资源回收:
既然ViewModel是生命周期感知的,那么何时应该清理ViewModel呢?
我们来到FragmentActivity的onDestroy()方法,发现它是在这里清理的.
/**
* Destroy all fragments.
*/
@Override
protected void onDestroy() {
super.onDestroy();
if (mViewModelStore != null && !isChangingConfigurations()) {
mViewModelStore.clear();
}
mFragments.dispatchDestroy();
}
三、LiveData原理
LiveData是一个数据持有组件,主要用来通知数据观察者数据发生了更新,它通过与LifecycleOwner组件绑定,实现可以只在页面活跃状态下发起通知,并在页面销毁时自动取消订阅,防止内存泄漏。
LiveData的工作原理 - 简书
Android Jetpack架构组件——LiveData原理篇 | 我就是马云飞
相关问题:
Q1:LiveData是如何观察生命周期变化的?
简单回答:LifecycleBoundObserver添加到Lifecycle中完成注册,通过LifeCycle监听生命周期变化
详解如下:
如何观察生命周期,我们需要通过他的observe方法去看,我们上源码:
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?