android组件化的简单实现

android开发中,如果你的项目比较大,开发的人员比较多,功能模块也多的情况,就会容易出现,文件覆盖等很多问题,这个时候,组件化的开发,就显得比较方便了。每个模块独立开发,最后整合到一起。
在网上也查看了各位大神的文章,这里根据自己写的例子做一下记录。
一般组件化是有一个主的app,然后是一个个的Module。这个主的app也被叫做壳。就是它来加载各个Module。我这里做的比较简单,就是一个app,两个Module(一个是纯的library,另一个是application的)
先建相关的项目,再建两个Module.  File -  > new Module (一个选择Android library, 另一个选择Phone&Tablet Module)
library的叫componentlib, Phone的叫componentLogin
目录如下:

在这里插入图片描述
建好之后,我们要就设置让它们如果即可以单独使用,又可以整合使用了。

第一步,建立一个开关,用来确定componentlogin是单独开发还是组合运行,我们在项目根目录下的gradle.properties文件里定义一个开关变量。是否单独运行。

loginRunAlone = false

设置完开关之后,我们就要看一下,在什么地方用到它了。第一个,我们要确定Module是单独运行还是组合运行。这个就是第二步了。

第二步,在componentLogin下的build.gradle中来确定是单独运行还是组合运行
是单独运行还是组合运行主要是看 apply plugin: 后面跟的是什么

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

这里看到了吧,单独运行的时候是application,而组合是用的是libaray.
这里呢,还要改一个地方,就是我们在组合使用的时候,是只能有一个applicationId,所以

defaultConfig {
        if (loginRunAlone.toBoolean()) {
            applicationId "com.cg.componentlogin"
        }
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }

    }

这里加一个判断,当组合运行的时候,就不要这个id了。

第三步,我们知道AndroidManifest.xml文件在单独使用与组合使用的时候也是不一样。我们把componentlib下面的AndroidManifest.xml文件复制一份到componentLogin下面的manifest文件夹下面。如下图:
在这里插入图片描述
这个新的AndroidManifest.xml代码如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cg.componentlogin">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".LoginActivity"></activity>
    </application>
</manifest>

好,到这里我们的基本设置完事了。但是它们之间的通信怎么处理呢,这里我们采用的是阿里的ARouter来处理

第四步,集成阿里ARouter
1、在处了library外的所有可独立的Module下面的build.gradle里,添加引用

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    //implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation project(':componentlib')

    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    // 这里的版本号,请到官网上查看最新的版本
    compile 'com.alibaba:arouter-api:1.5.0'
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}

注意:一定要所有的Module都要加,一定、一定。不然不好用。
2、在主调用的module的application里初始化Arouter.

package com.cg.moudlelearn;
import android.app.Application;
import com.alibaba.android.arouter.launcher.ARouter;

public class appApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        
        //if (isDebug()) {           // 这两行必须写在init之前,否则这些配置在init过程中将无效
            ARouter.openLog();     // 打印日志
            ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
        //}
        ARouter.init(this);
    }
}

这里加完之后,你就可以在app的页面里加一个跳转功能,看效果了。

btn_jumplogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ARouter.getInstance().build("/login/activity").navigation();
            }
        });

在componentLogin中的LoginActivity.java中

@Route(path = "/login/activity")
public class LoginActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
    }
}

这时你运行一下,你会发现RAoute会给报一个

There is no route match the path

的错误。
这里要求,你要在要app的build.gradle里引入componentLogin
在这里插入图片描述
这时,你再运行,就可以了。

这就是简单的组件化使用,这里还留有问题,就是application如何去整合呢,每个组件里,都有可能会有自己的独立的application??

发布了305 篇原创文章 · 获赞 261 · 访问量 184万+

猜你喜欢

转载自blog.csdn.net/chenguang79/article/details/101012596