组件化的基础知识

组件化的概念,在几年前就提了出来,并且衍生出些框架,那么什么是组件化,为什么要用组件化?如果我们移动端项目比较小的话,团队人也不多,一般情况下,业务逻辑也不会复杂,此时,按照常规写代码,没什么问题。但项目一旦大了,就像我们团队,android 开发十几个人,逻辑也比较乱,一个按钮的显示就会被好几个逻辑控制,这种情况,如果几个人的功能有交集,很难说不会因为自己的改动而影响别人的逻辑;随着代码量的增加,编译一次的时间也大大增加。这时候,如果把业务逻辑进行拆分,拆到n个不同的module中,每个module中做自己的开发,并且能单独打包编译,这样是不是更好?组件化就是把模块进行拆分,解耦并且能高度复用的一种思路。那么我们说说组件化的基础怎么做。


android studio 中,gradle 是用来管理打包配置的,AS提供了主工程和module库,通过 gradle 中 apply plugin: 'com.android.application' 和 apply plugin: 'com.android.library' 来辨别,gradle 中可以通过 applicationId 来指定该项目的包名,通过 sourceSets 来指定 lib 、src 、AndroidMainfest 等信息。好,说道这里,我们想想组件化所需要的东西,module 可以作为 library 库,也可以作为独立的app,改怎么实现?我刚接触组件化也是一脸懵,感觉里面的东西很高深!其实 gradle 已经给我们指明了方向。 


app 目录下的 gradle 配置不用动,我们来修改 module 中的 gradle 配置。可以先在项目根目录的 gradle.properties 中定义个 boolean 值,isNeedModule=true ,这是个开关,如果为 true, module 仅仅是个 library ;如果值为false,则表示 module 可以变为一个独立的app来编译和按装。我们看看 module 中的 gradle 怎么写。首先就是 apply plugin 这个插件,我们根据 isNeedModule 来控制它的显示

if (isNeedModule.toBoolean()){
    apply plugin: 'com.android.library'
}else {
    apply plugin: 'com.android.application'
}

如果我们想让 module 在独立运行时,有个自己的包名,那么同理,可以

    defaultConfig {
        ...
        if (isNeedModule.toBoolean()) {
            applicationId "com.module.lib"
        }
        ...
    }


接下来就是配置清单了,我们知道 module 中的配置清单,里面是没有 Launch 入口的,而 apk 是需要在配置清单中指定入口,怎么办?直接在 module 中的配置清单添加入口Activity?这样会和主工程中的配置清单起冲突,同样,我们写两个配置清单,分别给 module 和 apk 使用即可

    sourceSets{
        main{
            if (isNeedModule.toBoolean(){
                manifest.srcFile 'src/main/library/AndroidManifest.xml'
            }else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
            }
        }
    }

这样,就可以了。我们在指定的位置创建配置清单即可,假如 module 中有个 Activity ,名字为 MainActivity, library/AndroidManifest.xml 中的配置如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        android:allowBackup="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity" >
        </activity>
    </application>
</manifest>

作为独立apk时,AndroidManifest.xml 为

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        android:allowBackup="true"
        android:supportsRtl="true"
        android:name=".libApp"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity" >
            // Launch 的入口
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

 
心细的朋友可能注意到了 android:name=".libApp" 这行代码,libApp 是继承 Application 的类,我们可以在它的里面做一些初始化的信息。但问题来了,module 作为独立 apk 时,libApp 会被初始化,那么如果它仅仅是一个 module 时怎么办? 我选的解决方案是使用反射,先在继承库里定义个接口,比如

public interface IApplication {
    void init(Application application);
}

然后在 module 中定义一个类A,实现这个接口,在 init() 方法中初始化信息;然后在 app 主工程中定义的 Application 中,写出 A 的全路径,然后通过反射创建一个对象,同时调用 init() 方法,并把当前 Application 当做参数穿进去。

以上,module 之间无数据交互,仅仅是一个架子,就这么搭起来了。这算是组件化的基础吧。如果对 gradle 基础知识不了解,直接给他说你实现个组件化,他肯定会感觉很难,甚至无从下手。知道了 gradle 可以动态配置包名和配置清单等信息后,就感觉好像也没那么难。 组件化中的数据和 Activity 的调转,可以通过三方库来实现,目前感觉比较好的有阿里的 Arouter ,感兴趣的可以搜下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值