组件化开发 是适应团队开发的一种模式
如果你一个项目有三人以上联合开发 你就会发现开发协作以及效率会大不如从前 代码臃肿 各种调用 各种重复 都是有可能会发生的 甚至会出现今天写明天错 这时候单一的module 的开发模式 明显已经不适合再继续使用了 所以组件化 应运而生(当然还有插件化 以后会开篇插件化以及插件化相关的框架介绍 今天只谈组件化 以及组件化和插件化的区别)
下面给他两个示例图 区别组件化 和 插件化
![](https://img.haomeiwen.com/i13049477/c9a19138064d16b4.png)
![](https://img.haomeiwen.com/i13049477/f2731466e4383cdb.png)
例图已经很明显了 两者从原理上来说是有着本质区别的 但最终目的都是为了提高开发效率和团队协作能力
下面开始环境搭建 本文以as 为例
新建一个项目 KidsDemo
新建一个module library libmodel 放公共方法 或者 资源
新建一个phone module businessmodel 功能模块
案例使用了中间件路由 Arouter 具体使用我就不说了 本文略长 关于第三方 我会提供相关联系
阿里巴巴中间件 点击了解Arouter路由
我的项目架构
![](https://img.haomeiwen.com/i13049477/386f4e38584cadec.png)
我们只写两个module 的 交互 和 通信 即 app 和 businessmodel 之间进行
首先对preject 进行配置
打开project 的 build.gradle 文件
添加中间件
apply plugin: ‘com.alibaba.arouter’ dependencies {
….
classpath “com.alibaba:arouter-register:1.0.0”
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
提取远程依赖 设置开关 在project 的 gradle.properties 中添加
isDebug = true;// false debug 模式 true 发布模式 ;false 开发模式不存在依赖关系
提取sdk管理供各model 调用 统一设置sdk版本
ext{
android_compileSdkVersion = 25
android_buildToolsVersion = ‘25.0.3’
android_minSdkVersion = 16
android_targetSdkVersion = 25
app_versionCode = 1;
app_versionName = “1.0”;
lib_fastjson = 'com.alibaba:fastjson:1.2.32'
lib_gson = 'com.google.code.gson:gson:2.6.1'
lib_xutils = 'org.xutils:xutils:3.5.0'
lib_router = 'com.alibaba:arouter-api:1.3.0'
lib_routercom = 'com.alibaba:arouter-compiler:1.1.4'
}
接着配置 libmodel 的 build.gradle 文件
compileSdkVersion rootProject.android_compileSdkVersion
buildToolsVersion rootProject.android_buildToolsVersion
defaultConfig {
minSdkVersion rootProject.android_minSdkVersion
targetSdkVersion rootProject.android_targetSdkVersion
versionCode rootProject.app_versionCode
versionName rootProject.app_versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
compile lib_gson
compile lib_xutils
这里配置了sdk 的一些属性 和 gson xutils 等工具
配置 app 的 build.gradle 文件
compileSdkVersion rootProject.android_compileSdkVersion
buildToolsVersion rootProject.android_buildToolsVersion
defaultConfig {
applicationId “com.example.mysmall.kidsdemo”
minSdkVersion rootProject.android_minSdkVersion
targetSdkVersion rootProject.android_targetSdkVersion
versionCode rootProject.app_versionCode
versionName rootProject.app_versionName
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}
resourcePrefix “app_” // 区别资源文件命名 防止重名问题
compile lib_router
annotationProcessor lib_routercom
testCompile ‘junit:junit:4.12’
compile project(‘:businessmodel’)
compile project(‘:libmodel’)
添加中间件 以及 添加 libmodel businessmodel 依赖
配置 businessmodel 的 build.gradle 文件
if (isDebug.toBoolean()) {
applyplugin:'com.android.library'
}else {
applyplugin:'com.android.application'
}
android {
compileSdkVersion rootProject.android_compileSdkVersion
buildToolsVersion rootProject.android_buildToolsVersion
defaultConfig {
minSdkVersion rootProject.android_minSdkVersion
targetSdkVersion rootProject.android_targetSdkVersion
versionCode rootProject.app_versionCode
versionName rootProject.app_versionName
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
resourcePrefix "business_" // 同上 区别命名
}
compile lib_router
annotationProcessor lib_routercom
compile project(‘:libmodel’)
添加中间件 和 libmodel 依赖
然后我们要配置清单文件 manifast.xml
main/ 包下创建 debug/包 然后复制你的manifast.xml 到 debug 下 修改 application 和 mainactivity 的属性即可
然后在android 闭包下配置
sourceSets {
main {
if (isDebug.toBoolean()) {
manifest.srcFile'src/main/debug/AndroidManifest.xml'
}else {
manifest.srcFile'src/main/AndroidManifest.xml'
}
}
}
好了 这样就可以了 分别提供在library 和 application 情况下对manifast的访问
到这里基本配置 已经完成了
解释一下 几个点
第一 app 和 businessmodel 仅仅只配置了
compile lib_router
annotationProcessor lib_routercom // 阿里巴巴的中间件
compile project(‘:libmodel’) // 共有基础包
这里并没有配置 网络请求 和 解析 工具 是因为我在libmodel 中已经配置 app 和 buisnessmodel 中配置了 libmodel 直接调用即可 初始化 和 相关封装 工作 都在 libmodel 中 并提供接口 共app 和 buisinessmodel 调用
第二 businessmodel 的相关配置
if (isDebug.toBoolean()) {
applyplugin:'com.android.library'
}else {
applyplugin:'com.android.application'
}
不知道大家注意没有 在project 的 gradle.properties 文件下 的 我给了一个属性 isDebug = true;// false debug 模式 true 发布模式 这是个开关 为了加载不同的busnessmodel 类型 当为true 是 businessmodel 是个library module 反之 是app module
当然 还有的人将manifastxml 文件进行了配置 配置了两个 这个也是可以的 而我这里没有配置 是因为我一直是当作module 开发的 这种方式的配置方式是 在businessmodel 的main包下 创建一个debug包 将mainfastxml 文件复制一下 paste到 debug 包下 并去掉MainActivity的相关属性即可
我们开始编写libmodle 看一下 这个包的架构
![](https://img.haomeiwen.com/i13049477/865396f020a279db.png)
base 基础包 存储baseactivity application 和 activity管理者
router 路由包 管理路由 初始化 和 uri 地址管理
utils 工具包 一些sp工具 gson 解析工具等
首先看一下 base 包
AppContext 是上下问管理类 获取application 的 上下文对象 具体代码就不写了 稍后我会push 到 github 上
AppManager app的堆栈管理 所有的activity
BaseActivity activity 的父类 和 activity 生命周期管理
BaseChildApplication 各个modile 的application 的 父类 管理同意初始化 以及内存管理
ApplicationAsLibrary 内存管理的抽象方法
router 包下 ConstantRouterUri 所有的uri 的 常量类
utils 这个包就不说了 无关紧要 只是展示作用而已
稍后会有代码上传 如有需要 自己去pull 就i好了
现在我们开始编码 我想要app 和 businessmodule 进行互相跳转 互相传值并展示
app module 下只有两个类 一个是mainactivity 一个是appApplication
/**
* 作者: Nade_S on 2018/6/21.
*/public classMyAppextendsApplication{
@Override
public void onCreate() {
super.onCreate();
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
ARouter.init( this ); // 尽可能早,推荐在Application中初始化 }
}
App的MainActivity
//@Route(path = "/app/activity/main")
@Route(path = ConstantRouterUri.AppMainUri)
public class MainActivityextends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.app_jump_bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ARouter.getInstance().build("/business/activity/main").withInt("age",33).withString("name","c罗").navigation();
}
});
int age = getIntent().getIntExtra("age",0);
String name = getIntent().getStringExtra("name");
Toast.makeText(this, "appMain---"+name+age, Toast.LENGTH_SHORT).show();
}
}
为了直观显示 我把MainActivity 直接写在了这里
@Route(path = ConstantRouterUri.AppMainUri) 这样也是可以的
我现在要做的操作的是 点击跳转到 businessmodel 下 MainActivity 页面 并传值过去
现在开始编写 businessmodel包下的MainActivity
//@Route(path = "/business/activity/main")
@Route(path = ConstantRouterUri.BusinessMainUri)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b_activity_main);
findViewById(R.id.business_jump_bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ARouter.getInstance().build("/app/activity/main").withInt("age",34).withString("name","梅西").navigation();
}
});
int age = getIntent().getIntExtra("age",0);
String name = getIntent().getStringExtra("name");
Toast.makeText(this, "businessMain---"+name+age, Toast.LENGTH_SHORT).show();
}
}
business取值并展示 点击返回到app包下的并传值
效果如下:展示App/MainActivity 与 Business/MainActivty 相互传值并显示
![](https://img.haomeiwen.com/i13049477/42bd0b7dd0bcfe24.gif)
当然这是发布版 如果是开发阶段 直接在project的 build.gradle 设置开关debug--ture/false即可
好了 本文结束 如有疑问 留言或私信 demo 已上传 需要源码可以下载后查看
网友评论