架构

MVC

model view controller

各部分互相耦合过于紧密

MVP

model view presenter

通过暴露接口的形式把获取数据的部分和控制视图的部分拆分开,更易于维护,逻辑更清晰,面向接口编程

MVVM

Lifecycle 的存在,主要为了解决 “生命周期管理” 一致性问题

LiveData 的存在,主要为了实现 “消息分发可靠一致”

ViewModel 的存在,主要为了解决 “状态管理” 一致性问题

DataBinding 的存在,主要为了解决 “View 实例 Null 安全” 一致性问题

LifeCycle:

Lifecycle 面市前,“生命周期管理” 纯靠手工维持,这容易滋生大量一致性问题。

例如跨页面共享 GpsManager 组件,在每个宿主 Activity 的 onResume 和 onPause 中都需 手动 “激活、解绑 和 叫停”

作用:

1.实现 “生命周期管理” 一致性,做到 “一处修改、处处生效”。

2.使第三方组件 随时可在自己内部拿到生命周期状态,以便执行 及时叫停 “错过时机” 异步业务 等操作。

3.使第三方组件调试时,可 安全便捷追踪到 “事故所在生命周期源”

4.避免了activity对组件的注入,以防内存泄漏或空指针

Activity 是一种 “模版方法模式” 实现,也即将 “窗口管理、多任务管理” 等开发者无需关注细节,放基类中完成,对子类只暴露生命周期等回调。Lifecycle同样存在于activity基类。

源码:观察者模式,在ComponentActivity内部维护了一个Fragment处理生命周期的分发

LiveData:

能感知生命周期的数据分发器,只在lifecycle活跃周期分发

默认是粘性的,所以如果实例化页面时对应的livedata有数据会出现问题,比如页面重建

源码:观察者模式

ViewModel

1.让状态管理独立于视图控制器,从而实现 “状态管理的分治”、实现 “状态管理的一致性” 和 “状态共享”(跨页面通信)。

2.为状态设置作用域,使状态的共享做到作用域可控。

3.实现单向依赖,避免内存泄漏。

ViewModel是依托于不同的Activity、Application、Fragment实例建立(ViewModelStore),这些实例就是它的作用域(工厂模式)

旋转屏幕ViewModel不会跟着重建:

onRetainNonConfigurationInstance方法,会在屏幕旋转时被调用

对比onSaveInstanceState:这个在系统可能回收页面时就会调用,比如后台,数据序列化存在硬盘

onRetain则只会在引配置改动导致页面重建时触发,数据存在内存