ARouter基本使用(一)

1挨摸、前言:

首先借用阿里云棲社區(qū)的一段話:我們所使用的原生路由方案一般是通過顯式intent和隱式intent兩種方式實現(xiàn)的(這里主要是指跳轉(zhuǎn)Activity or Fragment)抱冷。在顯式intent的情況下芹血,因為會存在直接的類依賴的問題吕粹,導(dǎo)致耦合非常嚴重;而在隱式intent情況下碴卧,則會出現(xiàn)規(guī)則集中式管理攻旦,導(dǎo)致協(xié)作變得非常困難。一般而言配置規(guī)則都是在Manifest中的冕房,這就導(dǎo)致了擴展性較差躏啰。除此之外,使用原生的路由方案會出現(xiàn)跳轉(zhuǎn)過程無法控制的問題耙册,因為一旦使用了StartActivity()就無法插手其中任何環(huán)節(jié)了给僵,只能交給系統(tǒng)管理,這就導(dǎo)致了在跳轉(zhuǎn)失敗的情況下無法降級详拙,而是會直接拋出運營級的異常帝际。這時候如果考慮使用自定義的路由組件就可以解決以上問題,比如通過URL索引就可以解決類依賴的問題溪厘;通過分布式管理頁面配置可以解決隱式intent中集中式管理Path的問題胡本;自己實現(xiàn)整個路由過程也可以擁有良好的擴展性,還可以通過AOP的方式解決跳轉(zhuǎn)過程無法控制的問題畸悬,與此同時也能夠提供非常靈活的降級方式侧甫。
ARouter官方項目地址

二珊佣、基本使用:

1、添加依賴

android {
    defaultConfig {
        //必須添加的
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
}

dependencies {
    // Replace with the latest version
   //版本依賴
   compile'com.alibaba:arouter-api:1.3.1'
   annotationProcessor'com.alibaba:arouter-compiler:1.1.4'
}
// --Kotlin如下使用--
implementation "com.alibaba:arouter-api:1.5.1"
kapt "com.alibaba:arouter-compiler:1.5.1"
kapt "com.alibaba:arouter-annotation:1.0.6"
圖片.png

2披粟、初始化

官方建議我們在Application里面進行ARouter初始化咒锻,于是乎就有了以下代碼:

if (isDebug()) {        
    ARouter.openLog();     // Print log
    ARouter.openDebug();   
}
ARouter.init(this);
圖片.png

然后別忘記了在清單文件里面配置自定義的Application和我們的Activity。

項目依賴導(dǎo)入和初始化就已經(jīng)完成了守屉,下面就開始正式的功能使用以及簡單的封裝惑艇。

3、開始使用:

1)首先:在Activity/Fragment類上面寫上 Route path 注解拇泛。

注意:這里的路徑需要注意的是至少需要有兩級滨巴,/xx/xx

2)然后:在Activity/Fragment類里面進入Arouter 注入,也就是:ARouter.getInstance().inject(this);

3)接著:目標(biāo)的Activity類上面需要聲明Route path 注解俺叭,以此對應(yīng)(跳轉(zhuǎn)如果不對應(yīng)路徑恭取,框架會Toast說路徑不匹配)

上述說明的簡單使用如下圖:

圖片.png

理論上來說,如果只是進行簡單的跳轉(zhuǎn)頁面熄守,

ARouter.getInstance().build(“目標(biāo)界面對應(yīng)的路徑”).navigation(); 就這樣一行代碼即可完成跳轉(zhuǎn)界面蜈垮。

好了,看到這里我們就會發(fā)現(xiàn)裕照,路徑的標(biāo)簽如果多了就不是很好管理攒发,(所以更好的選擇是寫一個類,在這個類里面統(tǒng)一管理和維護路徑標(biāo)簽晋南,不僅利于維護也方便后期拓展惠猿,看到路徑就一目了然,哇~這個路徑對應(yīng)的是登錄界面搬俊,這個路徑對應(yīng)的是詳情界面)紊扬;其次,每個頁面的注入唉擂,也就是ARouter.getInstance().inject(this);這句代碼出現(xiàn)的幾率會寫的很多,(而且一般的常規(guī)邏輯是有注入就有解綁或者釋放資源)所以我們應(yīng)該簡單封裝起來提高效率

4檀葛、簡單封裝

首先是路徑管理:

圖片.png

然后是注入封裝:

這里多提一嘴玩祟,優(yōu)秀的第三方框架如果一般有注入或者綁定的API,那與之對應(yīng)的一般就會有釋放或者解綁資源的API屿聋。(這樣做的本質(zhì)是優(yōu)化內(nèi)存)其中空扎, ARouter.getInstance().destroy( ) ; 這個API一目了然润讥,就是釋放資源的API。下面就是開始注入和釋放資源的封裝:

圖片.png

筆者在Activity的基類里面通過生命周期進行了注入和解綁撮慨,但是項目運行后發(fā)現(xiàn)了一個問題,就是如果在onDestroy()里面調(diào)用了 ARouter.getInstance().destroy( ) ; 在進入目標(biāo)Activity之后,然后按back鍵返回原界面的時候砌溺,APP會報錯崩潰,下面是崩潰日志:

圖片.png

仔細一看蟹倾,初始化有問題?在前面我們說到在自定義Application里面已經(jīng)初始化了ARouter猖闪,且在清單文件里面配置了自定義的Application,但是依舊提示沒有初始化培慌,這就納了個悶检柬?然后想了想,可能是 ARouter.getInstance().destroy( )里逆;這行代碼的使用位置可能用錯了用爪。然后既然是在Application里面進行的初始化,那么就可以將這行釋放資源的代碼诸衔,寫在Application生命周期的onTerminate( )里面颇玷,果不其然,項目運行后就沒什么問題了谒亦。當(dāng)然空郊,這是我自己的思路狞甚,有更好的意見和想法請在評論區(qū)指出,謝謝谐腰。

圖片.png

封裝完畢了路徑標(biāo)識以及注入釋放等基本功能,我們回到ARouter的基本使用:

5巩步、簡單頁面跳轉(zhuǎn)

如果只是簡單的頁面跳轉(zhuǎn)桦踊,一行代碼即可完成,如下圖

圖片.png

其中竟闪,build里面是頁面的標(biāo)簽路徑炼蛤,對應(yīng)的就是目標(biāo)Activity的這里蝶涩,也就是類注釋標(biāo)簽路徑要一致:

圖片.png

注意:不要忘了在清單文件里面配置Activity。

6嗽上、帶參數(shù)的界面跳轉(zhuǎn)

  • 帶參數(shù)的跳轉(zhuǎn)是很常見的功能熄攘,Android可以通過Bundle去傳遞參數(shù)挪圾,如果使用ARouter框架,它傳遞參數(shù)通過以下去操作:
  • ARouter傳遞對象的時候洼畅,首先該對象需要Parcelable或者Serializable序列化棚赔,可能Parcelable這個序列化大家覺得手寫起來比較麻煩,但是Android Studio已經(jīng)有一些插件幫我們自動生成Parcelable序列化了(因為Android用Parcelable序列化優(yōu)勢會更加明顯一些)
  • 字符串、char捆毫、int等基本數(shù)據(jù)類型當(dāng)然都是可以傳遞的
  • 當(dāng)然冲甘,它也可以直接傳Bundle途样、數(shù)組何暇、列表等很多對象凛驮,傳遞類型如下圖
圖片.png

攜帶參數(shù)的界面跳轉(zhuǎn),簡單使用如下圖

圖片.png

其中宏胯,第一個參數(shù)代表的是參數(shù)的key,第二個參數(shù)對應(yīng)的是我們要傳遞的屬性值肩袍,也就是value

那么目標(biāo)界面如何獲取傳遞過來的值婚惫?

這個時候,我們需要在目標(biāo)界面艰管,使用Autowired注解密浑,

圖片.png

這樣就可以獲取到傳遞過來的值了

圖片.png

值得注意的是尔破,只有當(dāng) @Autowired(name = "test"),也就是key標(biāo)簽一致的情況下懒构,才可以獲取到對象的值,如果不寫標(biāo)簽名絮姆,結(jié)果會為null秩霍,

圖片.png

所以為了規(guī)避每一個可能會遇到的風(fēng)險铃绒,建議在@Autowired里面 都寫上與之對應(yīng)具體的key名。

7矮燎、界面跳轉(zhuǎn)動畫

直接調(diào)用withTransition,里面?zhèn)魅雰蓚€動畫即可(R.anim.xxx)

圖片.png

8澜沟、使用URI進行跳轉(zhuǎn)

