RouterKit: 一款多是最容易使用的頁面、服務的路由框架。使用APT實現。

Jet RouterKit

路由庫;一款Android平臺對頁面、服務的路由框架。自動化且易用。
html

原理圖
原理圖

  • 基於APT技術(註解-編譯時生成代碼,不反射,無性能損耗),經過註解方式來實現URL打開Activity功能或 執行特定動做
  • 並支持在WebView和外部瀏覽器使用,支持路由表維護,降級訪問等;
  • 使用Jet技術支持Bundle、Intent,Uri參數自動注入頁面並轉換參數類型。
  • English Version

方案對比

實現功能 RouterKit Airbnb 的DeepLinkDispatch 阿里 ARouter 天貓 統跳協議 ActivityRouterGithub上Star最多
路由註冊 註解式APT自動註冊 每一個module都要手動註冊 每一個module的路由表都要APT類查找 AndroidManiFest配置 每一個module都要手動註冊
路由查找 路由表 路由表 路由表 系統Intent 路由表
路由分發 Activity轉發 Activity轉發 Activity轉發 Activity轉發 Activity轉發
動態替換 主線程 不支持 線程等待 不支持 不支持
動態攔截 主線程 不支持 線程等待 不支持 主線程
安全攔截 主線程 不支持 線程等待 不支持 主線程
方法調用 手動拼裝 手動拼裝 手動拼裝 手動拼裝 手動拼裝
參數獲取 JET 依賴自動注入,支持全部類型 參數定義在path,不利於多人協做 Apt依賴注入,可是要手動調用get方法 手動調用 手動調用
結果返回 onActivityResult onActivityResult onActivityResult onActivityResult onActivityResult
支持多Module 支持 不支持 支持 不支持 支持

總體相似 阿里開源的ARoute 功能;移除分組概念,強化多Module編譯和自動註冊路由表,會更通用。前端

特點:

  1. 支持註解方式,APT編譯器自動註冊Activity 和Action(相似Struts裏面的Action)
  2. 支持自動注入Intent,Bundle、Uri裏的參數到頁面使用Jet
  3. 支持外部瀏覽器打開。
  4. 支持HTTP協議。
  5. 支持多個Module。
  6. 支持Uri 跳轉和 Action 執行;
  7. 路由表自動初始化,也能夠手動再維護;
  8. 支持服務端下發路由配置,簡單支持頁面降級功能;

功能:

  • Apt實現自動路由註冊,支持多Module
  • 路由表維護
  • Activity轉發 和 Action轉發(支持URI頁面跳轉和方法調用)

原理圖

原理圖
原理圖

URI定義
URI定義

典型應用

  1. 從外部URL映射到內部頁面,以及參數傳遞與解析
  2. 跨模塊頁面跳轉,模塊間解耦
  3. 攔截跳轉過程,處理登錄、埋點等邏輯
  4. 跨模塊API調用,經過控制反轉來作組件解耦

使用範例

  • 聲明1: 頁面跳轉
@JUri("/home")
public class IntentActivity extends AppCompatActivity {
    // Uri 的參數經過 Intent傳遞進來, 推薦使用Jet自動讀取;
    .....
    //
}複製代碼
  • or 聲明2: 服務功能調用:
    ```java
    //支持,多個地址 @JUri(array={"/home","/action"})
    @JUri("/action")
    public class TestAction extends Action {
    Context context = MyApplication.getContext();vue

    @Override
    public void run(Map queryMap) {java

    super.run(queryMap);
      //Uri 裏面的參數經過Map傳遞進來
      String result = (String) queryMap.get("param");
      Toast.makeText(context, "Test Action: " + result, Toast.LENGTH_SHORT).show();複製代碼

    }
    }android

- 方法調用

```java
    // 儘量早,推薦在Application中初始化,初始化路由表
    Router.getInstance().init(mApplication);


    // 方式一
    String uri = "meiyou:///home";
    Router.getInstance().run(uri);

    // 方式二
    Router.getInstance().run(context, Uri.parse("meiyou:///second?uid=233"));

    // 方式三
    // 若是AndroidManifest.xml註冊了RouterCenterActivity,也能夠經過下面的方式打開,若是是APP內部使用,不建議使用。
    // startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("meiyou:///home?uid=233")));複製代碼

從外部瀏覽器、其它APP打開

只要在AndroidManifest.xml註冊了RouterCenterActivity,便可變成經典的Uri打開,能夠支持外部瀏覽器、其它APP打開內部的Activity。ios

<activity android:name="com.meiyou.router.RouterCenterActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="test" />
    </intent-filter>
</activity>複製代碼
// Java代碼調用
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("meiyou:///second?uid=233&name=Wiki")));

// HTML方式,系統瀏覽器(不支持微信,微信內部開網頁會禁止全部的Scheme)
<a href="test:///second?uid=233&name=Wiki">打開JoyrunApp的SecondActivity</a>複製代碼

支持攔截器,典型應用就是:某些URI須要受權才能訪問

經過前置攔截器能夠對URL進行攔截,能夠經過攔截器對URL進行修改,也能夠攔截URL,不讓路由器打開。git

Router.addInterceptor(new UriInterceptor() {
    public String beforeExecute(InterceptorData data) {
        //return url.replace("test://www.XXX.com/","test://");
        return data;
    }
});複製代碼

支持 設置Scheme ,只有容許的Scheme纔有效;才容許路由分發

Router.addScheme("meiyou");複製代碼

集成

在gradle文件配置:github

//內部版本:0.0.1-SNAPSHOT
compile "com.meiyou.framework:router:1.0.0"複製代碼

混淆

常見問題

TODO

  • JUri 支持數組數據(fixed)
  • Module傳遞依賴解決 (fixed)
  • 自定義 註解實現,能夠再自定義額外的路由表,實現自定義的註解的路由,Door接口的優化
  • Gradle Plugin實現,APT 主工程 須要配置編譯過程問題
  • 攔截器排序,優先級 priority
  • 路由匹配規則Matcher功能升級, Pattern 模式匹配
  • 調用方式接口化,like: retrofit;
  • 路由結果回調? isNeed?
  • Kotlin版本實現
  • 路由表初始化異步線程化
  • 安全性
  • like Express, 攔截器,中間件化?

交流羣:

QQ羣:547612870 express

相關文章
相關標籤/搜索