本文只说明在一个具有多个module的Android项目中使用ARouter进行页面跳转(本次测试了Activity之间跳转)时遇到如题报错的解决方式,文中涉及到了ARouter的最基本的使用方式,但是不会涉及到ARouter的高级使用方式,具体的可以参考ARouter在GitHub上的使用说明https://github.com/alibaba/ARouter或者其他的博客。而且本文中提到的出错原因可能是最常见的,说"最常见"的意思是可能还有其他的很多不同原因会导致这样的报错,用本文的方式无法解决,如果确实这样,就需要各位再探索其他的答案了,下面开始说正题。
本文说了一大堆,实际上总结起来就三句话,知道这三句总结是怎么回事的话,完全不用看下文了,不明白的时候就看看下文的举例。
1.多个module之间互相跳转,每个module中都要进行同样的配置。也就是都引入ARouter的两个库以及都在各自的build.gradle文件中进行如下配置(这是使用Java开发的情况,使用kotlin的话还得翻到下边去看):
android {
defaultConfig {
......
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
当然,ARouter的初始化也要做,只在应用入口处(比如Application类中)调用一次就行了。
2.不同的module不要使用相同的第一级路由名称,这样的话只能打开第一个使用该一级路由的activity,其他的就打不开了(需要看源码分析原因)。从第二级开始可以一样,但是最好第二级...以至后面的多级都不一样。比如下面两幅图,这是在两个不同的module中的Activity,其中画框的部分的a和b是各自的第一级目录,如果你这里的一级目录名称一样,那么很可能就会造成如题的问题。
3.千万不要Java和kotlin混着用。千万不要Java和kotlin混着用。千万不要Java和kotlin混着用。使用ARouter从Java写的Activity跳转到kotlin写的Activity,或者是倒过来,都不行...(目前的个人经历)而且如果纯kotlin,那在build.gradle的配置也要用kotlin的方式,看文章最后边的说明。
行了,如果上面看完了还不懂,就接着看下边的例子吧。
图1.
如上图1.这个项目中总共有四个module,其中三个是library的形式,另外一个是普通的可运行的应用(application)。这四个module的依赖关系是a_lib和b_lib依赖于baselibrary,而app依赖于a_lib和b_lib,而且在a_lib和b_lib中依赖baselibrary使用的是api的方式,不是implementation/compile(过时),也就是说app间接的依赖了baselibrary。如下图a_lib中依赖baselibrary的举例:
图2.
使用api的依赖方式一般的应该都知道什么意思,就是说它所依赖的module也可以被"继承"到其他的module中,具体到本文中就是说app依赖了a_lib这个module,而a_lib以api方式依赖的其他第三方库之类的都可以被app"继承"依赖,也叫“间接”依赖。
开始说ARouter在这几个module之间的使用方式,本文主要针对使用Java和kotlin两种情况去说,差别不大:
一. 在Java中:
如果配置部分不想看,直接跳过就行。
首先,肯定是先引入ARouter这个开源库以及完成人家要求的配置,主要就是涉及到
implementation 'com.alibaba:arouter-api:?'
annotationProcessor 'com.alibaba:arouter-compiler:?'
这两个库,具体的版本在GitHub上看一下,自己替换了问号?部分就行。
其次,在build.gradle文件的android{...}进行如下配置:
图3.
最后,是初始化ARouter,官方建议这个初始化的操作尽早做,那就是Application中最合适了,如下图:
图4.
图中除了ARouter.init(...)的调用就是两个openXxx的方法了,个人感觉这在调试的时候很有必要,这样才能看到日志中是否成功的使用ARouter做页面跳转了,通过在logicat中过滤关键字ARouter就能看到相关的日志。
OK,配置方式就这么三步,GitHub上都有说明,这里又重复一次。但是注意的是上边的a_lib,b_lib,baselibrary以及app中都要进行同样的配置才行,要不然无法进行module间的跳转,只能进行module内的跳转。
(ps:其实单纯对我这个例子来说,因为baselibrary中添加了com.alibaba:arouter-api:xxx,而且是以api的方式引用的,所以其他直接依赖或间接依赖它的module来说,都不用单独引用这个库了,但是另外一个注解库都需要使用,因为那个不同"继承").
这样,就解释完了最开始的第一句总结,那第二句和第三句总结已经很明白了,这里就不说了,下边说使用Kotlin的方式,整体流程一样,主要区别就是java和kotlin使用的注解解释器不同了。
2.在Kotlin中主要两点不同:
2.1 第一点不同是引入com.alibaba:arouter-compiler:xxx这个库时,不能再用Java中的注解解释器,也就是不能用annotationProcessor了,要用kapt,也就是下图这样:
图5.
这是kotlin中解释注解的插件,所以还需要引入这个插件才行,如下图:
图6.
2.2 第二点不同就是图3中的配置,要改成下边这样的:
图7.
然后,就没了......