Android3个页面跳转代码,从零开始Android组件化改造(三) - 页面跳转与路由组件...
組件化與傳統(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的方式進行頁面之間的跳轉(zhuǎn),Arouter將會把你的第一層路徑作為你的Group名,所以在組件化開發(fā)中,我們將模塊名作為Group的名稱,并且保證每一個模塊的名字是不一樣的,建議每個模塊以自己的模塊名作為Group名,因為Arouter會在編譯階段生成ARouter$$Group$GroupName.java的文件,所以假如在兩個模塊中相同GroupName,程序就會報錯,同時為了路由的初始化不引導(dǎo)到系統(tǒng)的性能,一個Group內(nèi)不應(yīng)該包含過多的頁面,Arouter是分批加載的。我們可以在通用的資源目錄下建立RounterHub來進行路徑的分組管理。Arouter的功能非常強大,它不僅可以給Activity添加路由,還可以給Fragment,Service也添加路由,統(tǒng)一添加到路由后,我們就可以把所有頁面納入路由的統(tǒng)一管理,我們可以通過IOC,AOP的思想,在跳轉(zhuǎ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ù)的遠程調(diào)用
CommonService
這里的Service的含義不是安卓中的Service,而是和服務(wù)端開發(fā)中的Service是類似。在組件化開發(fā)中,我們必須要養(yǎng)成一個良好的習(xí)慣——對接口進行編程,對接口進行編程可以增強程序的可擴展性。在組件化開發(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ù),這個就不需要依賴用戶登錄模塊。當然這個根據(jù)實際場景也可以引入用戶模塊進行調(diào)試。
@Interceptor(priority = 5, name = "登錄攔截器")
public class LoginInterceptor implements IInterceptor {
private String[] needLoginPath = {
};
private List 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來進行模塊間的通訊而不是直接引用。但是模塊移出引用,Arouter是無法實例化頁面的,當然這種情況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)于生命周期的管理。
總結(jié)
以上是生活随笔為你收集整理的Android3个页面跳转代码,从零开始Android组件化改造(三) - 页面跳转与路由组件...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android局部布局替换,Androi
- 下一篇: 华为12月份鸿蒙适配mate40,华为: