ARouter简介
组件化其实就是一个主组件连接着其他多个组件组合成一个APP实现高类聚低耦合开发。
项目比较大时使用组件化可根据功能划分模块独立开发减少对原有代码改动量可避免改动影响其他功能,各个组件独立开发可以减少代码冲突量,项目比较大运行项目时经常出现重新编译时比较耗时短的三到五分钟跑一次项目,使用组件化独立运行可以大大减少开发等待时间。
组件化开发推荐目前比较流行的ARouter框架,ARouter是由阿里开发团队开源的组件化框架,目前应用比较多,ARouter经过多年广大开发者测验并改进已经比较完善,选择阿里团队一直有维护更新的ARouter更稳妥一些。
看一下模块化通信图:
组件化通信图:
组件化与模块化区别就在于模块组件之间可以通过路由通信,模块化不行各个模块之间想要通信只能靠依赖关系单向通行,而组件化可以双向通信。
导入ARouter
在build.gradle中导入ARouter(1.5.0是目前最新版本):
api 'com.alibaba:arouter-api:1.5.0'
需要用到ARouter注解的module中在build.gradle下添加解释器:
1、首先需要添加注解配置信息
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName(), AROUTER_GENERATE_DOC: "enable"]
}
}
}
2、添加注解器(1.2.2是目前最新版本)依赖
dependencies {
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
项目中组件设计:
Common为基础层library存储各种基类;
ARouter为路由层library存储组件间通信所需要的路由协议以及路由工具类;
Resources为公共资源层library存储String、color、图片各类公共资源文件;
app、module1、module2、module3为项目各个组件,app为宿主,其他module组件为app的子组件可作为单独应用独自运行,不过发版的时候需要合并所有组件依赖到app模块下。
嫌以上模块划分太多ARouter层和Resources层其实是可以合并,其实这两层的代码并不会太多可以合并一个包括后面大家有所有组件其他公共部分也可放到该层,拆开只是让大家看着更直观一些,让大家知道有路由层和Resources层概念。
Common的依赖:
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
}
ARouter的依赖:
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
api project(path: ':common')
api 'com.alibaba:arouter-api:1.5.0'
}
Resources的依赖:
dependencies {
api project(path: ':ARouter')
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
}
module1、module2、module3的依赖:
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation project(path: ':resources')
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
app的依赖:
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation project(path: ':resources')
if (!rootProject.ext.isModuleApplication) {
implementation project(path: ':module1')
implementation project(path: ':module3')
implementation project(path: ':module2')
}
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
这里rootProject.ext.isModuleApplication是在项目最外层声明的控制组件模式和集成模式切换参数;
module1、module2、module3组件切换:
if (rootProject.ext.isModuleApplication) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
android {
defaultConfig {
if (rootProject.ext.isModuleApplication) applicationId "com.xhiston.module1"
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName(), AROUTER_GENERATE_DOC: "enable"]
}
}
}
sourceSets {
main {
if (rootProject.ext.isModuleApplication) {
manifest.srcFile 'src/main/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
}
jniLibs.srcDirs = ['libs']
}
}
dataBinding {
enabled = true
}
}
Module作为集成环境时manifest去掉main入口和application的name,其他不变。
优势:
缺点:
组件化开发+MVVM+DataBinding是一个比较不错的设计模式,由于Google限制module中R文件改成非final值导致老版本butterknife老版本R报错问题使用DataBinding替换就无需更新butterknife了,而且MVVM本身也是使项目解耦,这样就跟符合高类聚低耦合开发设计了。
下面就是组件化开发+MVVM+DataBinding的Demo效果图:
你们的点赞、评论就是我更新文章的动力,希望我的文章输出能帮助到一点正在努力中的你,大家一起加油哦!
源码
欢迎关注微信公众号!你的每个赞和在看,都是对我的支持!