ARouter讲解3_RouteProcessor,10年Android开发经验

本文详细解析了ARouter中RouteProcessor的角色,它负责收集被@Route注解的Activity、Fragment、Service和IProvider类,并生成相应的加载方法。通过对类中@Autowired注解字段的收集,构建RouteMeta信息,根据group对RouteMeta进行分类,最终生成对应的RouteGroup类,实现了动态路由的初始化和管理。
摘要由CSDN通过智能技术生成

// 因为Activity 或者 Fragment 是可以传递参数的,getIntent()、getArguments(),就收集该类中被 Autowired 注解的字段
// Activity or Fragment
if (types.isSubtype(tm, type_Activity) || types.isSubtype(tm, fragmentTm) || types.isSubtype(tm, fragmentTmV4)) {
// 当前的类是 Activity 或 Fragment

// Get all fields annotation by @Autowired
// paramsType 与 injectConfig 用来生成文档的,不用关心
Map<String, Integer> paramsType = new HashMap<>();
Map<String, Autowired> injectConfig = new HashMap<>();
//收集类中的被Autowired注解的字段,但字段不能是IProvider类型
injectParamCollector(element, paramsType, injectConfig);

if (types.isSubtype(tm, type_Activity)) {
// Activity
routeMeta = new RouteMeta(route, element, RouteType.ACTIVITY, paramsType);
} else {
// Fragment
routeMeta = new RouteMeta(route, element, RouteType.parse(FRAGMENT), paramsType);
}

routeMeta.setInjectConfig(injectConfig);
} else if (types.isSubtype(tm, iProvider)) { // IProvider
routeMeta = new RouteMeta(route, element, RouteType.PROVIDER, null);
} else if (types.isSubtype(tm, type_Service)) { // Service
routeMeta = new RouteMeta(route, element, RouteType.parse(SERVICE), null);
} else {
throw new RuntimeException(“The @Route is marked on unsupported class, look at [” + tm.toString() + “].”);
}
// 收集具有相同的group的RouteMeta到 Map<String, Set>
categories(routeMeta);
}

// 生成 loadInto 方法
// public void loadInto(Map<Integer, Class<? extends IInterceptor>> interceptors)
MethodSpec.Builder loadIntoMethodOfProviderBuilder = MethodSpec.methodBuilder(METHOD_LOAD_INTO)
.addAnnotation(Override.class)
.addModifiers(PUBLIC)
.addParameter(providerParam
Spec);

// Start generate java source, structure is divided into upper and lower levels, used for demand initialization.
for (Map.Entry<String, Set> entry : groupMap.entrySet()) {

String groupName = entry.getKey();

//public void loadInto(Map<String, RouteMeta> atlas)
MethodSpec.Builder loadIntoMethodOfGroupBuilder = MethodSpec.methodBuilder(METHOD_LOAD_INTO)
.addAnnotation(Override.class)
.addModifiers(PUBLIC)
.addParameter(groupParamSpec);

// Build group method body
Set groupData = entry.getValue();
for (RouteMeta routeMeta : groupData) {

// 这个ClassName就是被Route注解的类名
ClassName className = ClassName.get((TypeElement) routeMeta.getRawType());

//这是给 IProvider 的类型做了一次特殊服务

switch (routeMeta.getType()) {
case PROVIDER: // Need cache provider’s super class
// 注意 routeMeta 返回的是RouteType类型,比如 PROVIDER类型,就是说element是 IProvider 的子类。
// 获取这个TypeElement的直接父接口
// 比如我们一般定义XXXServiceImpl, XXXService ,然后XXXService接口继承自IProvider
List<? extends TypeMirror> interfaces = ((TypeElement) routeMeta.getRawType()).getInterfaces();
// 遍历这个父接口
for (TypeMirror tm : interfaces) {

if (types.isSameType(tm, iProvider)) { // Its implements iProvider interface himself.
// This interface extend the IProvider, so it can be used for mark provider
// 该element是 IProvider的直接子类

// 就会生成类似 providers.put(“com.alibaba.android.arouter.demo.module1.testservice.SingleService”,
// RouteMeta.build(RouteType.PROVIDER, SingleService.class, “/yourservicegroupname/single”, // “yourservicegroupname”, null, -1, -2147483648));
loadIntoMethodOfProviderBuilder.addStatement(
“providers.put($S,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值