从0到1实现一个Android路由系列文章

  • 从0到1实现一个Android路由(1)——初探路由
  • 从0到1实现一个Android路由(2)——URL解析器
  • 从0到1实现一个Android路由(3)——APT收集路由
  • 从0到1实现一个Android路由(4)——多模块的APT收集路由
  • 从0到1实现一个Android路由(5)——对Kotlin模块的支持
  • 从0到1实现一个Android路由(6)——拦截请求再跳转

在从0到1实现一个Android路由(3)——APT收集路由中,已经实现了在同一个module中收集路由,当引入了一个other_module时,发现并没有收集到这个信息,这是咋回事呢?以前需要怎么解决呢?这就是本篇文章的由来。

other_module模块

other_module其实很简单,就一个Activity,用@Path("/otherMoudleActivity")注解,其和app模块一样引用了compiler、annotation以及api模块。

这时在app里引入了other_module后,进行跳转,效果如下:

从上面可以看到启动other_module中的是成功了,但是原来启动app模块中的却失败了,这是咋回事呢?

这是因为初始化时,UrlCollectorImpl的Map只有一条"/otherModuleActivity"的记录,那app模块的信息怎么没收集到呢?

这是因为每个module都会有一个PathProcessor,而PathProcessor没有考虑对多module的区分,后面的module收集到的信息就会覆盖前面的module,这就是为什么只能看到other_module的信息。

解决多module的APT收集路由

知道了原因之后,就好解决了。解决方案可以是区分每个module,给每个module生成自己的map,然后init()方法中把每个module对应类的map组合到一起,就可以了。

区分多module

参考添加注解处理器,在other_module中加入参数标识module_name,修改build.gradle如下:

android {    defaultConfig {        javaCompileOptions {            annotationProcessorOptions {                arguments = ["module_name":"OtherModule"]            }        }    }}

可以看到添加了一个module_name的key,value为OtherModule。

修改PathProcessor

得到外部传入的参数

可以在init()方法中通过ProcessEnvironment.getOptions()获取到外部设置的参数,取出其中的设置的value,代码如下:

private static final String MODULE_NAME_KEY = "module_name";    private Filer filer;    private String classNameSuffix;    @Override    public synchronized void init(ProcessingEnvironment processingEnvironment) {        super.init(processingEnvironment);        filer = processingEnv.getFiler();        Map options = processingEnvironment.getOptions();        for (String key : options.keySet()) {            if (key.equals(MODULE_NAME_KEY)) {                classNameSuffix = options.get(key);                break;            }        }        if (classNameSuffix == null) {            classNameSuffix = "App";        }    }

process()根据不同Module生成不同实现类

process()的实现逻辑很简单,在UrlCollectorImpl的前面加上classNameSuffix即可。

执行assembleDebug后,可以在app模块下发现AppUrlCollectorImpl,在other_module模块下发现OtherModuleUrlCollectorImpl。
APT为每个module生成的类位于每个module自己的build目录下。

整合多个UrlCollector

当生成了多个UrlCollector后,那么剩下的问题就是将这些UrlCollector的map整合到一个大的map中,这里EasyRouter提供了可以addModule()的接口,调用addModule()将其他模块生成的加入到Map中即可。代码如下:

EasyRouter.getInstance().addModule(OtherModuleUrlCollectorImpl())

这样的话,就可以实现跨模块的跳转了。

总结

APT收集路由时需要注意每个module都会有一个Processor,因此需要进行区分,而区分是通过给java编译器增加参数来进行区分的,每个module生成了各自的路由表后,还需要进行表的整合,这样才能实现最终的跨模块跳转。

关于代码,可以参考github地址

参考

  • 添加注解处理器
  • AnnotationProcessorOptions

关注我的技术公众号,不定期会有技术文章推送,不敢说优质,但至少是我自己的学习心得。微信扫一扫下方二维码即可关注:

更多相关文章

  1. android指纹识别、拼图游戏、仿MIUI长截屏、bilibili最美创意等
  2. 从0到1实现一个Android路由(1)——初探路由
  3. android开发每日汇总【2011-11-26】
  4. Android(安卓)中启动自己另一个程序的activity如何实现
  5. [Android] Android(安卓)锁屏实现与总结 (一)
  6. Android音频开发(3):使用AudioRecord实现录音的暂停和恢复
  7. android 背景图片
  8. 【Android】【Framework】Android_Framework(1)各模块 划分
  9. android 杂疑汇总

随机推荐

  1. 一次StackOverflowError排查,原因竟然和Du
  2. 你的程序出现了bug?这几款JVM工具也许可以
  3. React Async Rendering
  4. React 16.3新API
  5. 第2年
  6. 我们到底该如何学习数据结构与算法
  7. 为你Springboot项目自定义一个通用的异常
  8. 看源码,我为什么推荐IDEA?
  9. Linux Kernel and Android(安卓)休眠与唤
  10. JDBC 性能小贴