问题
- 问题一:如何做好模块间进行通讯?
- 问题二:ARouter既然可以统筹管理Activity、Fragment。那么如果当前Activity属于jar包或者aar中Activity。我们该如何对其进行管理?
总结
问题一:
做好模块间的通信,首先要做的事就是两个模块之间充分解耦,可是如何做到充分解耦呢?目前市面上大部分做法是:组件接口化。提供一个功能模块前,首先需要提供一组 api 出去。这组api的定义需要放在一个公共模块,或者一个单独的模块中。这种做法的好处就是方便卸载、安装。并且各模块间各司其职。
ARouter的做法是:
假设A调用B模块的invoke()方法。api在B-api中定义。
- 在B-api模块首先定义好,该模块需要暴露出去的接口(此接口需要继承 IProvider)。
- 在B模块中,先依赖B-api模块,实现API层定义好的接口。
- A模块依赖B模块和B-api模块,然后调用模块。使用IService = ARouter.getInstance().build(path).navigation(); IService .invoke();来实现对目标模块的调用。
问题二:
首先我们思考一下:
因为是对aar中的Acitivty进行路由,很可能此aar并没有使用ARouter,所以外面的模块想要使用path去访问它,似乎是不可能的。
想到这里,如果你的第一想法是通过IProvider来二次封装达到统筹管理的话。说明你对组件化的理解已经登堂入室了。使用此方法可以勉强解决此问题,但是如果Activity较多,我们可能需要使用很多的Provider来满足这些Activity,这可能是大家不想看到的。
其实撇开IProvider的概念,我们单纯使用ARouter的Activity方面的navigation(),其实也是可以满足的。我们知道ARouter所有的路由管理数据最后都会存放在 Warehouse.routes
的静态变量中,围绕这个变量,我总结出了三个方法。
- 方法一:在
com.alibaba.android.arouter.routes
包名下模拟创建一个IRouteGroup
的实现类。其中的loadInto
方法需要我们自己去实现。(创建在此包下的java文件,会被ARouter::init的时候加载进Warehouse.routes
中)。 - 方法二:我们可以在ARouter.init()之后反射此静态变量,将准备好的RouteMeta设置进去
- 方法三:上面两种都是因为ARouter未提供一个动态设置
RouteMeta
信息导致的,ARouter 1.5.2即将推出动态设置LogisticsCenter::addRouteGroupDynamic
方法来动态添加RouteGroup方法(此方法调用在init之后即可)
使用方法如下:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
if (BuildConfig.DEBUG) {
ARouter.openLog();
ARouter.openDebug();
}
ARouter.init(this);
LogisticsCenter.addRouteGroupDynamic("main",new OtherRouteGroup());
}
}
public class OtherRouteGroup implements IRouteGroup {
@Override
public void loadInto(Map<String, RouteMeta> atlas) {
atlas.put("/main/main1", RouteMeta.build(RouteType.ACTIVITY, MainActivity.class, "/main/main1", "main", null, -1, -2147483648));
}
}