android中的组件化的简单使用

android组件化已经被广泛应用了,它的好处这里就不多说了,这里只是简单的做组件化的过程做一个简单的使用说明,以备之后使用时做为参考。
准备工作:
我们在使用组件化的时候,必然会涉及到组件之间的跳转与传值,这个我们要使用阿里的ARouter。我们先去https://github.com/alibaba/ARouter上了解一下ARouter,并查看一下它的最新版本
一、建立项目,我们新建一个moduleLearn的项目,这里面我们再新建几个module。module的建立是 file- > new module。
这里说明一下,我们建立了chat、contract、home这三个module,它们三个在建立的时候选择Phone & Tablet module模式。这三个模块, 就是我们要独立进行开发的。
commonlib在建立的时候,选择Android Library,它是做为公共组件存在
二、添加变量,让各组件可以根据变量值的变化来确定是否可以独立开发
在项目的根目录下,找到gradel.properties文件,在里面写下

#是否需要单独编译 true表示不需要 false表示需要
isNeedHomeModule = true
isNeedChatModule = true
isNeedContractModule = true

三、在各个子组件的build.gradle中进行修改
1,在头部进行修改

//根据是否独立运行,来改变module
if(!isNeedHomeModule.toBoolean())
{
    apply plugin: 'com.android.application'
}else{
    apply plugin: 'com.android.library'
}
 2, android-> defaultConfig中的内容
android {
    compileSdkVersion 28
    defaultConfig {
   		//独立运行时,添加applicaton
        if(!isNeedHomeModule.toBoolean()) {
            applicationId "com.cg.home"
        }
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }

三、修改各子组件的androidmanifest.xml文件
在src -> main 下面建立manifest文件夹,在里面再建立一个androidmanifest.xml文件,把外面的androidmanifest.xml的内容复制一份进来,并修改外面的androidmanifest.xml内容,修改什么呢,就是把默认的启动页去掉。


    

    

下面是正常的androidmanifest.xml
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cg.home">

    <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=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

现在看到区别了吧,为什么要改这里呢,这里你不改的话,可以试一下,在不进行独立开发的时候,你一安装app,会有多个启动页面,这样就会在手上出现多个app的进入图标。

添加完androidmanifest.xml后,我们要去修改build.gradle文件,在android中添加

sourceSets{
        main{
			//这里我只是用home做的例子,每个module都要进行改,要判断相应的判断
            if(!isNeedHomeModule)
            {
                manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
            }else{
                manifest.srcFile 'src/main/AndroidManifest.xml'
            }
        }
    }

四,去主app的build.gradle中添加引用

if(isNeedChatModule.toBoolean())
    {
        implementation project(':chat')
    }

    if(isNeedContractModule.toBoolean())
    {
        implementation project(':contract')
    }

    if(isNeedHomeModule.toBoolean())
    {
        implementation project(':home')
    }

    implementation project(':commonlib')

当进行独立开发的时候,就需要进行引用。

好,到这里,组件化就算处理完成了,运行一下,就可以看到,只要修改gradle.properties里面我们自定义的变量值,就可以实现是否独立开发了。

下面我们来看一下,ARouter的引用与使用。

我们定义了commonlib的作用就是为了能做共用的代码提取出来,但是ARouter里面的一些代码,却无法放到这里,不然总是会提示你错误。这算是一个坑吧。
现在我们把ARouter怎么引入做一个说明
一、所有module都引用一个commonlib。
二、在commonlib的buile.gradle中引入

compile "com.alibaba:arouter-api:1.5.0"

当然了,你可以不放在dommlib中,在每个module中独立加也行
三、在每个module中引入

annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'

同时,在android -> defaultConfig中添加

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.cg.modulelearn"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

		//这里就是ARouter的引用
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }

这里要注意主app中也要添加

四、初始化ARouter是在主app中,定义一个我们自己的myAppllication.

public class myApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        initRouter();
    }

    private void initRouter() {
        if(BuildConfig.DEBUG)
        {
            ARouter.openLog();
            ARouter.openDebug();
        }
        ARouter.init(this);
    }
}

这样就集成完了,现在看一下,如何跳转与传值。

一、在子module中我们要进行注解

//这里注意,这时必须是二级目录,这里写的path就是在主app中要调用的跳转路径
@Route(path="/home/main")
public class MainActivity extends AppCompatActivity {

    private TextView txt_homeTitle;

	//这里的title值,就是要传入的值,前面必须加上@Autowired
    @Autowired
    public String title;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_homemain);
        //将页面注入到ARouter中
        ARouter.getInstance().inject(this);
        Log.e("MainActivity.java(onCreate)", "行数: 25  title:" + title);
        initControls();
    }

    /**
     * 初始化控件
     */
    private void initControls() {
        txt_homeTitle = (TextView)findViewById(R.id.txt_homeTitle);
        txt_homeTitle.setText(title);
    }


}

主app中的代码

public class MainActivity extends AppCompatActivity {

    private Button btn_home;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //ARouter.getInstance().inject(this);
        initControls();
    }

    /**
     * 初始化控件
     */
    private void initControls() {
        btn_home = (Button)findViewById(R.id.btn_home);
        btn_home.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ARouter.getInstance().build("/home/main")
                        .withString("title","主app传过来的HOME名字")
                        .navigation();
            }
        });
    }
}

到此完成。这里只是简单的做一个使用记录。
这个是参与了两位大神的代码,
地址如下:
一篇文章搞懂组件化
一文了解组件

你可能感兴趣的:(Android)