我的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)
在組件化開發(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)用
這里的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)于生命周期的管理醋界。