组件化的基础知识

组件化的概念,在几年前就提了出来,并且衍生出些框架,那么什么是组件化,为什么要用组件化?如果我们移动端项目比较小的话,团队人也不多,一般情况下,业务逻辑也不会复杂,此时,按照常规写代码,没什么问题。但项目一旦大了,就像我们团队,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 ,感兴趣的可以搜下。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值