從零開始Android組件化改造(三) - 頁面跳轉(zhuǎn)與路由組件

我的Github:https://github.com/BzCoder
歡迎各位留言討論

組件化與傳統(tǒng)開發(fā)有一個很大的不同殿雪,就是模塊件的跳轉(zhuǎn)速挑,如果使用傳統(tǒng)的顯式跳轉(zhuǎn)谤牡,勢必會極大造成模塊之間的耦合,這在組件化的開發(fā)中是絕對不允許的梗摇,因此在組件化開發(fā)中我們必須選用隱式跳轉(zhuǎn),并且我們需要把所有的頁面都納入到路由管理之中想许,我們選用的路由組件是阿里巴巴的Arouter伶授,有關(guān)Arouter可以查看以下三個資料帆谍。

組件化工程中使用

我們在組件化開發(fā)中主要使用到Arouter的三個常用功能峻呕。

  • 頁面的跨模塊隱式跳轉(zhuǎn)
  • 服務(wù)的跨模塊調(diào)用
  • 頁面的攔截服務(wù)
  • 頁面的降級處理

1.頁面的隱式跳轉(zhuǎn)

RouterHub

在組件化開發(fā)中,我們使用類似Web中Url的方式進(jìn)行頁面之間的跳轉(zhuǎn)某抓,Arouter將會把你的第一層路徑作為你的Group名漱凝,所以在組件化開發(fā)中疮蹦,我們將模塊名作為Group的名稱,并且保證每一個模塊的名字是不一樣的茸炒,建議每個模塊以自己的模塊名作為Group名愕乎,因為Arouter會在編譯階段生成ARouter$$Group$GroupName.java的文件,所以假如在兩個模塊中相同GroupName壁公,程序就會報錯感论,同時為了路由的初始化不引導(dǎo)到系統(tǒng)的性能,一個Group內(nèi)不應(yīng)該包含過多的頁面紊册,Arouter是分批加載的比肄。我們可以在通用的資源目錄下建立RounterHub來進(jìn)行路徑的分組管理。Arouter的功能非常強大囊陡,它不僅可以給Activity添加路由芳绩,還可以給Fragment,Service也添加路由撞反,統(tǒng)一添加到路由后妥色,我們就可以把所有頁面納入路由的統(tǒng)一管理,我們可以通過IOC遏片,AOP的思想垛膝,在跳轉(zhuǎn)之前和之后進(jìn)行操作。創(chuàng)建頁面的方法如下丁稀,我們可以傳入必要的參數(shù)吼拥。

 ARouter.getInstance().build(RouterHub.NEWS_LIST_ACTIVITY)
                .withString(CommonKey.TITLE, data.getName())
                .withInt(CommonKey.ID, data.getId())
                .navigation());

通過使用AOP,我們業(yè)務(wù)模塊之間頁面的跳轉(zhuǎn)就不需要互相引用线衫,因為Arouter已經(jīng)幫我們處理好了一切凿可,我們只需要最終在APP模塊中引入所有需要的模塊即可。

2.服務(wù)的遠(yuǎn)程調(diào)用

CommonService

這里的Service的含義不是安卓中的Service,而是和服務(wù)端開發(fā)中的Service是類似枯跑。在組件化開發(fā)中惨驶,我們必須要養(yǎng)成一個良好的習(xí)慣——對接口進(jìn)行編程,對接口進(jìn)行編程可以增強程序的可擴(kuò)展性敛助。在組件化開發(fā)中粗卜,我們可以建立了CommonService的模塊,我們將各個模塊的服務(wù)接口以及服務(wù)中需要對外暴露的數(shù)據(jù)結(jié)構(gòu)注冊在其中纳击,具體的服務(wù)實現(xiàn)我們在服務(wù)的提供者中去實現(xiàn)续扔,一個服務(wù)可以有多個實現(xiàn),在調(diào)用的模塊中焕数,我們只需要調(diào)用接口即可纱昧。代碼如下,我們可以通過調(diào)整Name的不同堡赔,來切換不同服務(wù)的實現(xiàn)识脆。這樣做可以有效減少服務(wù)提供者的改動對服務(wù)調(diào)用者的影響。
使用Arouter中善已,我們只要接口繼承Arouter中的IProvider即可灼捂。

public interface CityServiceService extends IProvider {


}

使用時,我們需要先注入后再使用换团。

 @Autowired(name = RouterHub.WEATHER_SERVICE_SETTING)
    WeatherService weatherService;

 protected void onCreate(@Nullable Bundle savedInstanceState) {
       ARouter.getInstance().inject(this);
}

