[Andriod] 元件化路由跳轉

Cang_Wang發表於2017-05-09

大家好,我是蒼王。以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。

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


大家應該有看完我的第十二編簡書的頁面跳轉會清楚跨module的跳轉用Android原生來做是,需要使用隱式跳轉完成。


但是原生跳轉方式是有很多的侷限性的。這裡借用ARouter 對跳轉的分析的一張圖來介紹一下,這個圖可以很容易的反映出原生跳轉和路由跳轉的差異。

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

(2)隱式是通過AndroidMainfest集中管理,協作開發困難,

(3)原生需要在AndroidMainfest裡面註冊,而路由是用註解來註冊

(4)原生只要啟動了startActivity就交由Android控制,而路由是使用AOP切面程式設計可以作控制

[Andriod] 元件化路由跳轉

這樣對比,可以很明顯的體現出路由跳轉的方面和非常適合元件化解耦。

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


一.ARouter的配置介紹

大家有聽說過大名鼎鼎的ARouter路由框架,這是有阿里出品的開源路由框架。今天配置了一下,感覺真的不少坑。

這裡我以我的元件化Gank工程給大家演示一下,覺得有用歡迎給個star

(1)首先我們需要在base module裡面新增一些配置

compile引用aouter-api庫,

annotationProcessor是AOP註解需要的

[Andriod] 元件化路由跳轉

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

[Andriod] 元件化路由跳轉

這裡還比較奇異的地方時,其他使用了ARouter的路由跳轉的module(只要宣告瞭Route註解的module)都需要配置紅框的兩個地方,不然會無法跳轉成功。

[Andriod] 元件化路由跳轉

當然我們還需要將加Application初始化

這裡通過BuildConfig來區分打Log的情況,還需要使用ARouter.init()初始化

[Andriod] 元件化路由跳轉

然後以web模組為例

我們的WebActivity需要新增註解Route,path是跳轉的路徑

[Andriod] 元件化路由跳轉

然後通過ARouter的引用呼叫,build填的是地址,withXXX填的是引數的key和value,然後navigation就是發射了路由跳轉了。

這裡用的是建造者模式。

[Andriod] 元件化路由跳轉

然後webActivity通過讀取傳遞的intent的方式就可以獲取引數了。

[Andriod] 元件化路由跳轉

[Andriod] 元件化路由跳轉

以為這樣就完了,這裡是我收集到ARouter踩到的坑,這裡才是精華。

(1)請一定要保證每個需要跳轉的module都需要加入,不然跨模組跳轉不起來

[Andriod] 元件化路由跳轉

[Andriod] 元件化路由跳轉

會報出這樣的log

[Andriod] 元件化路由跳轉


(2)這裡ARouter是對v4包是有依賴的,而且其包必定是要在25.2.0以上(我當前看的原始碼是需要這個,以後是否有更改,就需要大家查詢了),這裡需要感謝討論群裡的“98度”同學的提醒

[Andriod] 元件化路由跳轉


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

[Andriod] 元件化路由跳轉

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

[Andriod] 元件化路由跳轉

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

[Andriod] 元件化路由跳轉


一.ActivityRouter的配置介紹

首先ActivityRouter比ARouter要先發布很多。但是配置比起ARouter要麻煩很多,顯得相當不友好。

其配置方式有兩種。

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

[Andriod] 元件化路由跳轉

使用apt方式,你可能遇到以下的錯誤,RouterMapping一直找不到相應的物件。

[Andriod] 元件化路由跳轉

然後每個Module中的需要路由跳轉的Activity都需要配置這個scheme

[Andriod] 元件化路由跳轉

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

[Andriod] 元件化路由跳轉

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

[Andriod] 元件化路由跳轉

然後在對應的需要路由跳轉的Activity跳轉地址

[Andriod] 元件化路由跳轉

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

[Andriod] 元件化路由跳轉

這樣就能跳轉成功了。


至於踩到什麼坑

(1)申明地址的時候,地址開頭不能帶有“ /”,因為跳轉的時候宣告scheme data裡面其跳轉地址如果加上“/”開頭,將會帶有多/(如cangwang:///main),為了規避解析異常。

[Andriod] 元件化路由跳轉

(2)跳轉引數有兩種方式,可以看ActivityRouter的例子裡面,一種是通過地址包含引數

[Andriod] 元件化路由跳轉

另一種是通過宣告引數的型別來做

這裡比較坑的地方時,如果需要帶引數,需要以“?”+引數名+“=”+引數值 的方式傳遞

[Andriod] 元件化路由跳轉

下面是例子

第一種方式

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

第二種方式傳遞

其引數名只需要寫到對應的xxxParams裡面。

[Andriod] 元件化路由跳轉

跳轉啟動

[Andriod] 元件化路由跳轉


(3)如果你考慮傳遞網址或者檔案目錄這些引數,你是無法使用第一種方式傳遞的,只能選擇第二種方式。

因為其無法通過第一種方式解析出跳轉的地址。

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

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


對比來看ActivityRouter配置靈活性比不上ARouter,ARouter引數傳遞更加簡便。如果選型來說,還是選擇後者。

我會在之後的章節給大家剖析ARouter的原理。

如果有不同的看法和建議,也可以留言給我,或者加我群,大家一起討論。


總結

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

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

1.無法像Android使用startActivies啟動多個intent

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

3.如果考慮到以後應用會sdk化,因為其包含註解框架,需要認真考慮是否值得使用路由框架。



這一節介紹就到這裡,

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

群號是316556016,也可以掃碼進群。我在這裡期待你們的加入!!!

[Andriod] 元件化路由跳轉

相關文章