前言
模块化开发过程中首要解决的问题是如何进行跨模块交互,由于模块与模块之间不存在类的依赖关系因此类无法直接使用,在软件开发过程中随着业务不断膨胀,模块化开发就凸显得尤为重要。最近在研究组件化/模块化开发过程中突然遇到跨模块交互瓶颈,(例如A模块想要跳转B模块页面,由于AB模块相互独立并不存在依赖关系,因此使用常规的显式Intent路由是无法实现,而隐式Intent路由虽然可通过指定包名+类名实现但是由于需要对URL集中式管理涉及多人开发弊端暴露无遗,导致协作变得困难)那么有没有更为简洁的方式实现呢?答案是肯定的——ARouter。
ARouter 是阿里巴巴开源的一款android路由框架,github地址为 https://github.com/alibaba/ARouter
效果如下:
ARouter 实现原理
ARouter在编译期的时候,利用自定义注解完成了页面的自动注册,经过代码编译后,生成了相应的映射文件,初始化会将这些文件加载到内存中去,形成一个路由表,以供后面路由查找跳转之用。
ARouter 功能
- 支持直接解析URL进行跳转、参数按类型解析到Bundle,支持Java基本类型(*)
- 支持应用内的标准页面跳转,API接近Android原生接口
- 支持多模块工程中使用,允许分别打包,包结构符合Android包规范即可(*)
- 支持跳转过程中插入自定义拦截逻辑,自定义拦截顺序(*)
- 支持服务托管,通过ByName,ByType两种方式获取服务实例,方便面向接口开发与跨模块调用解耦(*)
- 映射关系按组分类、多级管理,按需初始化,减少内存占用提高查询效率(*)
- 支持用户指定全局降级策略
- 支持获取单次跳转结果
- 丰富的API和可定制性
- 被ARouter管理的页面、拦截器、服务均无需主动注册到ARouter,被动发现
- 支持Android N推出的Jack编译链
ARouter 使用
这里就通过App 跨模块交互了解一下ARouter基本的页面跳转使用姿势
- 宿主内部跳转(1,2)
- 宿主跳转模块(3,4,5,6)
- 模块跳转宿主(7,8)
- 模块跳转模块(9,10)
如下图:
1 创建测试工程
- 首先建立宿主工程App 以及对应的MActivity(简称M)、M1Activity(简称M1)、M2Activity(简称M2)
- 在Project下面的Gradle配置 dependencies 添加如下:
- 宿主工程中的Gradle中 引用apt插件:
同时添加arouter依赖
工程如下:
- 新建模块 ModuleA (简称MA)、ModuleB(简称MB)
- 配置MA与MB Gradle文件,引入apt插件和arouter依赖。
- 分别创建模块 MA(MA1Activity、MA2Activity) ,MB(MB1Activity、MB2Activity)对应测试文件。
- MActivity测试入口界面如下:
2 宿主内部跳转(1,2)
- M1、M2分别实现 Route注解如下:
- 宿主 M 中跳转内部页面 M1,使用系统提供的Intent路由跳转如下:
现在我们使用ARouter来进行页面跳转如下:(build参数为M1类的Path注解值):
- 宿主 M 跳转内部页面 M2 并且携带参数,系统Intent跳转如下:
使用ARouter进行页面跳转并且携带参数如下:
ARouter的build参数为跳转的目标页面注解时候的path值。
以上两种方案效果都是一致的并且ARouter是通过编译时期注解实现路由跳转与系统路由Intent比较并不会存在性能问题,那么既然效果一样ARouter 有点在哪里呢?系统提供的Intent路由需要类直接依赖才可实现,而ARouter则无需类的依赖就可实现页面跳转,下面跨模块跳转更为明显。
3 宿主跳转模块(3,4,5,6)
- 首先实现模块MoudleA中的 MA1、MA2类的注解(MB1,MB2同样)
- 编译打包生成目标 aar 文件,拷贝至宿主App的libs目录下同时配置Gradle引入此aar。
- 宿主 M 使用ARouter起调模块 MA1
- 宿主M 使用ARouter起调模块MA2并携带参数如下:
可见 此处使用ARouter来进行页面跳转的好处已经显而易见了,宿主 M 跳转模块MA1、MA2并没有存在类的依赖关系。这样就很便利的解决的模块调用问题,有利于模块解耦。
4 模块跳转宿主(7,8)
- 模块 MA1 跳转至宿主 M1
- 模块 MA1 携参跳转至宿主 M2
5 模块跳转模块(9,10)
- 模块 MB1 跳转模块 MA1
- 模块 MB1 携参跳转模块 MA2
由上可见,使用ARouter进行模块之间页面跳转完全脱离了类的依赖。
ARouter 基本页面跳转至此已经结束,当前还有文中未提及的 跳转回调类似Android系统提供的 startActivityForResult 与之对应的ARouter提供的方案为:
ARouter.getInstance().build(path).navigation(Context context,int requestCode);
context——>上下文
requestCode——> 请求code
关于ARouter还提供丰富的API像路由拦截,跳转降级等等更多使用请参考官方文档。