官网
https://github.com/alibaba/ARouter
arouter掘金
路由arouter原理
原理 注解apt和javapoet
流程:
在代码里加入的@Route注解,会在编译时期通过apt生成一些存储path和activityClass映射关系的类文件,然后app进程启动的时候会拿到这些类文件,把保存这些映射关系的数据读到内存里(保存在map里),然后在进行路由跳转的时候,通过build()方法传入要到达页面的路由地址,ARouter会通过它自己存储的路由表找到路由地址对应的Activity.class(activity.class = map.get(path)),然后new Intent(),当调用ARouter的withString()方法它的内部会调用intent.putExtra(String name, String value),调用navigation()方法,它的内部会调用startActivity(intent)进行跳转,这样便可以实现两个相互没有依赖的module顺利的启动对方的Activity了。
AbstractProcessor process方法
项目编译期会执行RouterProcessor的process()方法
AutoService工具可以通过添加注解来为RouterProcessor指定它需要的配置
两Map
两个map,一个保存group列表,一个保存group下的路由地址和activityClass关系)保存了路由地址和ActivityClass的映射关系
Map<String, Class<? extends IRouteGroup>> routes
Map<String, RouteMeta> atlas
atlas.put("/show/info",RouteMeta.build(RouteMeta.Type.ACTIVITY,ShowActivity.class,"/show/info","show"));
得到实现IRouteRoot接口的所有类文件,便能通过循环调用它的loadInfo()方法得到所有实现IRouteGroup接口的类,而所有实现IRouteGroup接口的类里面保存了项目的所有路由信息。IRouteGroup的loadInfo()方法,通过传入一个map,便会将这个分组里的映射信息存入map里
得到路由表,注册的是分组信息,将其加入仓库中

Root映射表

Root映射表[ show : class com.xsm.easyrouter.routes.EaseRouter_Group_show]
Root映射表[ main : class com.xsm.easyrouter.routes.EaseRouter_Group_main]
Root映射表[ module1 : class com.xsm.easyrouter.routes.EaseRouter_Group_module1]
Root映射表[ module2 : class com.xsm.easyrouter.routes.EaseRouter_Group_module2]
容器Warehouse存放路由映射关系
public class Warehouse {
// root 映射表 保存分组信息
static Map<String, Class<? extends IRouteGroup>> groupsIndex = new HashMap<>();
// group 映射表 保存组中的所有数据
static Map<String, RouteMeta> routes = new HashMap<>();
// group 映射表 保存组中的所有数据
static Map<Class, IService> services = new HashMap<>();
// TestServiceImpl.class , TestServiceImpl 没有再反射
More
https://github.com/Xiasm/EasyRouter
网友评论