Application启动时用ARouter实现跨模块调用
在Android组件化开发中,模块间解耦是核心,而ARouter是最常用的组件化路由框架。
很多新手会遇到一个问题:App启动时,Application需要调用其他模块的功能,但组件化后模块不能直接依赖,这时候就需要用ARouter做跨模块调用。
这篇文章用最简单的方式,教你在Application初始化时,通过ARouter获取其他模块的服务并调用。
一、先搞懂核心概念
-
ARouter服务发现 :不依赖具体类,只依赖接口,通过接口获取其他模块的实现类。
-
Application启动调用 :App刚打开,还没进入页面,就在
onCreate()里调用其他模块的方法。 -
核心代码:
KotlinICameraTime mICameraTime = ARouter.getInstance().navigation(ICameraTime.class);这行代码就是通过ARouter,跨模块拿到接口的实现对象。
二、使用场景
假设你的项目分为3个组件:
-
app(宿主模块,只有Application) -
camera(相机模块,实现时间获取功能) -
base(基础模块,存放公共接口)
需求:App启动时,app模块的Application,调用camera模块的时间获取方法。
三、一步一步实现(超简单)
1. 基础配置(先把ARouter引入项目)
-
在项目根目录 的
build.gradle添加:Kotlinandroid { 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. 定义公共接口(放在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中:
-
初始化ARouter
-
用一行代码获取服务
-
调用方法
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);
} } }
四、为什么这么写?(通俗解释)
-
接口下沉 :公共接口放在
base模块,所有模块都能看到。 -
实现隐藏:具体功能写在业务模块,不对外暴露。
-
ARouter搭桥:
KotlinARouter.getInstance().navigation(ICameraTime.class) -
相当于: ARouter,帮我找一下
ICameraTime接口的实现类,给我返回一个对象。 -
无依赖调用 :
app模块不需要依赖camera模块,完全解耦。
五、注意事项(避坑)
-
空判断 :调用前一定要判断
mICameraTime != null,防止模块未加载导致空指针。 -
初始化顺序 :必须先
ARouter.init(this),再获取服务。 -
注解不要忘 :实现类必须加
@Route注解,否则ARouter找不到。 -
模块独立:每个模块都要配置ARouter的注解处理器。
-
ICameraTime需要继承IProvider; 并且接口ICameraTime不要写到object里面
六、总结
Android组件化中,Application启动时跨模块调用,用ARouter只需要3步:
-
base模块定义接口
-
业务模块实现接口+
@Route -
Application中用
navigation(接口.class)获取对象调用
核心代码就一行:
Kotlin
ICameraTime mICameraTime = ARouter.getInstance().navigation(ICameraTime.class);
完美实现组件化解耦,Application轻松调用其他模块功能!
总结
-
核心原理 :基于接口+ARouter服务发现,实现无依赖跨模块调用
-
核心代码 :
ARouter.getInstance().navigation(接口.class)获取实现类对象 -
适用场景:Application初始化、全局配置、模块预加载等跨模块操作
-
优势:模块完全解耦,不写冗余依赖,代码更简洁