1.学习
这是一个学习的篇子…然后我只是把简单的学习放在这里。具体的这里都不分析…
2.众所周知
反正不懂就是众所周知.ARouter解决了组件化之间不依靠依赖就可以进行跳转。
根本原因是什么呢?
无论哪个模块的Activity最终都会打包到同一个apk内,从代码文件上来讲,这写Class文件都是互相可见的,这就需要添加第三方来让各自可见了.类似于中介的一个角色.
ARouter其实也是如此,利用了Map去保存下来了其中的Class。在startActivity再将其对象提取出来.只是其中过程有注册路由,提取路由.不同罢了.
3.拨开云雾见光明
如果不懂得本质是什么,只是看源码是真的痛苦…
先来一张时序图来折磨大家~
再来一张Warehouse的数据结构继续折磨大家.
class Warehouse {
// Cache route and metas
static Map<String, Class<? extends IRouteGroup>> groupsIndex = new HashMap<>();
static Map<String, RouteMeta> routes = new HashMap<>();
// Cache provider
static Map<Class, IProvider> providers = new HashMap<>();
static Map<String, RouteMeta> providersIndex = new HashMap<>();
// Cache interceptor
static Map<Integer, Class<? extends IInterceptor>> interceptorsIndex = new UniqueKeyTreeMap<>("More than one interceptors use same priority [%s]");
static List<IInterceptor> interceptors = new ArrayList<>();
static void clear() {
routes.clear();
groupsIndex.clear();
providers.clear();
providersIndex.clear();
interceptors.clear();
interceptorsIndex.clear();
}
}
大家先暂时不用管这两张图,但是这个数据结构是比较重要的入口
4.整体流程步骤
1.根据APT生成编译文件
在编译包下,我们可以很清楚的看到,由ARouter下,生成了三个不同的文件.
Group–>用于存储所有的路由组
Root->存储所有的路由
其它暂时不用管,以此看来Warehouse就是里面的路由文件的映射表
.
我们对Arouter有一个认知:我们的Class都要注册进入路由内,再提取出来进行startActivity.而Warehouse是我们的路由表
2.完成路由表的注册以及,加载内存
注册是看我们的ARouter.init()初始化.
可以看到,这里是将上面的ARouter开头的文件挑选出来,反射创建对象
。然后通过loadInto函数将分组信息载入到Warehouse.groupIndex内
public synchronized static void init(Context context, ThreadPoolExecutor tpe) throws HandlerException {
// 获取com.alibaba.android.arouter.routes下的所有class文件
routerMap = ClassUtils.getFileNameByPackageName(mContext, ROUTE_ROOT_PAKCAGE);
for (String className : routerMap) {
if (className.startsWith(ROUTE_ROOT_PAKCAGE + DOT + SDK_NAME + SEPARATOR + SUFFIX_ROOT)) {
// 将名为ARouter$$Root开头的Class对象创建出来,并调用loadInto(),将分组信息加载进Warehouse.groupsIndex中
((IRouteRoot) (Class.forName(className).getConstructor().newInstance())).loadInto(Warehouse.groupsIndex);
}
...
}
}
加载内存,则分析出它的跳转过程为如此
:
过程:
1、当传入path进行跳转时,优先从Warehouse.routes中直接获取路由对象;
2、路由对象不存在,就需要通过Warehouse.groupsIndex路由组来完成注册功能;
3、注册成功后,当前path所在组的所有路由都将存储到Warehouse.routes中;
4、回到第1步,获取路由对象;
5、读取路由对象信息;
6、完成跳转
所以最终,我们总结出ARouter的基本过程解析为:
1.使用Apt,将注解的文件成文ARouter$$相关文件。
2.init()初始化,将ARouter$$Group前缀文件涉及到的路由组存储到Warehouse.groupIndex内(其中有涉及到反射调用ARouter文件获取信息).
3.在跳转页面时,查询groupsIndex路由所在组,将路由组中所有的路由注册到Warehouse.routes中,从Warehouse.routes中取出路由信息,完成跳转.