Android路由框架Router分析詳解
什么是路由?說簡單點就是映射頁面跳轉(zhuǎn)關(guān)系的,當(dāng)然它也包含跳轉(zhuǎn)相關(guān)的一切功能。
路由框架的意義
Android系統(tǒng)已經(jīng)給我們提供了api來做頁面跳轉(zhuǎn),比如startActivity,為什么還需要路由框架呢?我們來簡單分析下路由框架存在的意義:
- 在一些復(fù)雜的業(yè)務(wù)場景下(比如電商),靈活性比較強,很多功能都是運營人員動態(tài)配置的,比如下發(fā)一個活動頁面,我們事先并不知道具體的目標(biāo)頁面,但如果事先做了約定,提前做好頁面映射,便可以自由配置。
- 隨著業(yè)務(wù)量的增長,客戶端必然隨之膨脹,開發(fā)人員的工作量越來越大,比如64K問題,比如協(xié)作開發(fā)問題。App一般都會走向組件化、插件化的道路,而組件化、插件化的前提就是解耦,那么我們首先要做的就是解耦頁面之間的依賴關(guān)系。
- 簡化代碼。數(shù)行跳轉(zhuǎn)代碼精簡成一行代碼。
- 其他...
工作流程圖
Router的工作流程簡要如下圖:

