大家好纽竣,我是蒼王品抽。以下是我這個系列的相關(guān)文章储笑,有興趣可以參考一下,可以給個喜歡或者關(guān)注我的文章圆恤。
[Android]如何做一個崩潰率少于千分之三噶應(yīng)用app--章節(jié)列表
大家應(yīng)該有看完我的第十二編簡書的頁面跳轉(zhuǎn)會清楚跨module的跳轉(zhuǎn)用Android原生來做是突倍,需要使用隱式跳轉(zhuǎn)完成。
但是原生跳轉(zhuǎn)方式是有很多的局限性的盆昙。這里借用ARouter 對跳轉(zhuǎn)的分析的一張圖來介紹一下羽历,這個圖可以很容易的反映出原生跳轉(zhuǎn)和路由跳轉(zhuǎn)的差異。
(1)顯示跳轉(zhuǎn)需要依賴于類淡喜,而路由跳轉(zhuǎn)是通過url索引秕磷,無需依賴
(2)隱式是通過AndroidMainfest集中管理,協(xié)作開發(fā)困難炼团,
(3)原生需要在AndroidMainfest里面注冊澎嚣,而路由是用注解來注冊
(4)原生只要啟動了startActivity就交由Android控制,而路由是使用AOP切面編程可以作控制
這樣對比瘟芝,可以很明顯的體現(xiàn)出路由跳轉(zhuǎn)的方面和非常適合組件化解耦易桃。
接下來我會對比下我所知道的兩款有口碑的路由框架ARouter和ActivityRouter。
一.ARouter的配置介紹
大家有聽說過大名鼎鼎的ARouter路由框架锌俱,這是有阿里出品的開源路由框架颈抚。今天配置了一下,感覺真的不少坑。
這里我以我的組件化Gank工程給大家演示一下贩汉,覺得有用歡迎給個star
(1)首先我們需要在base module里面添加一些配置
compile引用aouter-api庫驱富,
annotationProcessor是AOP注解需要的
然后annotaitonProcessor會使用javaCompileOptions這個配置來獲取當(dāng)前module的名字
這里還比較奇異的地方時,其他使用了ARouter的路由跳轉(zhuǎn)的module(只要聲明了Route注解的module)都需要配置紅框的兩個地方匹舞,不然會無法跳轉(zhuǎn)成功褐鸥。
當(dāng)然我們還需要將加Application初始化
這里通過BuildConfig來區(qū)分打Log的情況,還需要使用ARouter.init()初始化
然后以web模塊為例
我們的WebActivity需要添加注解Route赐稽,path是跳轉(zhuǎn)的路徑
然后通過ARouter的引用調(diào)用叫榕,build填的是地址,withXXX填的是參數(shù)的key和value姊舵,然后navigation就是發(fā)射了路由跳轉(zhuǎn)了晰绎。
這里用的是建造者模式。
然后webActivity通過讀取傳遞的intent的方式就可以獲取參數(shù)了括丁。
以為這樣就完了荞下,這里是我收集到ARouter踩到的坑,這里才是精華史飞。
(1)請一定要保證每個需要跳轉(zhuǎn)的module都需要加入尖昏,不然跨模塊跳轉(zhuǎn)不起來
會報(bào)出這樣的log
(2)這里ARouter是對v4包是有依賴的,而且其包必定是要在25.2.0以上(我當(dāng)前看的源碼是需要這個构资,以后是否有更改抽诉,就需要大家查詢了),這里需要感謝討論群里的“98度”同學(xué)的提醒
(3)接下來吐绵,才是巨坑迹淌,這里面多個相同的group出現(xiàn),就會提示出現(xiàn)
查了一下Route里面的代碼,發(fā)現(xiàn)有以下這么一行己单,說明他是以group劃分了唉窃,group名不應(yīng)該相同。
這里group名就是path = “/XXX/XX“里面的第一個XXX了荷鼠,每個module的group名都不應(yīng)該相同。
如果遇到什么坑榔幸,也可以在評論或者加我討論群告訴一下大家允乐。
****2017.5.19****
發(fā)現(xiàn)了在Window電腦中編譯無問題,在mac中編譯就跳轉(zhuǎn)不過過去削咆。
遇到了一些大坑牍疏,因?yàn)镸ac在Application中使用了BuildConfig結(jié)果無法正常調(diào)用。
只要注釋了這里就能正常通過拨齐。鳞陨。。
****2017.7.20****
感謝QQ群內(nèi)的澆草少年發(fā)現(xiàn)的ARouter使用問題,
當(dāng)使用retrolambda需要引用plugin厦滤,這樣的順序是有問題的援岩。
需要調(diào)整一下retrolamda的順序。很可能兩個都從寫了apt里面的方式掏导,有什么潛在問題享怀,之后有待考究。但是澆草少年暫時未遇到問題趟咆。
一.ActivityRouter的配置介紹
首先ActivityRouter比ARouter要先發(fā)布很多添瓷。但是配置比起ARouter要麻煩很多,顯得相當(dāng)不友好值纱。
其配置方式有兩種鳞贷。
第一種方式是和ARouter一樣,都是每個Module里面都要配annotaionProcessor
使用apt方式虐唠,你可能遇到以下的錯誤搀愧,RouterMapping一直找不到相應(yīng)的對象。
然后每個Module中的需要路由跳轉(zhuǎn)的Activity都需要配置這個scheme
每個Module都需要配一個空的引用類和Module注解
其Application需要配置Modules注解凿滤,包含注冊的module對應(yīng)的字符串
然后在對應(yīng)的需要路由跳轉(zhuǎn)的Activity跳轉(zhuǎn)地址
簡單的跳轉(zhuǎn)調(diào)用Routers.open方法妈橄,調(diào)用scheme:data + module activity對應(yīng)跳轉(zhuǎn)地址
這樣就能跳轉(zhuǎn)成功了。
至于踩到什么坑
(1)申明地址的時候翁脆,地址開頭不能帶有“ /”眷蚓,因?yàn)樘D(zhuǎn)的時候聲明scheme data里面其跳轉(zhuǎn)地址如果加上“/”開頭,將會帶有多/(如cangwang:///main),為了規(guī)避解析異常反番。
(2)跳轉(zhuǎn)參數(shù)有兩種方式沙热,可以看ActivityRouter的例子里面,一種是通過地址包含參數(shù)
另一種是通過聲明參數(shù)的類型來做
這里比較坑的地方時罢缸,如果需要帶參數(shù)篙贸,需要以“?”+參數(shù)名+“=”+參數(shù)值 ?的方式傳遞
下面是例子
第一種方式
這里第一個值desc直接傳遞到title這個key里面
第二種方式傳遞
其參數(shù)名只需要寫到對應(yīng)的xxxParams里面枫疆。
跳轉(zhuǎn)啟動
(3)如果你考慮傳遞網(wǎng)址或者文件目錄這些參數(shù)爵川,你是無法使用第一種方式傳遞的,只能選擇第二種方式息楔。
因?yàn)槠錈o法通過第一種方式解析出跳轉(zhuǎn)的地址寝贡。
通過第二種方式傳遞,其能通過=來匹配傳遞內(nèi)容值依。
而跳轉(zhuǎn)失敗是不會有l(wèi)og提示的圃泡,只能調(diào)試其源碼才能看出來,排查過程真心有點(diǎn)累愿险。
對比來看ActivityRouter配置靈活性比不上ARouter颇蜡,ARouter參數(shù)傳遞更加簡便。如果選型來說,還是選擇后者风秤。
我會在之后的章節(jié)給大家剖析ARouter的原理鳖目。
如果有不同的看法和建議,也可以留言給我唁情,或者加我群疑苔,大家一起討論。
總結(jié)
使用路由的初衷是因?yàn)榭紤]到以后網(wǎng)絡(luò)跳轉(zhuǎn)到原生頁面甸鸟,需要更好的解耦方式惦费,也防止AndroidMainfest管理復(fù)雜化問題。
考慮踩過的坑抢韭,還是發(fā)現(xiàn)有一些缺陷的地方薪贫。
1.無法像Android使用startActivies啟動多個intent
2.配置和侵入性,每個module都需要使用注解框架刻恭。
3.如果考慮到以后應(yīng)用會sdk化瞧省,因?yàn)槠浒⒔饪蚣埽枰J(rèn)真考慮是否值得使用路由框架鳍贾。
這一節(jié)介紹就到這里鞍匾,
下一節(jié)將會更精彩,敬請期待F锟啤O鹗纭!
群號是316556016咆爽,也可以掃碼進(jìn)群梁棠。我在這里期待你們的加入!6饭 符糊!