国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android路由框架Router分析詳解

2019-12-12 03:46:29
字體:
來源:轉載
供稿:網友

什么是路由?說簡單點就是映射頁面跳轉關系的,當然它也包含跳轉相關的一切功能。

路由框架的意義

Android系統已經給我們提供了api來做頁面跳轉,比如startActivity,為什么還需要路由框架呢?我們來簡單分析下路由框架存在的意義:

  • 在一些復雜的業務場景下(比如電商),靈活性比較強,很多功能都是運營人員動態配置的,比如下發一個活動頁面,我們事先并不知道具體的目標頁面,但如果事先做了約定,提前做好頁面映射,便可以自由配置。
  • 隨著業務量的增長,客戶端必然隨之膨脹,開發人員的工作量越來越大,比如64K問題,比如協作開發問題。App一般都會走向組件化、插件化的道路,而組件化、插件化的前提就是解耦,那么我們首先要做的就是解耦頁面之間的依賴關系。
  • 簡化代碼。數行跳轉代碼精簡成一行代碼。
  • 其他...

工作流程圖

Router的工作流程簡要如下圖:


特性

Router有哪些特性或者有點呢?

  • 簡單
  • 鏈式調用,api友好
  • 多路徑支持
  • 結果回調,每次跳轉都會回調跳轉結果
  • 編譯期處理注解,沒有使用反射,不影響運行時性能
  • 除了可以使用注解定義路由,還支持手動分配路由
  • 自定義攔截器,可以對路由進行攔截,比如登錄判斷和埋點處理
  • 自定義路由匹配規則,相比較其他路由框架,該項目并沒有寫死路由的匹配規則,除了內置的幾個匹配器,用戶完全可以定義自己的規則
  • 支持隱式Intent跳轉
  • 支持多模塊使用,支持組件化開發

集成

集成過程也可參考項目主頁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則會繼續匹配其他Matcherpublic 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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 奉节县| 洮南市| 确山县| 宝清县| 庄浪县| 宁乡县| 印江| 潍坊市| 韩城市| 阿瓦提县| 东兴市| 崇州市| 肥西县| 库车县| 宁明县| 三门峡市| 太和县| 巴塘县| 凤阳县| 兴安县| 米脂县| 寿光市| 宝丰县| 新平| 漳浦县| 宜川县| 莱芜市| 江油市| 柘城县| 盐城市| 上犹县| 昆山市| 古交市| 甘泉县| 宁化县| 阿拉善右旗| 格尔木市| 五河县| 福州市| 兰西县| 巩义市|