文章目录
- 一、路由组件原理
- 二、路由组件基本组成
- 三、自定义注解模块
- 四、注解处理器模块
- 五、博客资源
一、路由组件原理
在之前博客 【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 ) 的组件化项目中 , 可能涉及到跨 Module 的调用 , 如在 library1 模块中打开 library2 模块中的 Activity 界面 , 或调用其它 Module 中的功能 ;
这就需要 library1 Module 中依赖 library2 Module , 但是如果 在 library2 中还要使用 library1 中的功能 , 就无法引用 library1 了 , 否则就会造成循环引用 , 编译直接报错 ;
方法 1 : 可以选择使用 隐式 Intent , 在清单文件中 , 为组件设置 action 等意图过滤器 ;
方法 2 : 这里介绍一种更好的架构方式 , 引入 " 路由模块 " , 所有的 Library Module 依赖库模块 和 Application Module 壳应用 都依赖 " 路由模块 " ;
借助 " 路由模块 " , 可以 使用一个路由地址 , 随意调用任意 Module 中的任意功能 , 如 : 跳转到其它 Module 的 Activity 页面 ;
在 1 个 Activity 中如果要使用路由模块 , 先初始化路由模块 , 如果需要页面跳转时 , 传入 " 路由地址 ", 跳转到对应界面 , " 路由地址 " 是在对应的 Activity 类上使用注解设定的 ;
在 " 路由模块 " 中 , 维护了多个分组 , 每个分组维护一张 路由表 , 其中 包含了需要调用的 Activity , Service 等组件信息 , 每个组件都有一个路由地址与之对应 , 路由地址通过类注解进行设置 ;
分组的个数可以根据项目需求进行分割 , 如果项目特别大 , 产生的路由表就很大 , 每次调用都要加载整个路由表 , 通过分组拆分需要管理的路由表 , 可以根据具体的需求 , 选择对应的路由表进行加载 ;
二、路由组件基本组成
路由模块 实现时 , 需要使用注解 , 通过注解 , 生成对应 Java 类文件 , 该 Java 文件就是对应的 路由表 ;
这种涉及注解以及生成 Java 文件的功能 , 一般分为 3 个模块进行实现 ;
- 模块 1 : 自定义注解模块 , 在该模块下包含所有自定义注解 ; ( Java 工程 )
- 模块 2 : 注解处理器模块 , 用于生成 Java 类文件模块 ; ( Java 工程 )
- 模块 3 : 项目中引用的依赖库模块 , Android 的 Library Module 依赖库 , 供其它 Android Module 调用的接口 ; ( Android Library 工程 )
ButterKnife , Dagger2 , EventBus 等注解框架 , 都是用到了编译时技术 APT ;
三、自定义注解模块
" 自定义注解模块 " 是 Java 工程 ;
在 自定义注解模块 中 , 自定义了注解 , 自定义注解需要传入一个 字符串 路由路径 , 用于 标识一个 Android 中的组件类 ;
代码语言:javascript复制package kim.hsl.router_annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
public @interface Route {
/**
* 路由路径, 标识一个路由节点
* 该字段没有默认值, 必须设置
* @return
*/
String path();
/**
* 路由分组, 默认为空, 选择性设置
* 路由节点可以按照分组进行加载
* @return
*/
String group() default "";
}
使用注解时 , 需要在类上添加如下注解 , 必须在注解中指定 path 对应的值 path = "library1"
, 否则编译报错 ; 注解中的 group 默认为 ""
, 不是必须的 , 可以省略 ;
@Route(path = "library1")
四、注解处理器模块
" 注解处理器模块 " 是 Java 工程 ;
注解处理器模块 负责处理自定义注解 , 需要 自定义 AbstractProcessor 子类 , 该类就是 注解处理器 ;
注解处理器负责生成 Java 代码 , 但是注解处理器本身的代码是不会打包到 APK 中的 ;
注解处理器注册的时候自动执行 , 即 执行注解处理器中的 process 函数 ;
注解处理器首选要进行注册 , 可以使用 Google 提供的自动注册工具 , 在注解处理器类上使用 @AutoService(Processor.class)
注解即可进行自动注册 ;
package kim.hsl.router_compiler;
import com.google.auto.service.AutoService;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Processor;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.element.TypeElement;
// 自动注册注解处理器
@AutoService(Processor.class)
public class RouterProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
return false;
}
}
添加 com.google.auto.service:auto-service
依赖库 ;
implementation 'com.google.auto.service:auto-service:1.0-rc2'
添加 自定义注解模块 依赖库 :
代码语言:javascript复制implementation project(':router-annotation')
完整 build.gradle 示配置例 :
代码语言:javascript复制plugins {
id 'java-library'
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(path: ':router-annotation')
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc4'
compileOnly 'com.google.auto.service:auto-service:1.0-rc4'
}
注册 Google 服务后的效果 :
下一篇博客 , 讲解注解处理器的开发 ;
五、博客资源
博客源码 :
- GitHub : https://github.com/han1202012/Component