3.頁面的攔截服務(wù)

Arouter中提供了頁面攔截器纵东,攔截器在app中最常用的用法就是登陸鑒權(quán)攔截,我們可以建立登陸攔截器啥寇。我們只要在攔截器上加入@Interceptor即可啟用攔截器偎球。
在登陸攔截器的場景中,假如我們檢測到用戶沒有登錄辑甜,頁面就必須跳轉(zhuǎn)到登錄界面衰絮,但是在模塊化編譯的時候極為不方便,因為這樣我們所調(diào)試的模塊就必須引入用戶登陸模塊磷醋,這違背我們組件化開發(fā)的初衷猫牡。所以我們在登陸攔截器中,假如我們是組件化編譯邓线。那么就使用假的用戶數(shù)據(jù)淌友,這個就不需要依賴用戶登錄模塊。當(dāng)然這個根據(jù)實際場景也可以引入用戶模塊進(jìn)行調(diào)試骇陈。

@Interceptor(priority = 5, name = "登錄攔截器")
public class LoginInterceptor implements IInterceptor {
    private String[] needLoginPath = {
           };
    private List<String> path = Arrays.asList(needLoginPath);


    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        if (path.contains(postcard.getPath())) {
            //TODO 登錄邏輯處理
            if (BuildConfig.IS_BUILD_MODULE) {
            //TODO 提供假數(shù)據(jù)
                }
            } else {
                //TODO 真數(shù)據(jù)
                }
            }

        }
        callback.onContinue(postcard);
    }

    @Override
    public void init(Context context) {
    }
}


4.頁面的降級處理

組件化開發(fā)很大的一個便利就是可以方便地插拔模塊震庭,而模塊的插拔勢必會帶來一個問題——頁面的丟失。這個也是我們之前為什么強調(diào)必須通過調(diào)用Service來進(jìn)行模塊間的通訊而不是直接引用你雌。但是模塊移出引用器联,Arouter是無法實例化頁面的二汛,當(dāng)然這種情況Arouter已經(jīng)預(yù)先幫我們設(shè)計了解決方案。只要實現(xiàn)DegradeService接口拨拓,既可處理服務(wù)降級事件肴颊。

// 實現(xiàn)DegradeService接口,并加上一個Path內(nèi)容任意的注解即可
@Route(path = "/xxx/xxx")
public class DegradeServiceImpl implements DegradeService {
@Override
public void onLost(Context context, Postcard postcard) {
    // do something.
}

@Override
public void init(Context context) {

}
}

我們在組件化開發(fā)中渣磷,主要就用到了Arouter的這四個主要功能婿着。今天的文章就先寫到這里。之后我們來聊聊有關(guān)于生命周期的管理醋界。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竟宋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子物独,更是在濱河造成了極大的恐慌袜硫,老刑警劉巖氯葬,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挡篓,死亡現(xiàn)場離奇詭異,居然都是意外死亡帚称,警方通過查閱死者的電腦和手機(jī)官研,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闯睹,“玉大人戏羽,你說我怎么就攤上這事÷コ裕” “怎么了始花?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長孩锡。 經(jīng)常有香客問我酷宵,道長,這世上最難降的妖魔是什么躬窜? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任浇垦,我火速辦了婚禮,結(jié)果婚禮上荣挨,老公的妹妹穿的比我還像新娘男韧。我一直安慰自己,他們只是感情好默垄,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布此虑。 她就那樣靜靜地躺著,像睡著了一般口锭。 火紅的嫁衣襯著肌膚如雪寡壮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音况既,去河邊找鬼这溅。 笑死,一個胖子當(dāng)著我的面吹牛棒仍,可吹牛的內(nèi)容都是我干的悲靴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼莫其,長吁一口氣:“原來是場噩夢啊……” “哼癞尚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乱陡,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤浇揩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后憨颠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胳徽,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年爽彤,在試婚紗的時候發(fā)現(xiàn)自己被綠了养盗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡适篙,死狀恐怖往核,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嚷节,我是刑警寧澤聂儒,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站硫痰,受9級特大地震影響衩婚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碍论,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一谅猾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鳍悠,春花似錦税娜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蠢挡,卻和暖如春弧岳,著一層夾襖步出監(jiān)牢的瞬間凳忙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工禽炬, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留涧卵,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓腹尖,卻偏偏與公主長得像柳恐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子热幔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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