一、简介
ARouter 是阿里巴巴开源的一款 Android 路由框架,主要用于简化模块化开发中的页面导航、组件间通信以及动态加载等问题,它可以帮助开发者在多模块项目中更方便地实现页面跳转和数据传递,同时支持许多高级功能,比如动态降级、拦截器和 URI 映射等。以下是 ARouter 的一些主要特点:(很多功能我暂时也还没用过,后面会慢慢更新)
ARouter 的主要功能
-
页面跳转
使用 URL 或路径标识页面,支持参数传递,简化页面间导航。 -
跨模块通信
在多模块项目中,无需直接依赖,通过路径即可完成模块间交互。 -
支持多种调用方式
- 使用路径字符串进行跳转。
- 使用URI(支持深度链接)。
-
参数传递
支持基本类型、对象类型(通过@Autowired
注解)以及自定义序列化方式。 -
拦截器
可用于实现跳转过程中的统一处理,例如登录校验、埋点统计等。 -
动态降级
在目标页面不可达时,通过降级策略处理跳转。 -
插件支持
提供 Gradle 插件,方便生成路由表,提升效率。 -
高性能
使用 apt(注解处理器)生成路由表,在编译期处理,运行时性能极高。
二、ARouter 的基本使用
1. 配置依赖
dependencies {
implementation("com.alibaba:arouter-api:x.x.x")
kapt("com.alibaba:arouter-compiler:x.x.x")
}
同时在模块的 build.gradle 文件中启用 kapt:
apply plugin: 'kotlin-kapt'
2.初始化 ARouter
在 Kotlin 中可以在自定义的 Application 类中完成 ARouter 的初始化:
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
ARouter.openLog() // 开启日志
ARouter.openDebug() // 开启调试模式(必须在 init 之前调用)
}
ARouter.init(this) // 初始化 ARouter
}
}
在项目中是这样的:
注意:确保在 AndroidManifest.xml 中声明自定义的 Application
3. 配置目标页面
为目标页面添加@Route注解,并定义路径:
@Route(path = RouteConfig.PERSONAL_SWITCH_PHONE_ACT)
@AndroidEntryPoint
class SwitchPhoneAct: BaseActWithCutOut<PersonalActSwitchPhoneBinding>() {
……
}
路径定义:
const val PERSONAL_SWITCH_PHONE_ACT = "/personal/SwitchPhoneAct"
4. 页面跳转
(1)只跳转页面
直接跳转到目标页面:
ARouter.getInstance()
.build(Route2Config.PERSONAL_SWITCH_PHONE_ACT)
.navigation()
注意:
1、也可以不单独定义路径文件,像下面一样build直接传递路径
2、navigation()中不传递参数代表只需要跳转到目标页面,navigation()中传递参数见情况3:获取返回结果
(2)跳转页面并传递参数
通过 withXxx() 方法传递参数:
ARouter.getInstance()
.build("/example/activity")
.withString("userId", "12345") // 传递参数
.navigation()
(3)获取返回结果
如果需要跳转到目标页面,获取在目标页面执行某些操作的执行结果,就在navigation中传递请求码,然后在目标页面返回执行结果即可(下面有介绍)
ARouter.getInstance()
.build("/example/activity")
.navigation(this, REQUEST_CODE) // 跳转时传递请求码
在原页面的onActivityResult 中接收结果:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
// 处理返回结果
}
}
5.在目标页面向原页面传递参数:
(1)调用setResult方法:
setResult(RESULT_OK)
//或者
setResult(RESULT_CANCELED)
finish()
调用setResult方法,并传入
1、RESULT_OK作为参数代表目标页面操作完成,
2、RESULT_CANCELED表示操作未完成(被取消)
(2)通过Intent传递额外数据
setResult(RESULT_OK, Intent().apply {
putExtra("resultKey", "Result from ExampleActivity")
})
finish() // 结束页面