Android组件化系列之手写组件路由架构篇(上)

该框架仿照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<String, RouteMeta> 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<String, RouteMeta> 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<String, RouteMeta> 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进行跳转。

具体实现细节请看下一篇。

发布了189 篇原创文章 · 获赞 81 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/103946923