该框架仿照Arouter实现的,目的是学习Arouter框架。
框架的实现主要包括router_core、router_annotation和router_compiler三个部分。
- router_core:核心api,用来实现路由模块的跳转功能;
- router_annotation:自定义注解,用来声明需要路由的页面;
- router_compiler:处理注解,在编译时根据自定义注解生成注册路由表的Java类;
我们先来看看整体的框架图:
- APP:项目主工程或者是壳工程
- module1、module2:项目子工程
- base:是项目主工程、子module都需要依赖的基础模块
- router_core:存储各个module中声明过注解后,在项目编译期间生成的路由表信息
- router_annotation:注解模块,用来声明需要路由的页面
- router_compiler:注解处理器,为了拿到注解信息因此需要依赖各个模块,在编译期间根据各个模块声明的注解,利用javaPoet产生路由信息
整体流程大致如下图所示:
大致描述一下:
第一阶段 -- 涉及模块为module_annotation、module_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"));
}
}
第二阶段 -- 涉及模块 module_core:
看架构图中,所有模块都依赖了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进行跳转。
具体实现细节请看下一篇。