Android路由框架——Arouter初步学习与搭建

前言

因为项目需要使用到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的




    

    


因此在login的minifest下面有一个声明作为launcher的activity



    
        
            
                
                
            
        
    


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文件



    
        
            
                
                
            
        
    


这是原有的manifest文件


    
        
        
    

对比可以发现单独运行调试需要有一个入口

在每个模块单独测试时把isModule设为true,最后设为false就可以合并测试了

总结

以上就是我初步学习使用Arouter的一些总结了,如果讲得不清楚可以到GitHub上参考我的Demo代码。关于Arouter更多的功能和用法还在学习中…

你可能感兴趣的:(Android路由框架——Arouter初步学习与搭建)