2018-07-30

#ARouter##一 [功能](https://github.com/alibaba/ARouter/blob/master/README_CN.md)简介- 支持URL页面跳转,并可添加参数- 支持参数及对象传递- 支持自定义拦截器- 支持MultiDex- **新增**:支持路由表生成> 注:1.打开InstantRun,可能出现跳转失败2.没有打开debug调试,导致新增的path不能跳转3.Fragment不支持startActivityForResult方法,默认Result会回到Fragment对应的Activity##二 原理ARouter主要分为三部分:编译生成辅助文件,使用初始化,具体调用**编程生成辅助文件**通过Android APT根据代码中添加的Route注解,获取对应的类,根据注解的path,类等生成对应的辅助java文件如下为动态生成的一个实例>APT:全称Annotation Processing Tool,是注解工具``` javapublic class ARouter$$Group$$Dynamic implements IRouteGroup { @Override public void loadInto(Map atlas) {

    atlas.put("/Dynamic/Activity/AtFriend", RouteMeta.build(RouteType.ACTIVITY, AtFriendListActivity.class, "/dynamic/activity/atfriend", "dynamic", null, -1, -2147483648));

    atlas.put("/Dynamic/Activity/AtMe", RouteMeta.build(RouteType.ACTIVITY, AtMeActivity.class, "/dynamic/activity/atme", "dynamic", null, -1, -2147483648));

  }

}

```

**解析应用Dex初始化**

使用之前必须对ARouter初始化,通过应用Context找到应用的apk和所有的dex,遍历每一个dex的class,将符合条件的加入到数组中,大致流程如下:

![](https://upload-images.jianshu.io/upload_images/7374604-962248abf7418e97.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

1.检查当前应用的版本,如果当前版本大于ARouter上一次保存的版本,进入下一步;否则获取在(4)中保存的class串

2.找出应用的apk和所有的dex的路径

3.根据路径遍历apk和dex,过滤所有以指定包名开头的class

4.class串保存到SharedPreferences中

5.更新ARouter保存的应用版本

6根据class串反射调用编译生成的文件,将注解文件相关的内容加入到分类(如:Activity,Providers)数组中

更加详细的流程如下

![](https://upload-images.jianshu.io/upload_images/7374604-5f2155d6568a005f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**Activity跳转逻辑**

通过ARouter可以实现不同模块页面的跳转,只需要提供跳转需要的path和传递的参数,如下为大致流程:

![](https://upload-images.jianshu.io/upload_images/7374604-d9a28ca004dca3a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

1.App中开始调用

2.根据path和参数构建参数对象

3.根据参数path获取初始化中,分类的数据对象

4.将获取的数据赋值给参数对象

5.根据参数对象中的目标Class,startActivity

更加详细的流程如下

![](https://upload-images.jianshu.io/upload_images/7374604-aea8a3deced4e96b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

##三 路由表

路由表是当前需求在ARouter的基础上增加的通用性的功能,他可以实现不暴露模块源代码,**自动**生成一张path及参数的表。目前已实现Activity跳转路由表,如下为一个实例:

``` java

auto generated, do not change // 自动生成不需要修改

moduleName : PhiDynamic  // module名称

/Dynamic/Activity/FollowActivity  // 跳转的path

list_type:String      // 参数key,和参数类型

nickname:String

userId:String

/Dynamic/Activity/HomePage

userId:String

/Dynamic/Activity/PostDynamic

nothing parameter  // 无参数的情况

/Dynamic/Activity/AtFriend

nothing parameter

```

**Activity路由表**

1.module编译执行apt

2.根据自定义注解Route获取path,Autowired获取参数

3.将获取的Route和Autowired注解的值分类排序,存放在数组中

4.将数组内容输出到文件中

**Provider路由表**

1.自定义Provider对应的函数注解,需包括Provider的type和参数,可通过定义两个平行数组解决参数key和value的问题

2.获取自定义注解,反向解析定义的类型,存放在数组中

3.将数组内容输出到文件中

> 注解支持的类型有:基础数据类型,枚举类型,注解类型,以上类型的数组

你可能感兴趣的:(2018-07-30)