Android组件化设计与实现结合代码详解并总结优缺点

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,其他不变。

优势:

  1. 根据模块划分不同组件,分工明确,实现解耦;
  2. 不同组件可单独运行,开发时运行比整个项目运行减少了大量的运行时间;
  3. 组件化划分可使项目迭代更新时可以避免修改小功能出现牵一发而动全身现象;
  4. 多人协调开发时各自组件开发互不干扰减少代码冲突;

缺点:

  1. 各个module的资源文件名称容易冲突,所以各自资源名称按各自组建前缀命名来避免冲突(string、style、color、dimens字符串前缀,layout、drawable文件名);

组件化开发+MVVM+DataBinding是一个比较不错的设计模式,由于Google限制module中R文件改成非final值导致老版本butterknife老版本R报错问题使用DataBinding替换就无需更新butterknife了,而且MVVM本身也是使项目解耦,这样就跟符合高类聚低耦合开发设计了。

下面就是组件化开发+MVVM+DataBinding的Demo效果图:

你们的点赞、评论就是我更新文章的动力,希望我的文章输出能帮助到一点正在努力中的你,大家一起加油哦!

源码

欢迎关注微信公众号!你的每个赞和在看,都是对我的支持!👍在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值