前言

模块化开发过程中首要解决的问题是如何进行跨模块交互,由于模块与模块之间不存在类的依赖关系因此类无法直接使用,在软件开发过程中随着业务不断膨胀,模块化开发就凸显得尤为重要。最近在研究组件化/模块化开发过程中突然遇到跨模块交互瓶颈,(例如A模块想要跳转B模块页面,由于AB模块相互独立并不存在依赖关系,因此使用常规的显式Intent路由是无法实现,而隐式Intent路由虽然可通过指定包名+类名实现但是由于需要对URL集中式管理涉及多人开发弊端暴露无遗,导致协作变得困难)那么有没有更为简洁的方式实现呢?答案是肯定的——ARouter。

ARouter 是阿里巴巴开源的一款android路由框架,github地址为 https://github.com/alibaba/ARouter

效果如下:

android 网络 路由 安卓路由跳转_android 网络 路由

ARouter 实现原理

ARouter在编译期的时候,利用自定义注解完成了页面的自动注册,经过代码编译后,生成了相应的映射文件,初始化会将这些文件加载到内存中去,形成一个路由表,以供后面路由查找跳转之用。

ARouter 功能

  1. 支持直接解析URL进行跳转、参数按类型解析到Bundle,支持Java基本类型(*)
  2. 支持应用内的标准页面跳转,API接近Android原生接口
  3. 支持多模块工程中使用,允许分别打包,包结构符合Android包规范即可(*)
  4. 支持跳转过程中插入自定义拦截逻辑,自定义拦截顺序(*)
  5. 支持服务托管,通过ByName,ByType两种方式获取服务实例,方便面向接口开发与跨模块调用解耦(*)
  6. 映射关系按组分类、多级管理,按需初始化,减少内存占用提高查询效率(*)
  7. 支持用户指定全局降级策略
  8. 支持获取单次跳转结果
  9. 丰富的API和可定制性
  10. 被ARouter管理的页面、拦截器、服务均无需主动注册到ARouter,被动发现
  11. 支持Android N推出的Jack编译链

ARouter 使用

这里就通过App 跨模块交互了解一下ARouter基本的页面跳转使用姿势


  • 宿主内部跳转(1,2)
  • 宿主跳转模块(3,4,5,6)
  • 模块跳转宿主(7,8)
  • 模块跳转模块(9,10)

如下图:

android 网络 路由 安卓路由跳转_页面跳转_02

1 创建测试工程



  • 首先建立宿主工程App 以及对应的MActivity(简称M)、M1Activity(简称M1)、M2Activity(简称M2)

android 网络 路由 安卓路由跳转_Gradle_03

  • 在Project下面的Gradle配置 dependencies 添加如下:

android 网络 路由 安卓路由跳转_Android_04


  • 宿主工程中的Gradle中 引用apt插件:

android 网络 路由 安卓路由跳转_android 网络 路由_05


       

同时添加arouter依赖

android 网络 路由 安卓路由跳转_页面跳转_06

工程如下:

android 网络 路由 安卓路由跳转_Gradle_07

  • 新建模块  ModuleA (简称MA)、ModuleB(简称MB)

android 网络 路由 安卓路由跳转_Gradle_08



  • 配置MA与MB Gradle文件,引入apt插件和arouter依赖。

android 网络 路由 安卓路由跳转_android 网络 路由_09


android 网络 路由 安卓路由跳转_页面跳转_10

  • 分别创建模块 MA(MA1Activity、MA2Activity) ,MB(MB1Activity、MB2Activity)对应测试文件。

android 网络 路由 安卓路由跳转_Gradle_11


  • MActivity测试入口界面如下:

android 网络 路由 安卓路由跳转_Android_12


2 宿主内部跳转(1,2)



  • M1、M2分别实现 Route注解如下:

android 网络 路由 安卓路由跳转_页面跳转_13


android 网络 路由 安卓路由跳转_ARoute_14


  • 宿主 M 中跳转内部页面 M1,使用系统提供的Intent路由跳转如下:

android 网络 路由 安卓路由跳转_页面跳转_15

       现在我们使用ARouter来进行页面跳转如下:(build参数为M1类的Path注解值):

android 网络 路由 安卓路由跳转_页面跳转_16

  • 宿主 M 跳转内部页面 M2 并且携带参数,系统Intent跳转如下:

android 网络 路由 安卓路由跳转_android 网络 路由_17


      使用ARouter进行页面跳转并且携带参数如下:

android 网络 路由 安卓路由跳转_Android_18

ARouter的build参数为跳转的目标页面注解时候的path值。

以上两种方案效果都是一致的并且ARouter是通过编译时期注解实现路由跳转与系统路由Intent比较并不会存在性能问题,那么既然效果一样ARouter 有点在哪里呢?系统提供的Intent路由需要类直接依赖才可实现,而ARouter则无需类的依赖就可实现页面跳转,下面跨模块跳转更为明显。

3 宿主跳转模块(3,4,5,6)


  • 首先实现模块MoudleA中的 MA1、MA2类的注解(MB1,MB2同样)

android 网络 路由 安卓路由跳转_ARoute_19



android 网络 路由 安卓路由跳转_android 网络 路由_20


  • 编译打包生成目标 aar 文件,拷贝至宿主App的libs目录下同时配置Gradle引入此aar。
  • 宿主 M 使用ARouter起调模块 MA1

android 网络 路由 安卓路由跳转_页面跳转_21



  • 宿主M 使用ARouter起调模块MA2并携带参数如下:

android 网络 路由 安卓路由跳转_android 网络 路由_22



可见 此处使用ARouter来进行页面跳转的好处已经显而易见了,宿主 M 跳转模块MA1、MA2并没有存在类的依赖关系。这样就很便利的解决的模块调用问题,有利于模块解耦。


4 模块跳转宿主(7,8)


android 网络 路由 安卓路由跳转_android 网络 路由_23


  • 模块 MA1 跳转至宿主 M1

android 网络 路由 安卓路由跳转_android 网络 路由_24



  • 模块 MA1 携参跳转至宿主 M2

android 网络 路由 安卓路由跳转_ARoute_25



5 模块跳转模块(9,10)


android 网络 路由 安卓路由跳转_Android_26


  • 模块 MB1 跳转模块 MA1

android 网络 路由 安卓路由跳转_android 网络 路由_27



  • 模块 MB1 携参跳转模块 MA2

android 网络 路由 安卓路由跳转_android 网络 路由_28



由上可见,使用ARouter进行模块之间页面跳转完全脱离了类的依赖。

ARouter 基本页面跳转至此已经结束,当前还有文中未提及的 跳转回调类似Android系统提供的 startActivityForResult 与之对应的ARouter提供的方案为:

ARouter.getInstance().build(path).navigation(Context context,int requestCode);





context——>上下文

requestCode——> 请求code


关于ARouter还提供丰富的API像路由拦截,跳转降级等等更多使用请参考官方文档。