ARouter框架也可以使用URI進行匹配跳轉(zhuǎn)茫虽,代碼也很少靖苇,只需匹配路徑一致即可完成跳轉(zhuǎn):

圖片.png

9、Fragment跳轉(zhuǎn)

Fragment的跳轉(zhuǎn)也可以參照Activity跳轉(zhuǎn)悼枢,第一步依舊是先寫上類注釋馒索,然后是強轉(zhuǎn)名船,代碼如下

圖片.png

10、進階用法之?dāng)r截器:

  • 攔截器是ARouter這一款框架的亮點蜈块。說起攔截器這個概念迷扇,可能印象更加深刻的是OkHttp的攔截器蜓席,OkHttp的攔截器主要是用來攔截請求體(比如添加請求Cookie)和攔截響應(yīng)體(判斷Token是否過期),在真正的請求和響應(yīng)前做一些判斷和修改然后在去進行操作祈秕,大抵這就是攔截器的簡單概念雏胃。那么,ARouter框架的攔截器是怎么實現(xiàn)的获印?
  • ARouter的攔截器,是通過實現(xiàn) IInterceptor接口,重寫init()和process()方法去完成攔截器內(nèi)部操作的鳍征。

首先我們定義兩個攔截器:


圖片.png
圖片.png

首先艳丛,定義ARouter攔截器必須要使用Interceptor類注解趟紊。注解里面的 priority(也就是紅色框) 這個是聲明攔截器的優(yōu)先級、里面的屬性值是int類型戴差。既然是定義優(yōu)先級铛嘱,我們這里定義2個攔截器來測試看看優(yōu)先級是如何區(qū)分誰先誰后的墨吓?兩個攔截器寫完之后,運行下項目看下效果:

圖片.png

結(jié)論 1:根據(jù)實驗得知亮曹,使用Interceptor類注解的priority數(shù)值越小秘症,越先執(zhí)行,優(yōu)先級越高窄瘟。(四大組件中的廣播趟卸,優(yōu)先級的取值是 -1000到1000锄列,數(shù)值越大優(yōu)先級越高)

  • 那么,還有一種情況竣况,如果兩個攔截器定義的優(yōu)先級都是一樣的筒严,那么誰的優(yōu)先級會高情萤?是根據(jù)類的字符串長度來判斷嘛還是別的條件來判斷的筋岛?晒哄?
  • 首先,將上面的攔截器的優(yōu)先級改成一樣(都改成1)柒傻,項目編譯試試红符,結(jié)果發(fā)現(xiàn)項目就會直接報錯劫映!
圖片.png

看下具體的錯誤原因:

圖片.png

翻譯過來就是他們使用了相同的優(yōu)先級泳赋,所以:

結(jié)論 2:如果兩個攔截器的優(yōu)先級一樣,項目編譯就會報錯校坑。所以千诬,不同攔截器定義的優(yōu)先級屬性值不能相同

我們到這兩個攔截器里面加一點篩選條件的代碼:

圖片.png

將這段代碼加進去之后徐绑,重新運行App,打印日志結(jié)果如下:

圖片.png

為了方便看清運行的日志毅访,我用三種顏色的箭頭去對應(yīng)盘榨。首先是兩個攔截器的初始化草巡,然后,調(diào)用了NavigationCallback這個回調(diào)函數(shù)里面的onFound()查乒,然后執(zhí)行了攔截器里面的process()方法;當(dāng)攔截器的process()方法執(zhí)行完畢以后档桃,最終回調(diào)了NavigationCallback里面的onArrival()方法憔晒。攔截器的工作流程大抵就是這樣拒担。那么攻询,NavigationCallback這個又是什么?實際上低零,NavigationCallback這個簡單理解就是ARouter在路由跳轉(zhuǎn)的過程中拯杠,我們可以監(jiān)聽路由的一個具體過程潭陪。它一共有四個方法:

圖片.png

那么,這個回調(diào)里面的 Postcard 又是什么意思老厌?點進去源碼看看黎炉,類注釋寫的一目了然:

圖片.png

紅色框翻譯過來的類注釋就是:一個包含路線圖的容器慷嗜。
既然是路線圖的容器,那肯定有些API會獲取到相應(yīng)的信息垦页,

圖片.png

