Android 开发之组件化环境搭建

组件化开发 是适应团队开发的一种模式
如果你一个项目有三人以上联合开发 你就会发现开发协作以及效率会大不如从前 代码臃肿 各种调用 各种重复 都是有可能会发生的 甚至会出现今天写明天错 这时候单一的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
}

提取远程依赖

ext{
isDebug = true;// false debug 模式 true 发布模式
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 (rootProject.isDebug==true){
apply plugin: ‘com.android.library’
}else {
apply plugin: ‘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 依赖

到这里基本配置 已经完成了
解释一下 几个点

第一 app 和 businessmodel 仅仅只配置了
compile lib_router
annotationProcessor lib_routercom // 阿里巴巴的中间件
compile project(‘:libmodel’) // 共有基础包
这里并没有配置 网络请求 和 解析 工具 是因为我在libmodel 中已经配置 app 和 buisnessmodel 中配置了 libmodel 直接调用即可 初始化 和 相关封装 工作 都在 libmodel 中 并提供接口 共app 和 buisinessmodel 调用

第二 businessmodel 的相关配置
if (rootProject.isDebug==true){
apply plugin: ‘com.android.library’
}else {
apply plugin: ‘com.android.application’
}
不知道大家注意没有 在project 的 build.gradle 文件下 的 ext{} 闭包中我给了一个属性 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 class MyApp extends Application{

    @Override
    public void onCreate() {
        super.onCreate();
        ARouter.openLog();     // 打印日志
        ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
        ARouter.init( this ); // 尽可能早,推荐在Application中初始化

    }
}

MainActivity

> @Route(path = "/app/activity/main") public class MainActivity extends
> 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包下的并传值

效果如下:

这里写图片描述

好了 本文结束 如有疑问 留言或私信 稍后会有链接 点击下载demo

猜你喜欢

转载自blog.csdn.net/naide_s/article/details/80954335
今日推荐