参考AppJoint 的 Github 主页:https://github.com/PrototypeZ/AppJoint
为了找这样的方法花了一两天的功夫,本来想找现成的直接用的,但是没有,最后就自己花心思研究了一下Github上的AppJoint,因为它里面用kotlin语言写了几个类,刚开始看到这个就跑了,因为感觉语言不对,看了也没用,最后实在没办法就认真看了一下,也写了个Demo测试了,转成我熟悉的Java类弄成功了,写此博客也是为了记录一下。
问题背景
在做项目的时候,公司有需求将其他模块的文字用语音读出来,但是语音模块集成在主工程里了,调用不到,我又不知道再怎么将语音模块拆分成单独的library模块,只好去找能调用主工程中方法的方法。
有如下模块:
app 模块是主工程模块, 而 module1 模块是 library 模块。如果 module1 模块想要调用 app 模块的功能,那么肯定需要存在一个接口,这个接口两个模块要都能访问到。所以这个接口存在的位置就只能是 app 模块和 module1 模块都依赖的公共模块。假设 router 为公共模块
配置AppJoint环境
- 在项目根目录的 build.gradle 文件中添加 AppJoint 插件依赖:
buildscript {
...
dependencies {
...
classpath 'io.github.prototypez:app-joint:1.6.1'
}
}
- 在 router 模块添加 AppJoint 依赖,然后在 App 模块和 module1 模块中引入这个 router 模块:
dependencies {
...
api "io.github.prototypez:app-joint-core:1.6.1"
}
具体操作为第一步选中对应模块按快捷键 F4 如图:
第三步中选择 Module dependency 添加 router 模块后点 OK 。
- 在主 app 模块应用 AppJoint插件:
apply plugin: 'com.android.application'
apply plugin: 'app-joint'
问题解决
在公共模块 router 中创建一个接口:里面只写了一个方法(为了测试)
然后在 App 模块中写一个类去继承这个接口实现接口中的方法,这时候可以在方法中获取到其他类中的方法:
这是 MainActivity 中代码:
最后,我们可以在其他任何模块获得 AppService 接口的实例,调用里面的所有方法了:
AppService appService = AppJoint.service(AppService.class);
如 module1 模块中的调用:
就这样就是一个简单的演示了,更多的测试我也没继续研究,写得不好别喷 ~~