Arouter

作者: 咚咚_Coding | 来源:发表于2021-08-30 19:43 被阅读0次
官网

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里

得到路由表,注册的是分组信息,将其加入仓库中

image.png

Root映射表

image.png
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

相关文章

网友评论

      本文标题:Arouter

      本文链接:https://www.haomeiwen.com/subject/frqoiltx.html