Android项目架构
架构
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则只会在引配置改动导致页面重建时触发,数据存在内存