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??