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. 优势:模块完全解耦,不写冗余依赖,代码更简洁

相关推荐
程序员阿峰1 小时前
前端3D·Three.js一学就会系列: 第一个3D网站
前端·three.js
旺仔小拳头..1 小时前
请求对象HttpServletRequest与响应对象HttpServletResponse
java
野犬寒鸦2 小时前
从零起步学习AI大模型应用开发 || 第三章:智能体项目实战中的问题与解决方案及思路详解
java·服务器·数据库·人工智能·后端·面试
久绊A2 小时前
服务器磁盘只读/故障排
java·linux·服务器
没有bug.的程序员2 小时前
Spring Boot 与 MyBatis-Plus 批量插入的生死狙击
java·spring boot·后端·mybatis·plus·批量插入
马猴烧酒.2 小时前
【Java复习|Lambda表达式】Java Lambda 表达式、函数式接口与匿名内部类:从起源到原理
java·开发语言·ide·笔记·python·spring
DLGXY2 小时前
STM32(二十九)——读写、擦除FLASH
前端·stm32·嵌入式硬件
wenlonglanying2 小时前
springboot与springcloud对应版本
java·spring boot·spring cloud
慧一居士2 小时前
TanStack功能介绍和使用场景,对应 vue,react 完整使用示例
前端·vue.js