Aroute作用:
- Android Module组件化 之间的跳转 ,App Module跟自定义Module之间通过ARount可以进行友好的跳转
- 包含了Intent的所有功能
- 跳转带基类也是需要序列化的
Aroute官网:可以自己去查看最新的库,或者是用Java的还是用Kotlin的
战前准备:这里使用Kotlin版
//在app build中添加kapt插件
apply plugin: 'kotlin-kapt'
//Arouter
implementation 'com.alibaba:arouter-api:1.5.0'
kapt 'com.alibaba:arouter-compiler:1.2.2' //kotlin
//annotationProcessor 'com.alibaba:arouter-compiler:1.2.2' //java
一、创建自定义Application - 在AndroidManifest.xml 中引入,初始化Aroute
//创建自定义Applicaiton 名字随便
class App : Application() {
override fun onCreate() {
super.onCreate()
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(this); // 尽可能早,推荐在Application中初始化
}
fun isDebug(): Boolean {
return applicationContext.getApplicationInfo() != null && applicationContext.getApplicationInfo().flags and ApplicationInfo.FLAG_DEBUGGABLE !== 0
}
}
引入
二、自定义Aroute配置文件,所有路由的配置,建议吧这个文件放到module中,所有项目module都能引用
注意:
- 不同module名字必须不同-除非你只有一个App模块
- Activity的路径必须两级以上:
- 错误如:/circleDesc
- 正确如:/ucircle/circleDesc
class ARouterConstants {
companion object {
//APP模块--不同module名字必须不同-除非你只有一个App模块
const val AppGROUP = "/ucircle/"
//自定义联系人模块--不同module名字必须不同-除非你只有一个App模块
const val Contanct = "/contact/"
//主页
const val HOMEPAGE = AppGROUP + "homepage"
//详情--路径必须两级以上
错误如:/circleDesc
正确如:/ucircle/circleDesc
const val CIRCLEEDESC = AppGROUP + "circleDesc"
}
}
三、在Activity中添加路由,这里以主页为例
@Route(path = ARouterConstants.HOMEPAGE)
四、跳转
app模块内跳转跟两个模块之间跳转没有区别
1、跳转界面不带参
发起界面
// 1. 普通跳转
ARouter.getInstance().build("/test/activity").navigation();
或者
// 1. 普通跳转-使用自己的配置文件 AouterConstants
ARouter.getInstance().build(ARouterConstants.HOMEPAGE).navigation();
或者Fragment跳转
// 1. 普通跳转-使用自己的配置文件 AouterConstants
ARouter.getInstance().build(ARouterConstants.HOMEPAGE).navigation(this);
目标界面-之后的目标界面都是一样的就不写了
2、带参数的跳转
ARouter.getInstance().build("/test/1")
.withLong("key1", 666L)
.withString("key2", "888")
.withSerializable("key3", new Test("Jack", "Rose"))
.navigation();
或者
// Fragment 跳转 需要加
ARouter.getInstance().build("/test/1")
.withLong("key1", 666L)
.withString("key2", "888")
.withSerializable("key3", new Test("Jack", "Rose"))
.navigation(this);
3、带动画的跳转
//没有配置的跳转
ARouter.getInstance().build(“/test/activity”)
.withTransition(R.anim.translate_out, R.anim.translate_in)
.navigation()
或者
//带左右动画的跳转 使用自己的配置文件 AouterConstants
ARouter.getInstance().build(ARouterConstants.HOMEPAGE)
.withTransition(R.anim.translate_out, R.anim.translate_in)
.navigation()
或者Fragment跳转
//带左右动画的跳转 使用自己的配置文件 AouterConstants
ARouter.getInstance().build(ARouterConstants.HOMEPAGE)
.withTransition(R.anim.translate_out, R.anim.translate_in)
.navigation(this)
4、带转场动画的跳转
ARouter.getInstance().build(ARouterConstants.ABOUTCIRCLE) .withOptionsCompat(
ActivityOptionsCompat.makeSceneTransitionAnimation(mContext as Activity, view, sharedElementName)”)
.navigation(mContext)
传参的接收端使用:
并且在onCreate中加入:ARouter.getInstance().inject(this);
在app的Build中添加
// ARouter
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
注:多个Module之间跳转直接跳转就行了,但是module之间的名字必须不一样
//APP模块--不同module名字必须不同-除非你只有一个App模块
const val AppGROUP = "/ucircle/"
//自定义联系人模块--不同module名字必须不同-除非你只有一个App模块
const val AppGROUP = "/contact/"