最近在对项目进行重构,模块化的拆分是必须的。由于是pad项目,本身Activity用到的次数较少,大多是fragment之间的跳转,ARouter不能做很好的支持,并且处于对项目安装包瘦身的考虑,决定自定义一个简单的路由组件,用于支持Activity和Fragment的切换。
开发一个自定义注解和把大象装进冰箱一样只有三步:
1、实现在一个有参(path)的编译时注解IActivity
2、实现一个在编译时把被注解标识的类和和参数path做映射的类IActivityCompiler
3、实现一个跨模块跳转的工具方法RouterHelper
下面是具体的实现:
1 在项目中创建两个类型为Java Library的module(注意,类型一定要是Java Library)lib_annotation和lib_compiler。
在lib_annotation中创建IActivity类:

在lib_compiler的build.gradle修改依赖:

implementation 'com.squareup:javapoet:1.8.0' //一款可以自动生成Java文件的第三方依赖
implementation 'com.google.auto.service:auto-service:1.0-rc2' //自动在META-INF文件夹下生成Processor配置信息文件
implementation project(':lib_annotation')
并边写一个将注解生成映射文件的类IActivityCompiler

将这两个module在app项目中进行引入:

并在任意一个Actiivty类上进行注解:

此时Rebuild的工程,将会在目录app/build/generated/source/apt/debug/com.common.base.router/下,创建一个名为Activity_Router_Mapper的映射文件(并没有...问题解决方案请参考“Java/kotlin混开,自定义注解的坑”)。

这个类里面实现了注解里面的参数和Activity路径的映射。
经过一番研究,解决了无法生成映射文件的问题,接下来就创建项目的公共Android Library,实现RouterHelper:

只需要这些简单的代码,Router库就实现了,只是在获取Activity的时候,也是通过反射实现的,这里还有继续优化的空间,有空继续优化。
网友评论