前言
因为项目需要使用到Android组件化开发,因此学习了一下Arouter框架的使用,在Arouter搭建的过程中也遇到了很多坑,也查阅了很多相关博客才解决,因此想记录一下,有兴趣的小伙伴可以看一下我Github上的Demo。接下来是Arouter框架的搭建步骤
搭建步骤
Step 1
新建一个Android空项目后,在gradle.properties文件中增加一个变量
isModule=false
isModule是“集成开发模式”(false)和“组件开发模式”(true)的切换开关
Step2
创建module,我的Demo中有三个module,分别是libbase(依赖库)、login、main,然后再除了依赖库以外的module中的build.gradle文件头部添加
if (isModule.toBoolean()) {
apply plugin: 'com.android.application'
} else{
apply plugin: 'com.android.library'
}
Step3
接下来是app和module之间的一些依赖关系
libbase主要是负责第三方库的引用
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
api 'androidx.constraintlayout:constraintlayout:1.1.3'
api 'androidx.appcompat:appcompat:1.0.2'
//Arouter
api 'com.alibaba:arouter-api:1.5.0'
//Butterknife
api 'com.jakewharton:butterknife:10.2.1'
implementation只对当前module有效,要在其他module可用的话需使用api,而且对需要使用到的module则需要添加annotationProcessor
app:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
implementation project(':libbase')
if (!isModule.toBoolean()) {
implementation project(':main')
implementation project(':login')
}
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
Step4
官方建议我们在Application里面进行ARouter初始化,于是在libbase目录下创建BaseApplication文件:
public class BaseApplication extends Application {
public static BaseApplication instance;
private boolean isDebug = true;
@Override
public void onCreate() {
super.onCreate();
instance = this;
init();
}
private void init() {
if (isDebug) {
ARouter.openDebug();
ARouter.openLog();
}
ARouter.init(this);
}
@Override
public void onTerminate() {
super.onTerminate();
ARouter.getInstance().destroy();
}
}
Step5
App以login为入口
因为当前app的manifest文件是没有activity的
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.scnu.myroutertest">
<application
android:name="com.scnu.libbase.BaseApplication"
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">
</application>
</manifest>
因此在login的minifest下面有一个声明作为launcher的activity
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.scnu.login">
<application
android:theme="@style/AppTheme">
<activity android:name=".LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Step6
我们可以写一个常量文件来管理路径
/**
* 统一管理路径
* Created by ChenZehao
* on 2019/12/20
*/
public final class Constance {
public static final String ACTIVITY_URL_LOGIN = "/login/LoginActivity";
public static final String ACTIVITY_URL_MAIN = "/main/MainActivity";
}
注意
/login/LoginActivity和/main/MainActivity
这里路径包名不要重复,不要写成/app/LoginActivity和/app/MainActivity,否则会报错com.alibaba.android.arouter.routes.ARouter$$Group$$activity
Step7
module的交互
使用阿里的Arouter路由,在libbase中引用
api 'com.alibaba:arouter-api:1.5.0'
然后在各个module下面添加
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
然后在各个模块的build.gradle下的defaultConfig下添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [ AROUTER_MODULE_NAME : project.getName() ]
}
}
记住,在Arouter1.4.0以后这里要用AROUTER_MODULE_NAME而不是moduleName!而1.4.0以前则使用moduleName。
然后就是使用了,在当前Activity和目标Activity上方添加Route注解
@Route(path = Constance.ACTIVITY_URL_LOGIN)
public class LoginActivity extends BaseActivity
接下来是Activity的跳转
ARouter.getInstance().build(Constance.ACTIVITY_URL_MAIN).navigation();
Step8
关于Butterknife,我分享一下在组件化开发中要如何做才能正常使用
(1)首先需要在项目的build.gradle中添加
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.1'
(2)然后再各module的build.gradle头部引入插件
apply plugin: 'com.jakewharton.butterknife'
dependencies 中添加依赖
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
(3)注解使用的资源不能用R而是R2
(4)需要用到butterknife的module的build.gradle中要添加
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Step9
module在设置isModule=true之后就可以进行单独运行调试了,因此manifest也需要有两套
所以需要在每个module的main目录下新建一个module目录,并且存放一个AndroidManifest文件
这是module目录下的manifest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.scnu.main">
<application
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>
这是原有的manifest文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.scnu.main">
<application
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
</activity>
</application>
</manifest>
对比可以发现单独运行调试需要有一个入口
在每个模块单独测试时把isModule设为true,最后设为false就可以合并测试了
总结
以上就是我初步学习使用Arouter的一些总结了,如果讲得不清楚可以到GitHub上参考我的Demo代码。关于Arouter更多的功能和用法还在学习中…