作者:小马快跑
我们知道在使用ARouter时,需要在build.config里配置:
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
并且知道annotationProcessor用来声明注解解析器,arouter-compiler用来解析ARouter中的各个注解并自动生成class类,那么我们就来看一下到底生成了哪些类:

其生成的5个索引文件有4大类(Group类有2个文件,按Group区分开了),他们都实现了ARouter中的接口:

至于他们都代表什么,我们后面一一分析。
ARouter初始化
在自定义Application中进行初始化:
// 尽可能早,推荐在Application中初始化
ARouter.init(Application.this);
点进去看一下:
//ARouter.java
public static void init(Application application) {
if (!hasInit) {
logger = _ARouter.logger;
_ARouter.logger.info(Consts.TAG, "ARouter init start.");
hasInit = _ARouter.init(application);
if (hasInit) {
_ARouter.afterInit();
}
_ARouter.logger.info(Consts.TAG, "ARouter init over.");
}
}
哦,ARouter又调用了_ARouter.init(application)去初始化,再点进去:
//_ARouter.java
private volatile static ThreadPoolExecutor executor = DefaultPoolExecutor.getInstance();
protected static synchronized boolean init(Application application) {
mContext = application;
LogisticsCenter.init(mContext, executor);
logger.info(Consts.TAG, "ARouter init success!");
hasInit = true;
mHandler = new Handler(Looper.getMainLooper());
return true;
}
哦,_ARouter在init初始化方法里除了初始化一些变量和一个handler,又调用了LogisticsCenter.init(mContext, executor), 其中executor是一个线程池, 继续跟到LogisticsCenter里去:
/**
* LogisticsCenter contains all of the map.
* 1\. Creates instance when it is first used.
* 2\. Handler Multi-Module relationship map(*)
* 3\. Complex logic to solve duplicate group definition
*/
//LogisticsCenter.java
public synchronized static void init(Context context, ThreadPoolExecutor tpe) throws HandlerException {
Set<String> routerMap;
//1、遍历“com.alibaba.android.arouter.routes”路径下的类并把其加入到set中
if (ARouter.debuggable() || PackageUtils.isNewVersion(context)) {
// These class was generated by arouter-compiler.
routerMap = ClassUtils.getFileNameByPackageName(mContext, ROUTE_ROOT_PAKCAGE);
if (!routerMap.isEmpty()) {
context.getSharedPreferences(AROUTER_SP_CACHE_KEY, Context.MODE_PRIVATE).edit().putStringSet(AROUTER_SP_KEY_MAP, routerMap).apply();
}
// Save new version name when router map update finishes.
PackageUtils.updateVersion(context);
} else {
logger.info(TAG, "Load router map from cache.");
routerMap = new HashSet<>(context.getSharedPreferences(AROUTER_SP_CACHE_KEY, Context.MODE_PRIVATE).getStringSet(AROUTER_SP_KEY_MAP, new HashSet<String>()));
}
//2、遍历set,将root、group、provider分类并填充到Warehouse路由表中
for (String className : routerMap) {
if (className.startsWith(ROUTE_ROOT_PAKCAGE + DOT + SDK_NAME + SEPARATOR + SUFFIX_ROOT)) {
// This one of root elements, load root.
((IRouteRoot) (Class.forName(className).getConstructor().newInstance

ARouter在Android应用中用于实现模块间的解耦和路由跳转。文章详细介绍了ARouter的初始化过程,包括在build.gradle中配置注解处理器,生成的5个索引文件的作用,以及在自定义Application中进行的初始化。在初始化阶段,ARouter会加载路由表并创建一个线程池。在跳转过程中,ARouter通过构建Postcard对象,预处理path或uri,然后通过navigation方法进行跳转,此过程可能涉及拦截器的处理。最后,ARouter通过Intent实现Activity的跳转,其他类型如Fragment、Provider等则通过反射创建实例。
最低0.47元/天 解锁文章
1591

被折叠的 条评论
为什么被折叠?



