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 不用反射,性能更好。
相关推荐
沐言人生2 小时前
ReactNative 源码分析9——Native View初始化
android·react native
程序员陆业聪3 小时前
当AI学会了混淆代码:LLM辅助混淆 vs R8,Android安全的下一个十字路口
android
yubin12855709233 小时前
mysql正则函数REGEXP
android·数据库·mysql
我命由我123453 小时前
Android Framework P2 - 开机启动 Zygote 进程、Zygote 的预加载机制
android·java·开发语言·python·java-ee·intellij-idea·zygote
我命由我123453 小时前
Android Framework P1 - 低配学习 Framework 方案、开机启动 Init 进程
android·c语言·c++·学习·android jetpack·android-studio·android runtime
aqi004 小时前
FFmpeg开发笔记(一百零二)国产的音视频移动开源工具FFmpegAndroid
android·ffmpeg·kotlin·音视频·直播·流媒体
星间都市山脉4 小时前
Android 谷歌 CTS 完整测试
android
nianniannnn4 小时前
快应用day2项目架构
android·快应用
用户83352502537855 小时前
ViewModel详细解析
android