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編譯和自動註冊路由表,會更通用。
特色:
- 支援註解方式,APT編譯器自動註冊Activity 和Action(類似Struts裡面的Action)
- 支援自動注入Intent,Bundle、Uri裡的引數到頁面使用Jet
- 支援外部瀏覽器開啟。
- 支援HTTP協議。
- 支援多個Module。
- 支援Uri 跳轉和 Action 執行;
- 路由表自動初始化,也可以手動再維護;
- 支援服務端下發路由配置,簡單支援頁面降級功能;
功能:
- Apt實現自動路由註冊,支援多Module
- 路由表維護
- Activity轉發 和 Action轉發(支援URI頁面跳轉和方法呼叫)
原理圖
典型應用
- 從外部URL對映到內部頁面,以及引數傳遞與解析
- 跨模組頁面跳轉,模組間解耦
- 攔截跳轉過程,處理登陸、埋點等邏輯
- 跨模組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"複製程式碼
混淆
常見問題
- Intent引數自動注入IOC - Jet
- 參考Android 元件化 —— 路由設計最佳實踐
- 開源最佳實踐:Android平臺頁面路由框架ARouter
- iOS 元件化 —— 路由設計思路分析
- [前端元件化]Vue.js And React 元件化(halfrost.com/vue_ios_mod…)
- LiteRouter模仿retrofit,各個業務分根據需求約定好介面,就像一份介面文件一樣
- routable-android 模式匹配方式的路由
- NodeJs-Express 路由框架
TODO
- JUri 支援陣列資料(fixed)
- Module傳遞依賴解決 (fixed)
- 自定義 註解實現,可以再自定義額外的路由表,實現自定義的註解的路由,Door介面的優化
- Gradle Plugin實現,APT 主工程 需要配置編譯過程問題
- 攔截器排序,優先順序 priority
- 路由匹配規則Matcher功能升級, Pattern 模式匹配
- 呼叫方式介面化,like: retrofit;
- 路由結果回撥? isNeed?
- Kotlin版本實現
- 路由表初始化非同步執行緒化
- 安全性
- like Express, 攔截器,中介軟體化?
交流群:
QQ群:547612870