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

2023-03-29 12:31:57 浏览数 (2)

文章目录

  • 一、路由组件原理
  • 二、路由组件基本组成
  • 三、自定义注解模块
  • 四、注解处理器模块
  • 五、博客资源

一、路由组件原理


在之前博客 【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 默认为 "" , 不是必须的 , 可以省略 ;

代码语言:javascript复制
@Route(path = "library1")

四、注解处理器模块


" 注解处理器模块 " 是 Java 工程 ;

注解处理器模块 负责处理自定义注解 , 需要 自定义 AbstractProcessor 子类 , 该类就是 注解处理器 ;

注解处理器负责生成 Java 代码 , 但是注解处理器本身的代码是不会打包到 APK 中的 ;

注解处理器注册的时候自动执行 , 即 执行注解处理器中的 process 函数 ;

注解处理器首选要进行注册 , 可以使用 Google 提供的自动注册工具 , 在注解处理器类上使用 @AutoService(Processor.class) 注解即可进行自动注册 ;

代码语言:javascript复制
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 依赖库 ;

代码语言:javascript复制
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

0 人点赞