还记得上一次分享的模块间通信和调用吗?Android 模块化之路 模块间通信 在这个文章里面,我们说到,如果涉及到跨进程,那我们可以用 AIDL 的方式来解决跨进程的问题。
但用户的一些质疑声也来了:
好吧,那就再介绍另外一种模块间通信的方式。
和前面提到的 AIDL 的方式一样,也是通过面向接口编程,子模块增加接口层,然后具体的实现不再通过AIDL来实现,而是通过最简单粗暴的Class.forName();
在 WEB 端开发,Spring 定义出 Service和 ServiceImpl,通过 XML 文件定义bean的实现。
我们在这里也采用同样的方式。
首页我们祭出我们的基类:
定义接口基类
上面的是一个接口类,所有模块接口声明都继续此接口。
比如我们定义 IShopcartService 接口代码如下:
购物车接口声明
可以看到上面就是最普通的 JAVA 写法,解决了 AIDL 的出参和入参要实现序列化麻烦的问题。
我们再来看一下具体的实现:
购物车接口的具体实现
然后就是怎么获取这个Service的实例了,调用代码如下:
购物车服务获取
那 Services 中的代码又是如何实现的呢?
原来是通过一个 Map 来维护的接口名和实现的映射关系,还加了个 LRU 缓存
讲到这里,基本这个小巧的设计实现和思路就完成了。
但还有两个问题需要解决:
raw的配置文件
源码地址:https://github.com/ssevening/AndroidAidlExample
看到上面的内容,然后肯定又要说了,擦,就这么简单?一点逼格也没有啊?怎么样增加一点逼格呢?这里给大家抛几个问题,也是几个方向,完成了这几个问题后,你的逼格也就上去了。
大家多想一想,然后把上面的问题解决了,一个高逼格的 模块间调用框架就出来了。
最后,提醒一下,上线前的混淆不要忘记 keep 所有 extends IJavaService 的类噢。
模块间通信扯到这里,基本上分为三个阶段:
作者 | 辰星 某知名互联网公司 技术专家