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 不用反射,性能更好。
相关推荐
limuyang26 小时前
PDF Viewer KMP(基于 chrome 的 PDFium 内核)
android·kotlin
心平气和量大福大9 小时前
android-控件-搜索框SearchView
android·gitee
2601_962177139 小时前
【MySQL篇】聚合查询,联合查询
android·java·mysql
壮哥_icon9 小时前
【Android】批量 VectorDrawable 动态分别修改 fillColor 和 strokeColor 的踩坑与终极解决方案
android
齐天qaq11 小时前
Android 系统 APK 分区与权限
android
心平气和量大福大11 小时前
android-控件-多选框CheckBox
android·gitee
pengyu13 小时前
【Kotlin 协程修仙录 · 大乘境 · 初阶】 | 跳出三界:协程在 KMP 与后端开发中的跨平台之道
android·kotlin
XiaoLeisj13 小时前
Android Memory Profiler:堆内存指标、内存抖动与泄漏定位
android·性能优化·内存抖动·内存泄露·memory profiler
未来猫咪花13 小时前
Everything is ViewModel:让状态管理回到对象世界
android·flutter·ios