ARouter 的使用:

一、先配置(必须做)

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 注解处理器是什么?(重点)

  1. 全称:Annotation Processing Tool 注解处理器
  2. 运行时机:编译时期,不是运行时
  3. 作用 你写 @ARouter(path = "/path/main") 注解APT 在编译代码时,自动帮你生成路由注册表、路径对应 Activity / 类映射文件
  4. 没有 APT → 注解无效,路由表生成不了,跳转直接失败

2、通俗理解

以前: 路由跳转要手动写路径对应 Activity

现在: 加注解 + APT编译自动帮你把所有路由地址全部收集整理好,运行时直接通过路径找页面

3、ARouter 使用流程(面试口述)

  1. 项目引入ARouter依赖+APT注解处理器`
  2. 全局初始化 ARouter.init()
  3. Activity / 页面上加 @Route(path = "/app/main")
  4. APT 编译自动生成路由映射表
  5. 跳转:ARouter.getInstance().build("/app/main").navigation()
  6. 支持传参、拦截器、分组全部依赖生成好的路由表

4、ARouter 底层原理(核心必背)

答案

基于 APT 编译时注解处理 + 路由表映射 + 反射。

  1. 编译期:APT 扫描所有 @Route 注解,自动生成路由映射表(路径 → Activity / 服务);
  2. 初始化:加载所生成的路由表到内存;
  3. 采用分组懒加载,用到哪个组才加载哪个路由表,优化启动速度和内存;
  4. 跳转时:根据传入路径匹配路由表,通过反射实例化目标页面,完成跳转;
  5. 拦截流程:跳转前按优先级执行全局拦截器,可做登录、权限、埋点拦截;

5、为什么一定要配置 APT?

  • 不加 APT:注解不生效,编译不生成路由类
  • 运行找不到路由地址,直接跳转失败
  • APT 是 ARouter 核心核心,靠它实现注解自动化路由

6、APT 和反射区别?

  • APT:编译期生成代码,效率高,无性能损耗
  • 反射:运行时扫描,慢、耗性能ARouter 用 APT 不用反射,性能更好。
相关推荐
齊家治國平天下5 小时前
Android 14 Vehicle HAL (VHAL) 设计与实现深度解析
android·aaos·carservice·车载开发·android 14·vhal·vehicle hal
AFinalStone10 小时前
Android 7系统网络(八)应用API层—ConnectivityManager使用与实战调试
android·网络
plainGeekDev11 小时前
kapt 替换为 KSP
android·java·kotlin
蜡台11 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
阿pin14 小时前
Android随笔-SharedPreferences
android·sp
阿pin15 小时前
Android随笔-DataStore
android·datastore
茶栀(*´I`*)16 小时前
Android 测试入门指南:ADB 基础配置与常用设备管理命令解析
android·adb
ihuyigui17 小时前
海外酒店预订短信接口
android·java·运维·服务器·前端·后端·架构
gxgldyh18 小时前
Android Framework源码解析(七):BootAnimation 启动流程解析——开机动画是如何显示出来的?
android
达达尼昂18 小时前
在 Claude Cowork 中用好 Claude Fable 5
android·人工智能·后端