没有合适的资源?快使用搜索试试~ 我知道了~
关于ARouter如何使用我们这里不做解释,主要针对两个问题1、初始化做了什么事;2、如何启动Activity或者Fragment的 1、初始化做了什么事 ARouter.init(this) 在使用ARouter时这句话是必须调用的。 protected static synchronized boolean init(Application application) { mContext = application; //这里是核心执行方法 LogisticsCenter.init(mContext, executor);
资源推荐
资源详情
资源评论





















面试必问框架之面试必问框架之ARouter源码解析源码解析
关于ARouter如何使用我们这里不做解释,主要针对两个问题1、初始化做了什么事;2、如何启动Activity或者Fragment的
1、初始化做了什么事、初始化做了什么事
ARouter.init(this) 在使用ARouter时这句话是必须调用的。
protected static synchronized boolean init(Application application) {
mContext = application;
//这里是核心执行方法
LogisticsCenter.init(mContext, executor);
logger.info(Consts.TAG, "ARouter init success!");
hasInit = true;
// It's not a good idea.
// if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
// application.registerActivityLifecycleCallbacks(new AutowiredLifecycleCallback());
// }
return true;
}
LogisticsCenter.init(mContext, executor) 具体做了些什么?
public synchronized static void init(Context context, ThreadPoolExecutor tpe) throws HandlerException {
mContext = context;
executor = tpe;
try {
long startInit = System.currentTimeMillis();
//billy.qi modified at 2017-12-06
//load by plugin first
loadRouterMap();
if (registerByPlugin) {
logger.info(TAG, "Load router map by arouter-auto-register plugin.");
} else {
Set routerMap;
// It will rebuild router map every times when debuggable.
//如果是debug或者新版本
if (ARouter.debuggable() || PackageUtils.isNewVersion(context)) {
logger.info(TAG, "Run with debug mode or new install, rebuild router map.");
// These class was generate by arouter-compiler.
// 注释 1 :这里是核心代码之一
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();
}
PackageUtils.updateVersion(context); // Save new version name when router map update finish.
} 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()));
}
logger.info(TAG, "Find router map finished, map size = " + routerMap.size() + ", cost " + (System.currentTimeMillis() - startInit) + "
ms.");
startInit = System.currentTimeMillis();
// 注释 2 核心代码
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())).loadInto(Warehouse.groupsIndex);
} else if (className.startsWith(ROUTE_ROOT_PAKCAGE + DOT + SDK_NAME + SEPARATOR + SUFFIX_INTERCEPTORS))
{
// Load interceptorMeta
((IInterceptorGroup) (Class.forName(className).getConstructor().newInstance())).loadInto(Warehouse.interceptorsIndex);
} else if (className.startsWith(ROUTE_ROOT_PAKCAGE + DOT + SDK_NAME + SEPARATOR + SUFFIX_PROVIDERS)) {
// Load providerIndex
((IProviderGroup) (Class.forName(className).getConstructor().newInstance())).loadInto(Warehouse.providersIndex);
}

}
}
}
}
注释1 代码调用了ClassUtils.getFileNameByPackageName(mContext, ROUTE_ROOT_PAKCAGE) 其中 ROUTE_ROOT_PAKCAGE 是一个固定的包
路径("com.alibaba.android.arouter.routes"),熟悉ARouter的就会了解,注解生成的类最后都是这个路径下的。
/**
* 通过指定包名,扫描包下面包含的所有的ClassName
*
* @param context U know
* @param packageName 包名
* @return 所有class的集合
*/
public static Set getFileNameByPackageName(Context context, final String packageName) throws PackageManager.NameNotFoundException, IOException,
InterruptedException {
final Set classNames = new HashSet();
List paths = getSourcePaths(context);
final CountDownLatch parserCtl = new CountDownLatch(paths.size());
for (final String path : paths) {
DefaultPoolExecutor.getInstance().execute(new Runnable() {
@Override
public void run() {
DexFile dexfile = null;
try {
if (path.endsWith(EXTRACTED_SUFFIX)) {
//NOT use new DexFile(path), because it will throw "permission error in /data/dalvik-cache"
dexfile = DexFile.loadDex(path, path + ".tmp", 0);
} else {
dexfile = new DexFile(path);
}
Enumeration dexEntries = dexfile.entries();
while (dexEntries.hasMoreElements()) {
String className = dexEntries.nextElement();
if (className.startsWith(packageName)) {
classNames.add(className);
}
}
} catch (Throwable ignore) {
Log.e("ARouter", "Scan map file in dex files made error.", ignore);
} finally {
if (null != dexfile) {
try {
dexfile.close();
} catch (Throwable ignore) {
}
}
parserCtl.countDown();
}
}
});
}
parserCtl.await();
return classNames;
}
这段代码目的很清楚扫描指定包路径下的所有类,然后放入到Map中如:
com.alibaba.android.arouter.routes.ARouter$$Group$$curve 、 com.alibaba.android.arouter.routes.ARouter$$Providers$$curve
、com.alibaba.android.arouter.routes.ARouter$$Root$$curve
得到每个module里面的/build/generated/source/apt/debug/com/alibaba/android/arouter/routes 下的所有class文件。
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())).loadInto(Warehouse.groupsIndex);
} else if (className.startsWith(ROUTE_ROOT_PAKCAGE + DOT + SDK_NAME + SEPARATOR + SUFFIX_INTERCEPTORS)) {
剩余6页未读,继续阅读
资源评论


weixin_38667920
- 粉丝: 3
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 手把手教你开发一个实用的URL编码/解码工具
- 和豆包的对话_0824.docx
- 基于S7-200 PLC的双容液位串级控制系统:前馈与反馈机制详解及应用
- 基于PLC的牡丹花种植温湿度自动化控制系统设计与实现
- 基于 PyTorch 框架开发的目标检测数据增强工具包
- 【嵌入式系统】基于STM32L051C8T6的CH9434A驱动程序设计:SPI转串口芯片CH9434操作接口实现与应用
- 开源手机云控系统框架:PHP+Autojs,适合二次开发,支持ws+http通信协议 - Autojs
- 伺服电机步进电机丝杆螺距圈数和位置关系的计算
- 泵站设计计算:关键要素与水泵选型策略分析
- MATLAB实现卡尔曼滤波器:测量值与估计值的优化估计程序及其应用
- 对小汽车的目标进行检测与跟踪研究
- 密歇根大学PEM燃料电池系统模型详解:电堆与关键组件模型构建及搭建过程文件集 · 电堆模型
- MATLAB环境下一维时间序列信号改进多重同步压缩变换算法及其广泛应用 · MATLAB 完整版
- 借助 OpenCV 原生库实现目标检测与文本检测的方法
- 无人机VESC7500低压伺服Keil源码解析:多反馈信号与先进算法融合的学习资料
- 直流输电系统(HVDC)中7电平MMC结构的MATLAB仿真设计与主变流控制 - 模块化多电平转换器 深度版
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
