一、先配置(必须做)
1. 项目根目录 build.gradle
gradle
rust
maven { url 'https://jitpack.io' }
2. module 的 build.gradle
gradle
javascript
plugins {
id 'kotlin-kapt' // 必须加
}
android {
defaultConfig {
//当前模块开启 APT 路由名
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
dependencies {
// 核心依赖
implementation 'com.alibaba:arouter-api:1.5.2'
// APT注解处理器 关键
kapt 'com.alibaba:arouter-compiler:1.5.2'
}
二、初始化(Application 里)
kotlin
kotlin
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
ARouter.openLog()
ARouter.openDebug()
}
ARouter.init(this)
}
}
三、基本使用(最核心 3 步)
1. 给 Activity 加注解
kotlin
kotlin
@Route(path = "/app/main")
class MainActivity : AppCompatActivity() {
}
2. 跳转页面
kotlin
scss
ARouter.getInstance().build("/app/main").navigation()
3. 携带参数跳转
kotlin
vbscript
ARouter.getInstance()
.build("/app/test")
.withString("name", "张三")
.withInt("age", 18)
.navigation()
4. 目标页面接收参数
kotlin
kotlin
@Route(path = "/app/test")
class TestActivity : AppCompatActivity() {
@JvmField
@Autowired(name = "name")
var userName: String = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ARouter.getInstance().inject(this) // 必须注入
}
}
四、面试常问的 4 个核心功能
1. 拦截器(跳转前做判断)
kotlin
kotlin
@Interceptor(priority = 1)
class LoginInterceptor : IInterceptor {
override fun process(postcard: Postcard, callback: InterceptorCallback) {
// 判断是否登录
callback.onContinue(postcard) // 放行
// callback.onInterrupt(null) // 拦截
}
}
2. 跳转失败降级
kotlin
kotlin
.navigation(this, object : NavigationCallback() {
override fun onLost(postcard: Postcard?) {
// 找不到页面
}
})
3. 服务发现(跨模块调用)
kotlin
kotlin
// 定义接口
interface ILoginService : IProvider {
fun isLogin(): Boolean
}
// 实现
@Route(path = "/service/login")
class LoginServiceImpl : ILoginService { }
// 使用
val service = ARouter.getInstance().build("/service/login").navigation() as ILoginService
4. 解析 Uri 跳转
kotlin
scss
ARouter.getInstance().build(uri).navigation()
五、APT注解处理器
1、 APT 注解处理器是什么?(重点)
- 全称:Annotation Processing Tool 注解处理器
- 运行时机:编译时期,不是运行时
- 作用 你写
@ARouter(path = "/path/main")注解APT 在编译代码时,自动帮你生成路由注册表、路径对应 Activity / 类映射文件 - 没有 APT → 注解无效,路由表生成不了,跳转直接失败
2、通俗理解
以前: 路由跳转要手动写路径对应 Activity
现在: 加注解 + APT编译自动帮你把所有路由地址全部收集整理好,运行时直接通过路径找页面
3、ARouter 使用流程(面试口述)
- 项目引入ARouter依赖+APT注解处理器`
- 全局初始化
ARouter.init() - Activity / 页面上加
@Route(path = "/app/main") - APT 编译自动生成路由映射表
- 跳转:
ARouter.getInstance().build("/app/main").navigation() - 支持传参、拦截器、分组全部依赖生成好的路由表
4、ARouter 底层原理(核心必背)
答案
基于 APT 编译时注解处理 + 路由表映射 + 反射。
- 编译期:APT 扫描所有
@Route注解,自动生成路由映射表(路径 → Activity / 服务); - 初始化:加载所生成的路由表到内存;
- 采用分组懒加载,用到哪个组才加载哪个路由表,优化启动速度和内存;
- 跳转时:根据传入路径匹配路由表,通过反射实例化目标页面,完成跳转;
- 拦截流程:跳转前按优先级执行全局拦截器,可做登录、权限、埋点拦截;
5、为什么一定要配置 APT?
- 不加 APT:注解不生效,编译不生成路由类
- 运行找不到路由地址,直接跳转失败
- APT 是 ARouter 核心核心,靠它实现注解自动化路由
6、APT 和反射区别?
- APT:编译期生成代码,效率高,无性能损耗
- 反射:运行时扫描,慢、耗性能ARouter 用 APT 不用反射,性能更好。