Android 模块化之路 模块间调用简易实现方案

一、背景

还记得上一次分享的模块间通信和调用吗?Android 模块化之路 模块间通信 在这个文章里面,我们说到,如果涉及到跨进程,那我们可以用 AIDL 的方式来解决跨进程的问题。

但用户的一些质疑声也来了:

  • 我还是一个小 App,不用跨进程,我不是淘宝,不是微信,用 AIDL 太重了点吧?
  • AIDL 只支持基本类型的入参和出参,并且还是有点学习成本的,有没有简单一 点的方案呢?就是那种一点就透,一用就爽,一爽就开心的奇淫技巧?

好吧,那就再介绍另外一种模块间通信的方式。

二、迷你模块间调用

和前面提到的 AIDL 的方式一样,也是通过面向接口编程,子模块增加接口层,然后具体的实现不再通过AIDL来实现,而是通过最简单粗暴的Class.forName();

在 WEB 端开发,Spring 定义出 Service和 ServiceImpl,通过 XML 文件定义bean的实现。

我们在这里也采用同样的方式。

首页我们祭出我们的基类:

定义接口基类

上面的是一个接口类,所有模块接口声明都继续此接口。

比如我们定义 IShopcartService 接口代码如下:

购物车接口声明

可以看到上面就是最普通的 JAVA 写法,解决了 AIDL 的出参和入参要实现序列化麻烦的问题。

我们再来看一下具体的实现:

购物车接口的具体实现

然后就是怎么获取这个Service的实例了,调用代码如下:

购物车服务获取

那 Services 中的代码又是如何实现的呢?

原来是通过一个 Map 来维护的接口名和实现的映射关系,还加了个 LRU 缓存

讲到这里,基本这个小巧的设计实现和思路就完成了。

但还有两个问题需要解决:

  1. 实例什么时候初始化? App 启动时就直接实例化好还是用到的时候再newInstance呢? 上面的实现是放到用到的时候再初始化。
  2. 实例的映射关系存到哪里? 放到asset里面,还是自己读 xml文件,还是放到raw里面,弄一个properties文件呢?我这里的实现是读 RAW,大家可以自行改造。

raw的配置文件

源码地址:https://github.com/ssevening/AndroidAidlExample

三、我们再说进阶

看到上面的内容,然后肯定又要说了,擦,就这么简单?一点逼格也没有啊?怎么样增加一点逼格呢?这里给大家抛几个问题,也是几个方向,完成了这几个问题后,你的逼格也就上去了。

  • 要自己来维护接口和实现类的映射,有点 Low,考虑机器自动生成吧,那就是去看看运行时注解。
  • 写在raw中的文件,一是多模块化的话,只有在主工程中定义这个 RAW 文件,有没有办法放到子模块中定义呢?
  • 怎么样解决规则文件的批写错误呢?
  • 如果遇到获取服务失败,有没有及时发现和报警的功能?
  • 有没有能力做到 ABTest 动态替换呢?比如新发布一个实现类,让新类和旧类同时运行,但又可以在线上动态替换?
  • Service中怎样进行一些环境变量的区分或mock呢?比如 DEBUG 环境下打印日志?

大家多想一想,然后把上面的问题解决了,一个高逼格的 模块间调用框架就出来了。

最后,提醒一下,上线前的混淆不要忘记 keep 所有 extends IJavaService 的类噢。

四、一些总结

模块间通信扯到这里,基本上分为三个阶段:

  1. 创业型 App,自建 Map 来维护服务关系,最简单,也最稳定。
  2. 搞一些高科技,然后把运行时注解也搞上,自动生成,同时完成路由,比如阿里的:ARouter 也是个不错的方案。
  3. 要跨进程,要跨应用调用,这个时候,就只有 AIDL 的方案了,但有成本,第一种自建 Map 的方式,可以轻松切换到 AIDL 的方式,而如果是ARouter的方式,估计切到 AIDL 就不太好了。当然,如果都要用到 AIDL 的时候,创业必然成功,团队必然壮大!也不在乎重构一把了!

作者 | 辰星 某知名互联网公司 技术专家

原文发布于微信公众号 - 刘望舒(liuwangshuAndroid)

原文发表时间:2018-03-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python中文社区

一个基于Flask和MongoDB的CMS内容管理系统

Quokka 世界上最快乐的CMS内容管理系统 封面即为Quokka原意:产于澳大利亚的短尾矮袋鼠 Quokka是一个灵活地运用Python、Flask、Mon...

5889
来自专栏针针小站

【Share】Dell Precision 5510 Mojave Clover分享

首先先感谢 @darkhandz @黑果小兵 @Scottsanett 等大佬的分享

4872
来自专栏熊二哥

服务保障框架-Hystrix快速入门

祝大家国庆快乐! 对大部分电商和快递公司来说,每年年底(Q4季度)由于双11等大促活动的存在,将面对大量的用户流量,尤其是属于大促的那几天,无论是用户的商品订...

1291
来自专栏PHP在线

什么是RESTful Web Service?

1. 什么是Restful 其实早在web service概念产生前就有了restful的概念,或者说restful是和Http一起诞生的。 可以参阅 Roy ...

35410
来自专栏王小雷

在PaaS上开发Web、移动应用(2)

在PaaS上开发Web、移动应用(2) PaaS学习笔记目录 PaaS基础学习(1) 在PaaS上开发Web、移动应用(2) PaaS优点与限制(3) 6. 巨...

2136
来自专栏linux驱动个人学习

Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十)

多任务系统中, 内核负责管理各个任务, 或者说为每个任务分配CPU时间, 并且负责任务之间的通讯.

1593
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列3

Java面试系列3 01 不得不知道的Java名词 1 . J2EE (Java 2 Enterprise Edition)是一种利用Java 2平台来简化企业...

3115
来自专栏Linyb极客之路

Java常用日志框架介绍

看了上面的介绍是否会觉得比较混乱,这些日志框架之间有什么异同,都是由谁在维护? 下文会逐一介绍。

1671
来自专栏韩伟的专栏

分布式系统监控:通过JMX看对象模型的优势

在Java的圈子里面,任何一个技术产品,一般会先公开一系列的接口定义,然后推出对这个接口的一系列实现软件,这种做法,是一个对软件开发非常有益的进步。因为这让使用...

4495
来自专栏pangguoming

Open edX 学习、开发、运维相关链接整理

所需知识: Linux Git Python (Django Mako coffeescript sass) (MongoDB Mysql) Ansible-p...

4175

扫码关注云+社区