#ARouter##一 [功能](https://github.com/alibaba/ARouter/blob/master/README_CN.md)簡(jiǎn)介- 支持URL頁(yè)面跳轉(zhuǎn)邑退,并可添加參數(shù)- 支持參數(shù)及對(duì)象傳遞- 支持自定義攔截器- 支持MultiDex- **新增**:支持路由表生成> 注:1.打開InstantRun蹋半,可能出現(xiàn)跳轉(zhuǎn)失敗2.沒(méi)有打開debug調(diào)試唾那,導(dǎo)致新增的path不能跳轉(zhuǎn)3.Fragment不支持startActivityForResult方法,默認(rèn)Result會(huì)回到Fragment對(duì)應(yīng)的Activity##二 原理ARouter主要分為三部分:編譯生成輔助文件哪替,使用初始化,具體調(diào)用**編程生成輔助文件**通過(guò)Android APT根據(jù)代碼中添加的Route注解盯质,獲取對(duì)應(yīng)的類绘盟,根據(jù)注解的path刨沦,類等生成對(duì)應(yīng)的輔助java文件如下為動(dòng)態(tài)生成的一個(gè)實(shí)例>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));
? }
}
```
**解析應(yīng)用Dex初始化**
使用之前必須對(duì)ARouter初始化,通過(guò)應(yīng)用Context找到應(yīng)用的apk和所有的dex想诅,遍歷每一個(gè)dex的class召庞,將符合條件的加入到數(shù)組中,大致流程如下:

1.檢查當(dāng)前應(yīng)用的版本役拴,如果當(dāng)前版本大于ARouter上一次保存的版本尘吗,進(jìn)入下一步鲜漩;否則獲取在(4)中保存的class串
2.找出應(yīng)用的apk和所有的dex的路徑
3.根據(jù)路徑遍歷apk和dex,過(guò)濾所有以指定包名開頭的class
4.class串保存到SharedPreferences中
5.更新ARouter保存的應(yīng)用版本
6根據(jù)class串反射調(diào)用編譯生成的文件诅诱,將注解文件相關(guān)的內(nèi)容加入到分類(如:Activity,Providers)數(shù)組中
更加詳細(xì)的流程如下

**Activity跳轉(zhuǎn)邏輯**
通過(guò)ARouter可以實(shí)現(xiàn)不同模塊頁(yè)面的跳轉(zhuǎn)送朱,只需要提供跳轉(zhuǎn)需要的path和傳遞的參數(shù)娘荡,如下為大致流程:

1.App中開始調(diào)用
2.根據(jù)path和參數(shù)構(gòu)建參數(shù)對(duì)象
3.根據(jù)參數(shù)path獲取初始化中,分類的數(shù)據(jù)對(duì)象
4.將獲取的數(shù)據(jù)賦值給參數(shù)對(duì)象
5.根據(jù)參數(shù)對(duì)象中的目標(biāo)Class驶沼,startActivity
更加詳細(xì)的流程如下

##三 路由表
路由表是當(dāng)前需求在ARouter的基礎(chǔ)上增加的通用性的功能炮沐,他可以實(shí)現(xiàn)不暴露模塊源代碼,**自動(dòng)**生成一張path及參數(shù)的表回怜。目前已實(shí)現(xiàn)Activity跳轉(zhuǎn)路由表大年,如下為一個(gè)實(shí)例:
``` java
auto generated, do not change // 自動(dòng)生成不需要修改
moduleName : PhiDynamic? // module名稱
/Dynamic/Activity/FollowActivity? // 跳轉(zhuǎn)的path
list_type:String? ? ? // 參數(shù)key,和參數(shù)類型
nickname:String
userId:String
/Dynamic/Activity/HomePage
userId:String
/Dynamic/Activity/PostDynamic
nothing parameter? // 無(wú)參數(shù)的情況
/Dynamic/Activity/AtFriend
nothing parameter
```
**Activity路由表**
1.module編譯執(zhí)行apt
2.根據(jù)自定義注解Route獲取path玉雾,Autowired獲取參數(shù)
3.將獲取的Route和Autowired注解的值分類排序翔试,存放在數(shù)組中
4.將數(shù)組內(nèi)容輸出到文件中
**Provider路由表**
1.自定義Provider對(duì)應(yīng)的函數(shù)注解,需包括Provider的type和參數(shù)复旬,可通過(guò)定義兩個(gè)平行數(shù)組解決參數(shù)key和value的問(wèn)題
2.獲取自定義注解遏餐,反向解析定義的類型,存放在數(shù)組中
3.將數(shù)組內(nèi)容輸出到文件中
> 注解支持的類型有:基礎(chǔ)數(shù)據(jù)類型赢底,枚舉類型失都,注解類型柏蘑,以上類型的數(shù)組