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();
}
});
}
}
到此完成。这里只是简单的做一个使用记录。
这个是参与了两位大神的代码,
地址如下:
一篇文章搞懂组件化
一文了解组件