編輯:關於Android編程
什麼是路由?說簡單點就是映射頁面跳轉關系的,當然它也包含跳轉相關的一切功能。
路由框架的意義
Android系統已經給我們提供了api來做頁面跳轉,比如startActivity,為什麼還需要路由框架呢?我們來簡單分析下路由框架存在的意義:
工作流程圖
Router的工作流程簡要如下圖:

特性
Router有哪些特性或者有點呢?
集成
集成過程也可參考項目主頁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'
至此,集成工作就完成了,簡單的兩步:添加依賴插件和應用插件。
使用
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、發起路由操作
// 最簡單的路由跳轉,打開TestActivity
Router.build("test").go(context);
// 其他部分api
Router.build("user")
.requestCode(int) // 調用startActivityForResult
.extras(bundle) // 攜帶跳轉參數
.addFlags(flag) // 添加標記,比如intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
.anim(enter, exit) // 添加跳轉動畫
.callback(calback) // 跳轉結果回調
.go(context);
進階
自定義路由表
Router除了可以使用注解來做映射,還支持在代碼中自定義:
// 動態添加路由
Router.addRouteTable(new RouteTable() {
@Override
public void handleActivityTable(Map<String, Class<? extends Activity>> map) {
map.put("dynamic", DynamicActivity.class);
}
});
即路由表由兩部分組成,一部分是注解,另一部分是手動添加的。
攔截器
Router支持攔截器的配置,比如在跳轉前做登錄狀態的校驗,
Router.addRouteInterceptor(new RouteInterceptor() {
@Override
public boolean intercept(Context context, @NonNull Uri uri, @Nullable Bundle extras) {
// operation.
return false;
}
});
intercept方法返回true即表示攔截該路由,false表示不攔截。攔截器可以添加多個,依次調用,方便協作開發。
自定義路由解析規則
該功能是Router的特色功能之一。由於每個產品的業務都不一樣,靈活的路由處理規則是十分必要的。用戶可以借鑒Router內置的幾個匹配器(Matcher),來實現自己的規則。
內置的Matcher
Router目前內置了4個Matcher,已經能適用絕大部分業務場景,優先級從高到低分別是SimpleMatcher(0x1000)、SchemeMatcher(0x0100)、ImplicitMatcher(0x0010)、BrowserMatcher(0x0000),優先級高的Matcher會優先匹配。
自定義Matcher
自定義的Matcher需要繼承Matcher抽象類,指定該Matcher的優先級,並實現兩個抽象方法:
// 返回true表示當前路由被該Matcher匹配,返回false則會繼續匹配其他Matcher public abstract boolean match(Context context, Uri uri, @Nullable String route, RouteOptions routeOptions); // match方法返回true後會調用該方法,用來生成一個Intent對象 public abstract Intent onMatched(Context context, Uri uri, @Nullable Class<? extends Activity> target);
然後調用Router.registerMatcher(new CustomMatcher(int priority));來注冊自定義的Matcher。
Matcher支持配置多個,會依次進行匹配。
其他
獲取Intent
Intent intent = Router.build(uri).getIntent(context);,即可獲取一個符合路由規則Intent對象,然後你可以使用這個intent來跳轉,或者發一個通知。
顯示log
在調試過程中,可能需要打印Router相關的log,通過Router.openLog()即可打開,建議在debug環境下打開。
總結
Router是一個十分小巧靈活的路由框架,代碼設計也很優雅簡潔,且完美支持組件化開發,目前仍在不斷地迭代中。
源碼地址為:Router_jb51.rar
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
Android動畫之補間動畫(Tween Animation)實例詳解
本文實例講述了Android動畫之補間動畫。分享給大家供大家參考,具體如下:前面講了《Android動畫之逐幀動畫(Frame Animation)》,今天就來詳細講解一
Android中Spinner控件之鍵值對用法實例分析
本文實例講述了Android中Spinner控件之鍵值對用法。分享給大家供大家參考。具體如下:一、字典表,用來存放鍵值對信息package com.ljq.activit
Android開發筆記(一百零九)利用網盤實現雲存儲
網盤存儲個人開發者往往沒有自己的後台服務器,但同時又想獲取app的運行信息,這就要借助於第三方的網絡存儲(也叫網盤、雲盤、微盤等等)。通過讓app自動在網盤上存取文件,可
Android 動畫系列之屬性(Property)動畫詳解
前言今天有時間來繼續寫寫屬性動畫。簡介眾所周知,屬性動畫是Android3.0版本開始的,一個東西的推出肯定是有它的道理的,那為什麼前面已經有逐幀和補間動畫了還要推出屬性