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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 组件化路由组件 ( 路由组件结构 )相关的知识,希望对你有一定的参考价值。





一、路由组件原理



在之前博客 【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 ) 的组件化项目中 , 可能涉及到跨 Module 的调用 , 如在 library1 模块中打开 library2 模块中的 Activity 界面 , 或调用其它 Module 中的功能 ;

这就需要 library1 Module 中依赖 library2 Module , 但是如果 在 library2 中还要使用 library1 中的功能 , 就无法引用 library1 了 , 否则就会造成循环引用 , 编译直接报错 ;


方法 1 1 1 : 可以选择使用 隐式 Intent , 在清单文件中 , 为组件设置 action 等意图过滤器 ;

方法 2 2 2 : 这里介绍一种更好的架构方式 , 引入 " 路由模块 " , 所有的 Library Module 依赖库模块 和 Application Module 壳应用 都依赖 " 路由模块 " ;

借助 " 路由模块 " , 可以 使用一个路由地址 , 随意调用任意 Module 中的任意功能 , 如 : 跳转到其它 Module 的 Activity 页面 ;


1 1 1 个 Activity 中如果要使用路由模块 , 先初始化路由模块 , 如果需要页面跳转时 , 传入 " 路由地址 ", 跳转到对应界面 , " 路由地址 " 是在对应的 Activity 类上使用注解设定的 ;


在 " 路由模块 " 中 , 维护了多个分组 , 每个分组维护一张 路由表 , 其中 包含了需要调用的 Activity , Service 等组件信息 , 每个组件都有一个路由地址与之对应 , 路由地址通过类注解进行设置 ;

分组的个数可以根据项目需求进行分割 , 如果项目特别大 , 产生的路由表就很大 , 每次调用都要加载整个路由表 , 通过分组拆分需要管理的路由表 , 可以根据具体的需求 , 选择对应的路由表进行加载 ;





二、路由组件基本组成



路由模块 实现时 , 需要使用注解 , 通过注解 , 生成对应 Java 类文件 , 该 Java 文件就是对应的 路由表 ;

这种涉及注解以及生成 Java 文件的功能 , 一般分为 3 3 3 个模块进行实现 ;

  • 模块 1 1 1 : 自定义注解模块 , 在该模块下包含所有自定义注解 ; ( Java 工程 )
  • 模块 2 2 2 : 注解处理器模块 , 用于生成 Java 类文件模块 ; ( Java 工程 )
  • 模块 3 3 3 : 项目中引用的依赖库模块 , android 的 Library Module 依赖库 , 供其它 Android Module 调用的接口 ; ( Android Library 工程 )

ButterKnife , Dagger2 , EventBus 等注解框架 , 都是用到了编译时技术 APT ;





三、自定义注解模块



" 自定义注解模块 " 是 Java 工程 ;

在 自定义注解模块 中 , 自定义了注解 , 自定义注解需要传入一个 字符串 路由路径 , 用于 标识一个 Android 中的组件类 ;

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'

添加 自定义注解模块 依赖库 :

implementation project(':router-annotation')

完整 build.gradle 示配置例 :

plugins {
    id 'java-library'
    id 'kotlin'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'com.google.auto.service:auto-service:1.0-rc2'

    implementation project(':router-annotation')
}

下一篇博客 , 讲解注解处理器的开发 ;





五、博客资源



博客源码 :

以上是关于Android 组件化路由组件 ( 路由组件结构 )的主要内容,如果未能解决你的问题,请参考以下文章

Android 组件化路由组件 ( 路由框架概述 )

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

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

Android 组件化路由组件 ( 运行时获取 注解处理器 生成的路由表 )

Android 组件化路由组件 ( 运行时获取 注解处理器 生成的路由表 )

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