特性
Router有哪些特性或者有點呢?
- 簡單
- 鏈式調(diào)用,api友好
- 多路徑支持
- 結(jié)果回調(diào),每次跳轉(zhuǎn)都會回調(diào)跳轉(zhuǎn)結(jié)果
- 編譯期處理注解,沒有使用反射,不影響運行時性能
- 除了可以使用注解定義路由,還支持手動分配路由
- 自定義攔截器,可以對路由進行攔截,比如登錄判斷和埋點處理
- 自定義路由匹配規(guī)則,相比較其他路由框架,該項目并沒有寫死路由的匹配規(guī)則,除了內(nèi)置的幾個匹配器,用戶完全可以定義自己的規(guī)則
- 支持隱式Intent跳轉(zhuǎn)
- 支持多模塊使用,支持組件化開發(fā)
集成
集成過程也可參考項目主頁README。
1、在項目級的build.gradle中加入依賴:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.x ↑'
classpath 'com.chenenyu.router:gradle-plugin:latest.integration'
}
}
// Optional. Specify the dependencies version, default to the latest version.
ext {
...
routerVersion = "x.y.z"
compilerVersion = "x.y.z"
}
其中ext中的配置是可選的,用來指定依賴的router和注解處理器的版本,默認為最新的版本。
注意,Router需要使用2.2.0及以上版本的Android gradle plugin來處理注解處理器,截至寫作時,最新版本為2.3.0-beta2。
2、在module級的build.gradle中使用plugin:
apply plugin: 'com.android.application/library' apply plugin: 'com.chenenyu.router'
至此,集成工作就完成了,簡單的兩步:添加依賴插件和應(yīng)用插件。
使用
1、Router需要初始化,用于初始化路由表,建議放到Application中做:
public class App extends MultiDexApplication {
@Override
public void onCreate() {
super.onCreate();
// 初始化
Router.initialize(this);
// 開啟log
if (BuildConfig.DEBUG) {
Router.openLog();
}
}
}
2、添加注解
// 單路徑注解
@Route("test")
public class TestActivity extends Activity {
...
}
// 多路徑注解,這幾個注解都能打開該Activity
@Route({"user", "example://user", "http://example.com/user"})
public class UserActivity extends Activity {
...
}
3、發(fā)起路由操作
// 最簡單的路由跳轉(zhuǎn),打開TestActivity
Router.build("test").go(context);
// 其他部分api
Router.build("user")
.requestCode(int) // 調(diào)用startActivityForResult
.extras(bundle) // 攜帶跳轉(zhuǎn)參數(shù)
.addFlags(flag) // 添加標(biāo)記,比如intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
.anim(enter, exit) // 添加跳轉(zhuǎn)動畫
.callback(calback) // 跳轉(zhuǎn)結(jié)果回調(diào)
.go(context);
進階
自定義路由表
Router除了可以使用注解來做映射,還支持在代碼中自定義:
// 動態(tài)添加路由
Router.addRouteTable(new RouteTable() {
@Override
public void handleActivityTable(Map<String, Class<? extends Activity>> map) {
map.put("dynamic", DynamicActivity.class);
}
});
即路由表由兩部分組成,一部分是注解,另一部分是手動添加的。
攔截器
Router支持攔截器的配置,比如在跳轉(zhuǎn)前做登錄狀態(tài)的校驗,
Router.addRouteInterceptor(new RouteInterceptor() {
@Override
public boolean intercept(Context context, @NonNull Uri uri, @Nullable Bundle extras) {
// operation.
return false;
}
});
intercept方法返回true即表示攔截該路由,false表示不攔截。攔截器可以添加多個,依次調(diào)用,方便協(xié)作開發(fā)。
自定義路由解析規(guī)則
該功能是Router的特色功能之一。由于每個產(chǎn)品的業(yè)務(wù)都不一樣,靈活的路由處理規(guī)則是十分必要的。用戶可以借鑒Router內(nèi)置的幾個匹配器(Matcher),來實現(xiàn)自己的規(guī)則。
內(nèi)置的Matcher
Router目前內(nèi)置了4個Matcher,已經(jīng)能適用絕大部分業(yè)務(wù)場景,優(yōu)先級從高到低分別是SimpleMatcher(0x1000)、SchemeMatcher(0x0100)、ImplicitMatcher(0x0010)、BrowserMatcher(0x0000),優(yōu)先級高的Matcher會優(yōu)先匹配。
自定義Matcher
自定義的Matcher需要繼承Matcher抽象類,指定該Matcher的優(yōu)先級,并實現(xiàn)兩個抽象方法:
// 返回true表示當(dāng)前路由被該Matcher匹配,返回false則會繼續(xù)匹配其他Matcher public abstract boolean match(Context context, Uri uri, @Nullable String route, RouteOptions routeOptions); // match方法返回true后會調(diào)用該方法,用來生成一個Intent對象 public abstract Intent onMatched(Context context, Uri uri, @Nullable Class<? extends Activity> target);
然后調(diào)用Router.registerMatcher(new CustomMatcher(int priority));來注冊自定義的Matcher。
Matcher支持配置多個,會依次進行匹配。
其他
獲取Intent
Intent intent = Router.build(uri).getIntent(context);,即可獲取一個符合路由規(guī)則Intent對象,然后你可以使用這個intent來跳轉(zhuǎn),或者發(fā)一個通知。
顯示log
在調(diào)試過程中,可能需要打印Router相關(guān)的log,通過Router.openLog()即可打開,建議在debug環(huán)境下打開。
總結(jié)
Router是一個十分小巧靈活的路由框架,代碼設(shè)計也很優(yōu)雅簡潔,且完美支持組件化開發(fā),目前仍在不斷地迭代中。
源碼地址為:Router_jb51.rar
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android layoutAnimation詳解及應(yīng)用
這篇文章主要介紹了Android layoutAnimation詳解及應(yīng)用的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android實現(xiàn)省市區(qū)三級聯(lián)動
這篇文章主要為大家詳細介紹了Android實現(xiàn)省市區(qū)三級聯(lián)動,Spinner實現(xiàn)省市區(qū)的三級聯(lián)動,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
Android IPC機制ACtivity綁定Service通信代碼實例
這篇文章主要介紹了Android IPC機制ACtivity綁定Service通信代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
Android實現(xiàn)仿excel數(shù)據(jù)表格效果
這篇文章主要介紹了Android實現(xiàn)仿excel數(shù)據(jù)表格效果的實現(xiàn)代碼,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-10-10
總結(jié)Android中MD風(fēng)格相關(guān)控件
自Android5.0發(fā)布以來,谷歌推出全新的Material Desigen設(shè)計風(fēng)格,時過一年多了,在國內(nèi)也看到很多應(yīng)用在慢慢適應(yīng)MD設(shè)計風(fēng)格。今天小編給大家總結(jié)下Android中MD風(fēng)格相關(guān)控件的知識,有需要的可以參考學(xué)習(xí)。2016-08-08

