Mvvm+Databinding学习记录
- 对于架构,最常用的可能是Mvc,比较流行的是Mvp,它在某种程度上与Mvvm模式非常相似。不过Mvvm在Mvp的基础上更进一步的提高了开发效率,拥有了数据绑定的能力;
- 高内聚,低耦合,代码边界清晰,每一个组件都可以拆分出来独立运行;
- 所有组件寄托于宿主App,加载分离的各个组件,各自编译自己的模块,有利于多人团队协作开发;
- 了解MVVMHabit:基于谷歌最新AAC架构,MVVM设计模式的一套快速开发库,整合Okhttp+RxJava+Retrofit+Glide等主流模块,满足日常开发需求。使用该框架可以快速开发一个高质量、易维护的Android应用;
- 了解ARouter:阿里出的一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦;
- 特点:宿主项目没有layout和activity;
- 职责:负责配置构建编译/打包参数,依赖子模块;
- 包含两个部分:1,AndroidManifest.xml,用来配置application、启动页面等;2,build.gradle,负责配置构建编译/打包参数,依赖子模块;
特点:组件是一个特殊的Module,在合并打包的时候它是一个library:apply plugin: ‘com.android.library’,在独立编译运行的时候,它是一个application:apply plugin: ‘com.android.application’;
除了业务组件之外,还需要创建两个基础Library,library-base和library-res;
- library-base(核心库):存放一些公共方法、公共常量、组件通信的契约类等.上层被所有组件依赖,下层依赖公共资源库/图片选择库/路由库等通用库,通过它,避免了组件直接依赖各种通用库,承上启下,作为整个组件化的核心库;
- library-res:为了缓解base库的压力,专门分离出一个公共资源库,被base库所依赖,主要存放与res相关的公共数据,比如图片/style/anim/color等;
-
3.4.1.MVVMHabit配置:
-
配置一:工程的gradle配置
allprojects {
repositories {
//...
google()
jcenter()
maven { url 'https://jitpack.io' }
}
}
- 配置二宿主项目中的gradle中配置
dependencies {
//...
implementation 'com.github.goldze:MVVMHabit:?'
}
-
3.4.2.ARouter配置:
-
以下都在宿主项目中的gradle中配置 todo 待检测
defaultConfig {
//...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
dependencies { //todo 待检测
api 'com.alibaba:arouter-api:?'
annotationProcessor 'com.alibaba:arouter-compiler:?'
}
组件化其实是一个 分离--组合 的过程; 分离:分离产品原型; 组合:是组合代码模块; 拿到需求后,先将产品原型分离成一个个子原型,分工开发后,将编写完成的子业务模块又打包组合成一个完整的Apk;
- 分离示例 todo 列出项目的功能点
gradle是组件化的基石,想搭建好组件化项目,gradle知识一定要扎实(Android已经留下了gradle的烙印,加油,缺啥补啥,战!);
-
宿主依赖业务组件
todo 配代码
-
业务组件依赖library-base
todo 配代码
-
library-base依赖公共库
todo 配代码
- Android MVVM模式离不开DataBinding,每个组件中都需要开启,包括宿主App
android {
//开启DataBinding
dataBinding {
enabled true
}
}
}
- 需要一个全局变量来控制当前运行的工程是隔离状态还是合并状态。在gradle.properties中定义:
isBuildModule=false
- 在组件的build.gradle中动态切换library与application
if (isBuildModule.toBoolean()) {
//作为独立App应用运行
apply plugin: 'com.android.application'
} else {
//作为组件运行
apply plugin: 'com.android.library'
}
- 当isBuildModule 为 true 时,它是一个application,拥有自己的包名; TODO 如何配置?
todo 待补充
- 在组件的build.gradle配置统一资源前缀 todo 待补充
- 可以将每个组件的build.gradle公共部分抽取出一个module.build.gradle todo 待补充
组件在独立运行时,也就是debug期,有单独的manifest,当然也就可以指定Application类进行初始化。 那么当组件进行合并的时,Application只能有一个,并且存在宿主App中,组件该如何进行初始化?
- 反射是一种解决组件初始化的方法。
每一个业务组件的src/main/包名目录下新建一个目录,命名为independent(自己定义).组件在独立运行时,在alone(自己定义)目录下有单独的manifest, 独立运行的情况下,模块的入口activity放在independent中.同时当然也就可以指定Application类进行初始化(建议在library-base中配置). 那么当组件进行合并的时,Application只能有一个,并且存在宿主App中,组件该如何进行初始化?
todo
组件间是完全无耦合的存在,但是在实际开发中肯定会存在业务交叉的情况,该如何实现无联系的组件间通信呢?
-
ARouter 之所以作为整个组件化的核心,是因为它拥有强大的路由机制.ARouter在library-base中依赖,所有组件又依赖于library-base,所以它可以看作为组件间通信的桥梁.
-
ARouter配置已经介绍过,
-
databinding 简单使用
在使用BottomNavigationView时,元素图标尽量选取svg