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

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

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

組件化工程中使用

我們?cè)诮M件化開發(fā)中主要使用到Arouter的三個(gè)常用功能。

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

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

RouterHub

在組件化開發(fā)中,我們使用類似Web中Url的方式進(jìn)行頁(yè)面之間的跳轉(zhuǎn),Arouter將會(huì)把你的第一層路徑作為你的Group名,所以在組件化開發(fā)中,我們將模塊名作為Group的名稱,并且保證每一個(gè)模塊的名字是不一樣的,建議每個(gè)模塊以自己的模塊名作為Group名,因?yàn)锳router會(huì)在編譯階段生成ARouter$$Group$GroupName.java的文件,所以假如在兩個(gè)模塊中相同GroupName,程序就會(huì)報(bào)錯(cuò),同時(shí)為了路由的初始化不引導(dǎo)到系統(tǒng)的性能,一個(gè)Group內(nèi)不應(yīng)該包含過(guò)多的頁(yè)面,Arouter是分批加載的。我們可以在通用的資源目錄下建立RounterHub來(lái)進(jìn)行路徑的分組管理。Arouter的功能非常強(qiáng)大,它不僅可以給Activity添加路由,還可以給Fragment,Service也添加路由,統(tǒng)一添加到路由后,我們就可以把所有頁(yè)面納入路由的統(tǒng)一管理,我們可以通過(guò)IOC,AOP的思想,在跳轉(zhuǎn)之前和之后進(jìn)行操作。創(chuàng)建頁(yè)面的方法如下,我們可以傳入必要的參數(shù)。

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

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

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

CommonService

這里的Service的含義不是安卓中的Service,而是和服務(wù)端開發(fā)中的Service是類似。在組件化開發(fā)中,我們必須要養(yǎng)成一個(gè)良好的習(xí)慣——對(duì)接口進(jìn)行編程,對(duì)接口進(jìn)行編程可以增強(qiáng)程序的可擴(kuò)展性。在組件化開發(fā)中,我們可以建立了CommonService的模塊,我們將各個(gè)模塊的服務(wù)接口以及服務(wù)中需要對(duì)外暴露的數(shù)據(jù)結(jié)構(gòu)注冊(cè)在其中,具體的服務(wù)實(shí)現(xiàn)我們?cè)诜?wù)的提供者中去實(shí)現(xiàn),一個(gè)服務(wù)可以有多個(gè)實(shí)現(xiàn),在調(diào)用的模塊中,我們只需要調(diào)用接口即可。代碼如下,我們可以通過(guò)調(diào)整Name的不同,來(lái)切換不同服務(wù)的實(shí)現(xiàn)。這樣做可以有效減少服務(wù)提供者的改動(dòng)對(duì)服務(wù)調(diào)用者的影響。
使用Arouter中,我們只要接口繼承Arouter中的IProvider即可。

public interface CityServiceService extends IProvider {


}

使用時(shí),我們需要先注入后再使用。

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

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

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

Arouter中提供了頁(yè)面攔截器,攔截器在app中最常用的用法就是登陸鑒權(quán)攔截,我們可以建立登陸攔截器。我們只要在攔截器上加入@Interceptor即可啟用攔截器。
在登陸攔截器的場(chǎng)景中,假如我們檢測(cè)到用戶沒有登錄,頁(yè)面就必須跳轉(zhuǎn)到登錄界面,但是在模塊化編譯的時(shí)候極為不方便,因?yàn)檫@樣我們所調(diào)試的模塊就必須引入用戶登陸模塊,這違背我們組件化開發(fā)的初衷。所以我們?cè)诘顷憯r截器中,假如我們是組件化編譯。那么就使用假的用戶數(shù)據(jù),這個(gè)就不需要依賴用戶登錄模塊。當(dāng)然這個(gè)根據(jù)實(shí)際場(chǎng)景也可以引入用戶模塊進(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.頁(yè)面的降級(jí)處理

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

// 實(shí)現(xiàn)DegradeService接口,并加上一個(gè)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) {

}
}

我們?cè)诮M件化開發(fā)中,主要就用到了Arouter的這四個(gè)主要功能。今天的文章就先寫到這里。之后我們來(lái)聊聊有關(guān)于生命周期的管理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容