通過Postcard可以獲取到路徑的組以及全路徑痊焊,那么,路徑的組(Group)又是什么辕羽?是這樣垄惧,一般來說,ARouter在編譯期框架掃描了所有的注冊頁面/字段/攔截器等铣口,那么很明顯運行期不可能一股腦全部加載進來觉壶,這樣就太不和諧了铜靶。所以就使用分組來管理,我們的類標(biāo)簽里面的注釋已艰,對于group默認是 “ ”(空字符串)如下圖:

圖片.png

在 Group簡單使用 這張圖上面蚕苇,根據(jù)日志捆蜀,打印了分組的信息,可以發(fā)現(xiàn)Group的值默認就是第一個 / /(兩個分隔符) 之間的內(nèi)容誊薄。

那么锰茉,我們也可以自定義分組,來進行界面跳轉(zhuǎn)片吊,所以ARouter又提供了一種解決方案:

11俏脊、自定義分組 實現(xiàn)跳轉(zhuǎn)界面

如果使用自定義分組來跳轉(zhuǎn)界面肤晓,只需要在源代碼改動以下三個位置:

1:類注解新增 group认然,賦值我們自定義的組名卷员,(依舊統(tǒng)一寫在一個類里面這樣便于管理)

圖片.png

2:在build方法里面(這是一個方法重載)腾务,添加我們的與之對應(yīng)的組名

圖片.png

3:在被跳轉(zhuǎn)的Activity里面的類注釋岩瘦,加上同樣的組名

圖片.png

通過上面三個步驟即可完成 自定義分組 來完成界面跳轉(zhuǎn)


圖片.png

通過日志顯示启昧,這里的組名已經(jīng)被我們更改成自定義分組且成功完成了跳轉(zhuǎn)。

2、ARouter如何實現(xiàn)類似startActivityForResult()苏遥?

這種應(yīng)用場景也是很常見的赡模,那ARouter該如何實現(xiàn)?

第一步:為了方便看效果教硫,我們在第一個Activity設(shè)置requestCode 為123瞬矩,

圖片.png

第二步:需要在跳轉(zhuǎn)的navigation方法(這是一個方法重載)里面的第二個參數(shù)锋玲,設(shè)置我們定義的requestCode,(通過匹配requestCode 來實現(xiàn)該功能)

圖片.png

第三步:在第二個界面的setResult方法里面伞插,寫上對應(yīng)的resultCode媚污,這里就不展示Intent數(shù)據(jù)了

圖片.png

綜合上面三個步驟耗美,項目編譯運行,跳轉(zhuǎn)到第二個界面然后返回上一個界面朵锣,日志成功打拥樗健:

圖片.png

ARouter路由框架的基本使用就介紹到這里,源碼分析請看第二篇诬烹。

探索Android路由框架-ARouter之深挖源碼


參考:http://www.reibang.com/p/6021f3f61fa6

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绞吁,一起剝皮案震驚了整個濱河市唬格,隨后出現(xiàn)的幾起案子购岗,更是在濱河造成了極大的恐慌,老刑警劉巖烹困,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乾吻,死亡現(xiàn)場離奇詭異绎签,居然都是意外死亡,警方通過查閱死者的電腦和手機鸭你,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門袱巨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碳抄,“玉大人,你說我怎么就攤上這事嫉入。” “怎么了熬拒?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵澎粟,是天一觀的道長欢瞪。 經(jīng)常有香客問我,道長啸盏,這世上最難降的妖魔是什么骑祟? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任次企,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛉谜。我一直安慰自己崇堵,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布狰贯。 她就那樣靜靜地躺著涵紊,像睡著了一般幔摸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驱负,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天跃脊,我揣著相機與錄音,去河邊找鬼器瘪。 笑死拼缝,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衰齐。 我是一名探鬼主播继阻,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼瘟檩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卓研?” 一聲冷哼從身側(cè)響起睹簇,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤太惠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梁只,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埃脏,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡彩掐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年佩谷,在試婚紗的時候發(fā)現(xiàn)自己被綠了监嗜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裁奇。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡麦撵,死狀恐怖免胃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躺涝,我是刑警寧澤扼雏,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布诗充,位于F島的核電站,受9級特大地震影響碟绑,放射性物質(zhì)發(fā)生泄漏茎匠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望造烁。 院中可真熱鬧午笛,春花似錦药磺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽放案。三九已至矫俺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間友雳,已是汗流浹背押赊。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工考杉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舰始,地道東北人丸卷。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓谜嫉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哆档。 傳聞我的和親對象是個殘疾皇子住闯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

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