组件化创建
arouter使用组件化:
http://note.youdao.com/noteshare?id=88cdc84d2f51c80b36b89c8dcb41bfeb&sub=BCEBBA4A629145C9A65535EB451D4283
一. 组件化
新建项目后New-Module-Phone&Tablet Module-输入Library Name-finish即可。
需要几个组件就new几个。
ps:注意当组件被整合到同一个app中的时候,多个组件的资源会产生冲突,因此我们在资源文件命名的时候通常会带上组件名作为前缀
组件的分类
组件分为三种:
1: 基本组件 ----> 给别的组件提供各种方法。
2: 普通组件 ----> 可单独运行的独立组件。
3: 总包组件 ----> 打包时包含其他的组件。
三种组件build.gradle的区别
基础组件 组件头: apply plugin: ‘com.android.library’
普通组件 组件头:
分为两种状态,一种是能单独打包运行的,我们将其视为独立的app,所以是application; 另一种是作为组件供别人使用的状态 :library。
if( isNeedMineModule.toBoolean() ) {
apply plugin: ‘com.android.application’
}else{
apply plugin: ‘com.android.library’
}
总包组件 组件头: apply plugin: ‘com.android.application’
三种组件清单文件的区别
组件作为独立的app在清单文件中需要application的name属性
<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时是不需要这些的
<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">
</activity>
</application>
所以作为普通组件既需要单独作为APP运行,又需要作为library提供给其他组件。
那么它的清单文件也需要两个
所以这两个清单文件到底使用哪个也需要在build.gradle中进行判断(也就是下面3.4的使用)
sourceSets {
main {
if (isNeedMineModule.toBoolean()) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/release/AndroidManifest.xml'
}
}
}
二. 组件化创建
1. 创建Module
创建步骤: file-->New-->New Module-->Phone&Tablet Module-->输入Library Name-->finish
2. 在整个工程的gradle.properties中添加条件
在整个工程的gradle.properties中添加条件,用作后文中的判断( if(isNeedMineModule.toBoolean()) )
添加条件格式如下:(isNeed+模块名+Module=true/false)(非固定格式)
# 是否需要单独编译 true表示需要,false表示不需要
#isNeedHomeModule=true
isNeedHomeModule=false
#isNeedhotelModule=true
isNeedhotelModule=false
3. 在app中的build.grable(小象)内操作
3.1 第1行(首行)判断此Module是作为依赖还是App使用
if(isNeedMineModule.toBoolean()) { //判断条件在2中定义
apply plugin: 'com.android.application'
}else{
apply plugin: 'com.android.library'
}
3.2 当组件作为app单独存在时,是需要application的(在android中加入判断):
if (isNeedLocationModule.toBoolean()){
applicationId "com.example.location" //包名
}
3.3 应用build.grable—> android—> defaultConfig下添加:
javaCompileOptions {
annotationProcessorOptions {
arguments = [ AROUTER_MODULE_NAME : project.getName() ]
}
}
3.4 android下直接添加(普通组件的两种状态: 不同的状态执行不同的清单文件):
sourceSets {
main {
if (isNeedMineModule.toBoolean()) { //是app
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else { //是依赖
manifest.srcFile 'src/main/release/AndroidManifest.xml'
}
}
}
// 注意: 清单文件的存放参考上面的 三种清单文件的区别
4. 添加Module依赖
若创建的Module属于依赖, 则在应用build.gradle–>dependencies中, 以下面的格式添加:
//普通组件两种状态需要判断
if ( !isNeedLocationModule.toBoolean() ) {
implementation project(':location')
}
//基本组件
implementation project(':common')
// 下面两个属于arouter(路由器)依赖
implementation ('com.alibaba:arouter-api:1.4.1')
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
三. arouter使用
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() ]
}
}