Android——组件化实战:Application启动时用ARouter实现跨模块调用

Application启动时用ARouter实现跨模块调用

在Android组件化开发中,模块间解耦是核心,而ARouter是最常用的组件化路由框架。

很多新手会遇到一个问题:App启动时,Application需要调用其他模块的功能,但组件化后模块不能直接依赖,这时候就需要用ARouter做跨模块调用。

这篇文章用最简单的方式,教你在Application初始化时,通过ARouter获取其他模块的服务并调用。

一、先搞懂核心概念

  1. ARouter服务发现 :不依赖具体类,只依赖接口,通过接口获取其他模块的实现类。

  2. Application启动调用 :App刚打开,还没进入页面,就在onCreate()里调用其他模块的方法。

  3. 核心代码

    Kotlin 复制代码
    ICameraTime mICameraTime = ARouter.getInstance().navigation(ICameraTime.class);

    这行代码就是通过ARouter,跨模块拿到接口的实现对象

二、使用场景

假设你的项目分为3个组件:

  • app(宿主模块,只有Application)

  • camera(相机模块,实现时间获取功能)

  • base(基础模块,存放公共接口)

需求:App启动时,app模块的Application,调用camera模块的时间获取方法

三、一步一步实现(超简单)

1. 基础配置(先把ARouter引入项目)

  1. 项目根目录build.gradle添加:

    Kotlin 复制代码
    android { 
    defaultConfig {
     javaCompileOptions { 
    annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } 
    } 
    } 
    }
     dependencies { 
    // ARouter核心
     implementation 'com.alibaba:arouter-api:1.5.2' 
    annotationProcessor 'com.alibaba:arouter-compiler:1.5.2'
     }
  2. 所有模块都要添加以上配置。

2. 定义公共接口(放在base模块)

所有组件都依赖base模块,接口放在这里,实现类放在对应模块

创建ICameraTime.java

Kotlin 复制代码
/** * 相机模块的时间服务接口 * 定义方法,让其他模块调用 */ 
public interface ICameraTime extend IProvider { 
    // 获取相机时间 
    long getCameraTime(); 
    // 初始化相机时间 
    void initCameraTime(); 
}

3. 其他模块实现接口(camera模块)

在相机模块,实现ICameraTime接口,并用ARouter注解标记

Kotlin 复制代码
import com.alibaba.android.arouter.facade.annotation.Route; 
// 关键:path必须唯一,标记这是ARouter的服务实现类
@Route(path = "/camera/ICameraTime") 
public class CameraTimeImpl implements ICameraTime { 
    @Override public long getCameraTime() { 
        // 相机模块自己的逻辑 
        return System.currentTimeMillis(); 
    } 
    @Override public void initCameraTime() {
     // 初始化相机时间 
    // 这里可以写相机模块的初始化代码 
    }
}

✅ 关键点:@Route注解,让ARouter能找到这个实现类。

4. Application中跨模块调用(核心步骤)

app模块的MyApplication中:

  1. 初始化ARouter

  2. 用一行代码获取服务

  3. 调用方法

复制代码
Kotlin 复制代码
import com.alibaba.android.arouter.launcher.ARouter; 
public class MyApplication extends Application { 
    @Override public void onCreate() { 
        super.onCreate(); 
        // 1. 初始化ARouter 
        if (BuildConfig.DEBUG) { 
            ARouter.openLog(); 
            ARouter.openDebug(); 
        } 
        ARouter.init(this); 
        // 2. 核心代码:跨模块获取接口实现类 
        ICameraTime mICameraTime = ARouter.getInstance().navigation(ICameraTime.class); 
        // 3. 调用其他模块的方法 
        if (mICameraTime != null) { 
        // 调用初始化方法 mICameraTime.initCameraTime(); 
        // 调用获取时间方法 
        long time = mICameraTime.getCameraTime(); Log.e("ARouter", "相机时间:" + time); 
} } }

四、为什么这么写?(通俗解释)

  1. 接口下沉 :公共接口放在base模块,所有模块都能看到。

  2. 实现隐藏:具体功能写在业务模块,不对外暴露。

  3. ARouter搭桥

    Kotlin 复制代码
    ARouter.getInstance().navigation(ICameraTime.class)
  4. 相当于: ARouter,帮我找一下ICameraTime接口的实现类,给我返回一个对象。

  5. 无依赖调用app模块不需要依赖camera模块,完全解耦。

五、注意事项(避坑)

  1. 空判断 :调用前一定要判断mICameraTime != null,防止模块未加载导致空指针。

  2. 初始化顺序 :必须先ARouter.init(this),再获取服务。

  3. 注解不要忘 :实现类必须加@Route注解,否则ARouter找不到。

  4. 模块独立:每个模块都要配置ARouter的注解处理器。

  5. ICameraTime需要继承IProvider; 并且接口ICameraTime不要写到object里面

六、总结

Android组件化中,Application启动时跨模块调用,用ARouter只需要3步:

  1. base模块定义接口

  2. 业务模块实现接口+@Route

  3. Application中用navigation(接口.class)获取对象调用

核心代码就一行:

Kotlin 复制代码
ICameraTime mICameraTime = ARouter.getInstance().navigation(ICameraTime.class);

完美实现组件化解耦,Application轻松调用其他模块功能!


总结

  1. 核心原理 :基于接口+ARouter服务发现,实现无依赖跨模块调用

  2. 核心代码ARouter.getInstance().navigation(接口.class) 获取实现类对象

  3. 适用场景:Application初始化、全局配置、模块预加载等跨模块操作

  4. 优势:模块完全解耦,不写冗余依赖,代码更简洁

相关推荐
发现一只大呆瓜3 小时前
深度解密 Rollup 插件开发:核心钩子函数全生命周期图鉴
前端·vite
我学上瘾了3 小时前
Spring Cloud的前世今生
后端·spring·spring cloud
java_nn4 小时前
一文了解前端技术
前端
发现一只大呆瓜4 小时前
深度解析 Rollup 配置与 Vite 生产构建流程
前端·vite
小码哥_常5 小时前
安卓黑科技:让手机成为你的“跌倒保镖”
前端
小李子呢02115 小时前
前端八股Vue---Vue2和Vue3的区别,set up的用法
前端·javascript·vue.js
m0_647057965 小时前
Harness Engineering 实践指南
前端
JJay.6 小时前
Android BLE 稳定连接的关键,不是扫描,而是 GATT 操作队列
android·服务器·前端
一 乐6 小时前
电影院|基于springboot + vue电影院购票管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·电影院购票管理管理系统
星空椰6 小时前
JavaScript 进阶基础:函数、作用域与常用技巧总结
开发语言·前端·javascript