[Andriod] 組件化路由跳轉

你們好,我是蒼王。如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。java

[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表git


你們應該有看完個人第十二編簡書的頁面跳轉會清楚跨module的跳轉用Android原生來作是,須要使用隱式跳轉完成。github


可是原生跳轉方式是有不少的侷限性的。這裏借用ARouter 對跳轉的分析的一張圖來介紹一下,這個圖能夠很容易的反映出原生跳轉和路由跳轉的差別。web

(1)顯示跳轉須要依賴於類,而路由跳轉是經過url索引,無需依賴編程

(2)隱式是經過AndroidMainfest集中管理,協做開發困難,api

(3)原生須要在AndroidMainfest裏面註冊,而路由是用註解來註冊網絡

(4)原生只要啓動了startActivity就交由Android控制,而路由是使用AOP切面編程能夠做控制app


這樣對比,能夠很明顯的體現出路由跳轉的方面和很是適合組件化解耦。框架

接下來我會對比下我所知道的兩款有口碑的路由框架ARouter和ActivityRouter。組件化


一.ARouter的配置介紹

你們有據說過大名鼎鼎的ARouter路由框架,這是有阿里出品的開源路由框架。今天配置了一下,感受真的很多坑。

這裏我以個人組件化Gank工程給你們演示一下,以爲有用歡迎給個star

(1)首先咱們須要在base module裏面添加一些配置

compile引用aouter-api庫,

annotationProcessor是AOP註解須要的


而後annotaitonProcessor會使用javaCompileOptions這個配置來獲取當前module的名字


這裏還比較奇異的地方時,其餘使用了ARouter的路由跳轉的module(只要聲明瞭Route註解的module)都須要配置紅框的兩個地方,否則會沒法跳轉成功。


固然咱們還須要將加Application初始化

這裏經過BuildConfig來區分打Log的狀況,還須要使用ARouter.init()初始化


而後以web模塊爲例

咱們的WebActivity須要添加註解Route,path是跳轉的路徑


而後經過ARouter的引用調用,build填的是地址,withXXX填的是參數的key和value,而後navigation就是發射了路由跳轉了。

這裏用的是建造者模式。


而後webActivity經過讀取傳遞的intent的方式就能夠獲取參數了。



覺得這樣就完了,這裏是我收集到ARouter踩到的坑,這裏纔是精華。

(1)請必定要保證每一個須要跳轉的module都須要加入,否則跨模塊跳轉不起來



會報出這樣的log



(2)這裏ARouter是對v4包是有依賴的,並且其包一定是要在25.2.0以上(我當前看的源碼是須要這個,之後是否有更改,就須要你們查詢了),這裏須要感謝討論羣裏的「98度」同窗的提醒



(3)接下來,纔是巨坑,這裏面多個相同的group出現,就會提示出現


查了一下Route裏面的代碼,發現有如下這麼一行,說明他是以group劃分了,group名不該該相同。


這裏group名就是path = 「/XXX/XX「裏面的第一個XXX了,每一個module的group名都不該該相同。



一.ActivityRouter的配置介紹

首先ActivityRouter比ARouter要先發布不少。可是配置比起ARouter要麻煩不少,顯得至關不友好。

其配置方式有兩種。

第一種方式是和ARouter同樣,都是每一個Module裏面都要配annotaionProcessor


使用apt方式,你可能遇到如下的錯誤,RouterMapping一直找不到相應的對象。


而後每一個Module中的須要路由跳轉的Activity都須要配置這個scheme


每一個Module都須要配一個空的引用類和Module註解


其Application須要配置Modules註解,包含註冊的module對應的字符串


而後在對應的須要路由跳轉的Activity跳轉地址


簡單的跳轉調用Routers.open方法,調用scheme:data + module activity對應跳轉地址


這樣就能跳轉成功了。


至於踩到什麼坑

(1)申明地址的時候,地址開頭不能帶有「 /」,由於跳轉的時候聲明scheme data裏面其跳轉地址若是加上「/」開頭,將會帶有多/(如cangwang:///main),爲了規避解析異常。


(2)跳轉參數有兩種方式,能夠看ActivityRouter的例子裏面,一種是經過地址包含參數


另外一種是經過聲明參數的類型來作

這裏比較坑的地方時,若是須要帶參數,須要以「?」+參數名+「=」+參數值 的方式傳遞


下面是例子

第一種方式

這裏第一個值desc直接傳遞到title這個key裏面

第二種方式傳遞

其參數名只須要寫到對應的xxxParams裏面。


跳轉啓動



(3)若是你考慮傳遞網址或者文件目錄這些參數,你是沒法使用第一種方式傳遞的,只能選擇第二種方式。

由於其沒法經過第一種方式解析出跳轉的地址。

經過第二種方式傳遞,其能經過=來匹配傳遞內容。

而跳轉失敗是不會有log提示的,只能調試其源碼才能看出來,排查過程真心有點累。


對比來看ActivityRouter配置靈活性比不上ARouter,ARouter參數傳遞更加簡便。若是選型來講,仍是選擇後者。

我會在以後的章節給你們剖析ARouter的原理。

若是有不一樣的見解和建議,也能夠留言給我,或者加我羣,你們一塊兒討論。


總結

使用路由的初衷是由於考慮到之後網絡跳轉到原生頁面,須要更好的解耦方式,也防止AndroidMainfest管理複雜化問題。

考慮踩過的坑,仍是發現有一些缺陷的地方。

1.沒法像Android使用startActivies啓動多個intent

2.配置和侵入性,每一個module都須要使用註解框架。

3.若是考慮到之後應用會sdk化,由於其包含註解框架,須要認真考慮是否值得使用路由框架。



這一節介紹就到這裏,

下一節將會更精彩,敬請期待!!!

羣號是316556016,也能夠掃碼進羣。我在這裏期待大家的加入!!!

相關文章
相關標籤/搜索