2018-07-30

#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ù)組中,大致流程如下:

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

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ì)的流程如下

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

**Activity跳轉(zhuǎn)邏輯**

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

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

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ì)的流程如下

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

##三 路由表

路由表是當(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ù)組

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市粹庞,隨后出現(xiàn)的幾起案子咳焚,更是在濱河造成了極大的恐慌,老刑警劉巖庞溜,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件革半,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡流码,警方通過(guò)查閱死者的電腦和手機(jī)又官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)漫试,“玉大人六敬,你說(shuō)我怎么就攤上這事〖萑伲” “怎么了外构?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)播掷。 經(jīng)常有香客問(wèn)我审编,道長(zhǎng),這世上最難降的妖魔是什么歧匈? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任垒酬,我火速辦了婚禮,結(jié)果婚禮上件炉,老公的妹妹穿的比我還像新娘伤溉。我一直安慰自己,他們只是感情好妻率,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布乱顾。 她就那樣靜靜地躺著,像睡著了一般宫静。 火紅的嫁衣襯著肌膚如雪走净。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天孤里,我揣著相機(jī)與錄音伏伯,去河邊找鬼。 笑死捌袜,一個(gè)胖子當(dāng)著我的面吹牛说搅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虏等,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼弄唧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼适肠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起候引,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤侯养,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后澄干,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逛揩,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年麸俘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辩稽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡从媚,死狀恐怖逞泄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情静檬,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布并级,位于F島的核電站拂檩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嘲碧。R本人自食惡果不足惜稻励,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愈涩。 院中可真熱鬧望抽,春花似錦、人聲如沸履婉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毁腿。三九已至辑奈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間已烤,已是汗流浹背鸠窗。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胯究,地道東北人稍计。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像裕循,于是被迫代替她去往敵國(guó)和親臣嚣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子净刮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • js 原生代碼找對(duì)象的方法 id : document.getElementById('id') 標(biāo)簽 : do...
    老頭子_d0ec閱讀 116評(píng)論 0 0
  • 100個(gè)常用的javascript函數(shù) 1、原生JavaScript實(shí)現(xiàn)字符串長(zhǎng)度截取 復(fù)制代碼代碼如下: fun...
    老頭子_d0ec閱讀 359評(píng)論 0 0
  • js原生錯(cuò)誤代碼 js常見錯(cuò)誤類型 (1)SyntaxError SyntaxError是解析代碼時(shí)發(fā)生的語(yǔ)法錯(cuò)誤...
    老頭子_d0ec閱讀 269評(píng)論 0 0
  • 有人說(shuō):不小心看到11:11分就代表有人在想你噢茧球!
    相見再戀閱讀 80評(píng)論 0 0
  • PS:有關(guān)Docker版本就不重新介紹了庭瑰,可以看我的上一篇博客Ubuntu16.04安裝Docker CE 并配置...
    Dev_Mo閱讀 2,126評(píng)論 0 0