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 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui