【Android 组件化】路由组件 ( 生成 Root 类记录模块中的路由表 )(一)

简介: 【Android 组件化】路由组件 ( 生成 Root 类记录模块中的路由表 )(一)

文章目录

一、Root 表作用

二、生成 Root 表

三、完整注解处理器代码 及 生成的 Java 代码 ( 仅供参考 )

1、注解处理器代码

2、app 模块中的注解类生成的 Java 源码

3、library2 模块中的注解类生成的 Java 源码

四、博客资源



组件化系列博客 :


【Android 组件化】从模块化到组件化

【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )

【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )

【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )

【Android 组件化】路由组件 ( 路由组件结构 )

【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )

【Android 组件化】路由组件 ( 注解处理器中使用 JavaPoet 生成代码 )

【Android 组件化】路由组件 ( 注解处理器参数选项设置 )

【Android 组件化】路由组件 ( 构造路由表中的路由信息 )

【Android 组件化】路由组件 ( 使用 JavaPoet 生成路由表类 )

【Android 组件化】路由组件 ( 组件间共享的服务 )





一、Root 表作用


注解处理器 为每个 Module 模块生成一个路由表 , 该模块下凡是被 @Route 标注的路由节点都在该路由表中维护 ;


package kim.hsl.router;
import java.lang.Override;
import java.lang.String;
import java.util.Map;
import kim.hsl.library2.StringService;
import kim.hsl.route_core.template.IRouteGroup;
import kim.hsl.router_annotation.model.RouteBean;
public class Router_Group_library2 implements IRouteGroup {
  @Override
  public void loadInto(Map<String, RouteBean> atlas) {
    atlas.put("library2", new RouteBean(RouteBean.Type.ISERVICE, StringService.class, "/library2/StringService", "library2"));
  }
}


模块名称是 app , 则路由表的名称是 Router_Group_app.java ;


一个模块中的路由表可能有多个 , 需要为若干路由表再生成一个 Root 表, 用于作为路由表的导航 ;


image.png


生成的 Root 表样式 : 其中 “app” 是组名 , Router_Group_app.class 是 app 组对应的路由表类 ;


package kim.hsl.router;
import java.lang.Class;
import java.lang.Override;
import java.lang.String;
import java.util.Map;
import kim.hsl.route_core.template.IRouteGroup;
import kim.hsl.route_core.template.IRouteRoot;
public class Router_Root_app implements IRouteRoot {
  @Override
  public void loadInto(Map<String, Class<? extends IRouteGroup>> routes) {
    routes.put("app", Router_Group_app.class);
  }
}





二、生成 Root 表


定义 IRouteRoot 接口 , 所有的 Root 类都实现该接口 , 该接口定义在 route-core 模块中 ;


package kim.hsl.route_core.template;
import java.util.Map;
public interface IRouteRoot {
    void loadInto(Map<String, Class<? extends IRouteGroup>> routes);
}


IRoot 接口定义位置 :

image.png


首先 , 获取 IRouteGroup 和 IRouteRoot 接口的节点 ;


// 获取 kim.hsl.route_core.template.IRouteGroup 类节点
TypeElement iRouteGroup = mElementUtils.getTypeElement("kim.hsl.route_core.template.IRouteGroup");
// 获取 kim.hsl.route_core.template.IRouteRoot 类节点
TypeElement iRouteRoot = mElementUtils.getTypeElement("kim.hsl.route_core.template.IRouteRoot");



其次 , 生成 loadInto 函数的参数 Map<String, Class<? extends IRouteGroup>> routes ;


// 生成参数类型名称
// Map<String,Class<? extends IRouteGroup>> routes>
ParameterizedTypeName routesTypeName = ParameterizedTypeName.get(
        ClassName.get(Map.class),
        ClassName.get(String.class),
        ParameterizedTypeName.get(
                ClassName.get(Class.class),
                WildcardTypeName.subtypeOf(ClassName.get(iRouteGroup))
        )
);
// 生成参数
// Map<String,Class<? extends IRouteGroup>> routes> routes
ParameterSpec rootParameterSpec = ParameterSpec.builder(routesTypeName, "routes")
        .build();



再次 , 生成函数及函数体 ;


// 生成函数
// public void loadInfo(Map<String,Class<? extends IRouteGroup>> routes> routes)
MethodSpec.Builder loadIntoMethodBuilder = MethodSpec.methodBuilder("loadInto")
        .addAnnotation(Override.class)
        .addModifiers(Modifier.PUBLIC)
        .addParameter(rootParameterSpec);
// 生成函数体
for (Map.Entry<String, String> entry : mRootMap.entrySet()) {
    loadIntoMethodBuilder.addStatement(
            "routes.put($S, $T.class)",
            entry.getKey(),
            ClassName.get("kim.hsl.router", entry.getValue())
    );
}



最后 , 生成 Router_Root_app 类 , 并写出到文件中 ;


// 生成 Root 类
String rootClassName = "Router_Root_" + mModuleName;
// 创建 Java 类
TypeSpec typeSpec = TypeSpec.classBuilder(rootClassName)
        .addSuperinterface(ClassName.get(iRouteRoot))
        .addModifiers(PUBLIC)
        .addMethod(loadIntoMethodBuilder.build())
        .build();
// 生成 Java 源文件
JavaFile javaFile = JavaFile.builder("kim.hsl.router", typeSpec).build();
// 写出到文件中
try {
    javaFile.writeTo(mFiler);
} catch (IOException e) {
    e.printStackTrace();
}


目录
相关文章
|
2月前
|
设计模式 Android开发
[Android 四大组件] --- BroadcastReceiver
[Android 四大组件] --- BroadcastReceiver
33 0
|
3月前
|
Android开发 开发者
什么是Android Jetpack,它包括哪些组件?
什么是Android Jetpack,它包括哪些组件?
39 0
|
2月前
|
XML Java API
安卓逆向 -- Xposed模块编写
安卓逆向 -- Xposed模块编写
16 0
|
2月前
|
数据可视化 Android开发
[Android 四大组件] --- Service
[Android 四大组件] --- Service
24 0
|
2月前
|
Android开发
[Android 四大组件] --- Activity
[Android 四大组件] --- Activity
22 1
|
2月前
|
存储 数据库 Android开发
安卓四大组件是什么?
安卓四大组件是什么?
|
3月前
|
数据库 Android开发 开发者
Android基础知识:什么是Android应用的四大组件?
Android基础知识:什么是Android应用的四大组件?
59 1
|
4月前
|
XML 安全 Java
Android Studio App开发之广播组件Broadcast的讲解及实战(包括收发标准、有序、静态广播实现手机震动功能 附源码)
Android Studio App开发之广播组件Broadcast的讲解及实战(包括收发标准、有序、静态广播实现手机震动功能 附源码)
35 0
|
9月前
|
存储 设计模式 ARouter
现代化 Android 开发:组件化与模块化的抉择
本文为现代化 Android 开发系列文章第四篇。
210 0
|
Java API 开发工具
【Android 组件化】从模块化到组件化
【Android 组件化】从模块化到组件化
95 0