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 不用反射,性能更好。
相关推荐
AD钙奶-lalala3 小时前
Android Studio新建项目默认不使用Compose模版
android·ide·android studio
故渊at4 小时前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·系统架构·apk·打包·application·dalvik·android编译
故渊at5 小时前
第一板块:Android 系统基石与运行原理 | 第三篇:ART 与 Dalvik 运行时环境原理
android·对象模型·内存布局·运行原理·art·dalvik
私人珍藏库6 小时前
【Android】Wallcraft 3.62.0-最强4 K壁纸软件-解锁高级版
android·智能手机·app·工具·软件·多功能
GesLuck7 小时前
Node-RED企业微信发送—群文件
android·java·企业微信
whatever who cares7 小时前
android中fragment demo举例
android·java·开发语言
zhangphil7 小时前
Android将ImageView显示的图原样取出转换为Bitmap,Kotlin
android·kotlin
plainGeekDev7 小时前
CountDownTimer → Flow
android·java·kotlin
仙俊红7 小时前
如何优化 MySQL 深分页 SQL
android·sql·mysql
awu的Android笔记8 小时前
网络闪断 + DNS 故障:Android弱网模拟中最容易被忽视的两个场景
android·tcp/ip