组件化开发 是适应团队开发的一种模式
如果你一个项目有三人以上联合开发 你就会发现开发协作以及效率会大不如从前 代码臃肿 各种调用 各种重复 都是有可能会发生的 甚至会出现今天写明天错 这时候单一的module 的开发模式 明显已经不适合再继续使用了 所以组件化 应运而生(当然还有插件化 以后会开篇插件化以及插件化相关的框架介绍 今天只谈组件化 以及组件化和插件化的区别)
下面给他两个示例图 区别组件化 和 插件化
例图已经很明显了 两者从原理上来说是有着本质区别的 但最终目的都是为了提高开发效率和团队协作能力
下面开始环境搭建 本文以as 为例
新建一个项目 KidsDemo
新建一个module library libmodel 放公共方法 或者 资源
新建一个phone module businessmodel 功能模块
案例使用了中间件路由 Arouter 具体使用我就不说了 本文略长 关于第三方 我会提供相关联系
阿里巴巴中间件 点击了解Arouter路由
我的项目架构
我们只写两个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 看一下 这个包的架构
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 相互传值并显示
当然这是发布版 如果是开发阶段 直接在project的 build.gradle 设置开关debug--ture/false即可
好了 本文结束 如有疑问 留言或私信 demo 已上传 需要源码可以下载后查看
点击下载demo