arouter核心部分原理总结

180 阅读1分钟

@Router生成文件

1.ARouterGrouplogin:组文件

image.png 2.ARouterProviderlogin:参数传递 3.ARouterRootlogin:找到group

image.png

将信息封装到RouteMeta中,来进行跳转 image.png

ARouter(对外暴露的调用类)中init方法 1.对_ARouter(路由控制器,实际实现的类)进行初始化init,LogisticsCenter注册中心进行init 如果是新版本或者debug模式,则从apt生成的保存获取类,如果为空:通过SharedPreferences获取缓存指定包下的所有class文件,这样减少每次读取时间,存放在routemap中,判断所有类类型。使用反射实例化对象(生成类的类名集合) image.png 拿到所有生成类名的集合后,通过反射实例化对象并调用方法,将注解的一些元素添加到static集合groupIndex中: Warehouse:存放routemeta和其他信息,其中groupIndex是缓存获取根部组名 通过root直接put到对应分组上,然后直接使用group中的方法加载的方法获取分组的对应位置 image.png image.png

如果不同的module中存在相同的分组(即路径的第一段,如上面的“test”),则会在对应的module中生成不同的IRouteGroup的实现,然后在此处会执行分别执行routes.put("test", ARouter$$Group$$moduleA.class);,以及routes.put("test", ARouter$$Group$$moduleB.class);,但是因为key相同,因此前一个会被覆盖,导致前一个定义的路由无法找到。官方的建议是路径分组与模块名相同,并且不同模块不要使用相同的分组。