该框架仿照Arouter实现的,目的是学习Arouter框架。
框架的实现主要包括router_core、router_annotation和router_compiler三个部分。
我们先来看看整体的框架图:
整体流程大致如下图所示:
大致描述一下:
主要是module_annotation、module_compiler利用各个module上添加的注解信息(@Route(path = "/main/test"))产生各个module之间跳转所需的路由信息。项目各个module都会依赖base和core模块,我们利用注解、注解处理器和JavaPoet来生产路由信息,这些路由信息是在需要跳转的类上面添加注解,并由注解处理器和javaPoet来产生路由信息,为了防止产生过多的路由信息加载到内存中,我们从图中左下角将所有路由信息根据不同的module进行分组,不同分组下存储不同的路由跳转信息。
产物如下:在两个需要跳转的module和APP目录下产生了各自的路由信息:
APP: module1: module2:
我们来看下所产生的APP下的路由分组代码:
public class DNRouter$$Group$$main implements IRouteGroup {
@Override
public void loadInto(Map atlas) {
atlas.put("/main/test", RouteMeta.build(RouteMeta.Type.ACTIVITY,SecondActivity.class, "/main/test", "main"));
atlas.put("/main/service1", RouteMeta.build(RouteMeta.Type.ISERVICE,TestServiceImpl1.class, "/main/service1", "main"));
atlas.put("/main/service2", RouteMeta.build(RouteMeta.Type.ISERVICE,TestServiceImpl2.class, "/main/service2", "main"));
}
}
module1下的路由分组代码:
public class DNRouter$$Group$$module1 implements IRouteGroup {
@Override
public void loadInto(Map atlas) {
atlas.put("/module1/test", RouteMeta.build(RouteMeta.Type.ACTIVITY,Module1Activity.class, "/module1/test", "module1"));
atlas.put("/module1/service", RouteMeta.build(RouteMeta.Type.ISERVICE,TestServiceImpl.class, "/module1/service", "module1"));
}
}
module2下产生的路由分组代码:
public class DNRouter$$Group$$module2 implements IRouteGroup {
@Override
public void loadInto(Map atlas) {
atlas.put("/module2/test", RouteMeta.build(RouteMeta.Type.ACTIVITY,Module2Activity.class, "/module2/test", "module2"));
atlas.put("/module2/service", RouteMeta.build(RouteMeta.Type.ISERVICE,TestServiceImpl.class, "/module2/service", "module2"));
}
}
看架构图中,所有模块都依赖了base和module_core,在Application中进行初始化,加载表信息类。在module_core中调用DNRouter.init(getApplication());会遍历所有的dex文件,查找第一阶段中javapoet生成的分组信息和表信息,完成后将路由分组信息加载到我们的路由分组表中,这个表在Warehouse中。
如果是activity需要跳转的话如下:
DNRouter.getInstance().build("/module2/test").withString("msg",
"从MainActivity").navigation();
会截取跳转的分组信息module2、以及跳转到的路由表信息Test页面,最终利用startActivity进行跳转。
具体实现细节请看下一篇。