ARouter思考与总结

问题

  • 问题一:如何做好模块间进行通讯?
  • 问题二: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));
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值