一.组件化
首先新建项目 正常创建项目
需要使用几个组件就创建几个
当组件被整合到同一个app中的时候,多个组件的资源会产生冲突,
因此我们在资源文件命名的时候通常会带上组件名作为前缀
组件分为三种:
一种是基础组件,提供各种方法供别的组件使用。
另一种是可单独运行的独立组件。
最后一种是打包时包含其他组件的。
三种组件build.gradle的区别
基础组件
组件头
apply plugin: 'com.android.library'
普通组件
组件头
if(isLihaofanModule.toBoolean()) {
apply plugin: 'com.android.application'
}else{
apply plugin: 'com.android.library'
}
总包组件
组件头
apply plugin: 'com.android.application'
普通组件分为两种状态,一种是能单独打包运行的,这个作为独立app,所以是application
零一种是作为组件提供给别人使用的状态:library
当一个组件作为app单独存在时他需要applicationld,而且作为组件时用library
所以在defaultConfig里进行判断:
defaultConfig {
if(isLihaofanModule.toBoolean()) {
applicationId "com.example.lihaofan_day01_module"
}
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"
这些判断使用的判断条件为:if(isLihaofanModule.toBoolean())
是在整个工程的gradle.properties文件中定义的
#是否需要单独编译 true表示需要,false表示不需要#isNeedHomeModule=true
isNeedHomeModule=false
#isNeedhotelModule=true
isNeedhotelModule=false
#isNeedMineModule=true
isNeedMineModule=false
#isNeedDestinationModule=true
isNeedDestinationModule=false
### 三种组件清单文件的区别
组件作为独立的app在清单文件中需要application的name属性
````xml
<application android:allowBackup="true" android:name=".appApplication" android:icon="@mipmap/ic_launcher" android:label="@string/app_name"
并且需要一个入口Activity
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
而且为library时是不需要入口的,所以就用不用 intent-filter
所以作为普通组件既需要单独作为APP运行,又需要作为library提供给其他组件。那么它的清单文件也需要两个
两个清单文件要用哪个需要在build.gradle中进行判断
sourceSets {
main {
if (isNeedMineModule.toBoolean()) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
}else {
manifest.srcFile 'src/main/release/AndroidManifest.xml'
}
}
}
arouter使用
先导入依赖:所有组件化的项目都要导入arouter包
implementation ('com.alibaba:arouter-api:1.4.1')
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
使用arouter跨组件传值需要两个组件都写:
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = [ AROUTER_MODULE_NAME : project.getName() ]
}
}