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

Tony_Meiyou發表於2017-10-25

Jet RouterKit

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

原理圖
原理圖

  • 基於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();

    @Override
    public void run(Map queryMap) {

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

    }
    }

- 方法呼叫

```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。

<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,不讓路由器開啟。

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檔案配置:

//內部版本: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

相關文章