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的

<?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更多的功能和用法还在学习中…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值