ARouter作为项目组件化的一个非常重要的工具,实现了很大的解耦
原理:
简单调用
@Route(path = "/test/activity1", name = "测试用 Activity")
public class Test1Activity extends AppCompatActivity {
path = "/test/activity1" 代理了两部分: group: test , path:/test/activity1
代码中通过 RouteMeta 这个类与path 作为映射关系
1 关于module的注册:
Arouter通过在编译器,扫描需要注册的类,如上面的Test1Activity ,然后生成相应的注册代码
如下代码是Arouter编译器生成的:
/**
* DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */
public class ARouter$$Group$$module implements IRouteGroup {
@Override
public void loadInto(Map<String, RouteMeta> atlas) {
atlas.put("/module/1", RouteMeta.build(RouteType.ACTIVITY, TestModuleActivity.class, "/module/1", "module", null, -1, -2147483648));
}
}
关注module的自动注册,ARouter通过asm 代码注入的方式,在编译期向LogisticsCenter.java的loadRouterMap 方法注入代码
如下:
private static void loadRouterMap() {
registerByPlugin = false;
//auto generate register code by gradle plugin: arouter-auto-register
// looks like below:
// registerRouteRoot(new ARouter..Root..modulejava());
// registerRouteRoot(new ARouter..Root..modulekotlin());
}
在ARouter初始化时,将需要的module进行注册
以上就是ARouter的注册逻辑,可以看出ARouter在编译期做了很多的生气,包括module的自动注入 ,Activity的自动注入等
2 调用逻辑:
先猜想一下如何调用:
1) 调用方传入参数以及对应的url
2) 处理逻辑找对对应的被调用发
3) 启动activity或者拿到fragment或者IProvider的实现者
ARouter.getInstance()
.build("/kotlin/test")
.withString("name", "老王")
.withInt("age", 23)
.navigation();
这段代码就是启动activity的逻辑 ,最终的处理逻辑如下:
// 寻找目标 _Arouter.java
public synchronized static void completion(Postcard postcard) {
if (null == postcard) {
throw new NoRouteFoundException(TAG + "No postcard!");
}
RouteMeta routeMeta = Warehouse.routes.get(postcard.getPath());
if (null == routeMeta) { // Maybe its does't exist, or didn't load.
Class<? extends IRouteGroup> groupMeta = Warehouse.groupsIndex.get(po