#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://img.haomeiwen.com/i7374604/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://img.haomeiwen.com/i7374604/5f2155d6568a005f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**Activity跳转逻辑**
通过ARouter可以实现不同模块页面的跳转,只需要提供跳转需要的path和传递的参数,如下为大致流程:
![](https://img.haomeiwen.com/i7374604/d9a28ca004dca3a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
1.App中开始调用
2.根据path和参数构建参数对象
3.根据参数path获取初始化中,分类的数据对象
4.将获取的数据赋值给参数对象
5.根据参数对象中的目标Class,startActivity
更加详细的流程如下
![](https://img.haomeiwen.com/i7374604/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.将数组内容输出到文件中
> 注解支持的类型有:基础数据类型,枚举类型,注解类型,以上类型的数组
网友评论