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

举报
韩曙亮 发表于 2022/01/11 01:15:47 2022/01/11
【摘要】 文章目录 一、路由组件原理二、路由组件基本组成三、自定义注解模块四、注解处理器模块五、博客资源 一、路由组件原理 在之前博客 【Android 组件化】使用 Gra...





一、路由组件原理



在之前博客 【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 "";
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

使用注解时 , 需要在类上添加如下注解 , 必须在注解中指定 path 对应的值 path = "library1" , 否则编译报错 ; 注解中的 group 默认为 "" , 不是必须的 , 可以省略 ;

@Route(path = "library1")

  
 
  • 1




四、注解处理器模块



" 注解处理器模块 " 是 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;
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

添加 com.google.auto.service:auto-service 依赖库 ;

implementation 'com.google.auto.service:auto-service:1.0-rc2'

  
 
  • 1

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

implementation project(':router-annotation')

  
 
  • 1

完整 build.gradle 示配置例 :

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'
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

注册 Google 服务后的效果 :

在这里插入图片描述


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





五、博客资源



博客源码 :

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/116867134

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。