美團開源路由框架(WMRouter)學習——使用篇
前言
由於花了比較多的時間學習該框架,初步打算分三篇文章去介紹,分別是:使用篇,原始碼解析篇,以及關鍵技術解讀篇,歡迎關注探討。 ofollow,noindex">WMRouter
目前的困境及想法
由於筆主之前在一個搞教育行業的某某公司,該公司開發了一個整合app,裡面包括了“課前預習”、“課後複習”、“錯難題複習”、“筆譯”、“聽力練習”、“教室監控”等模組,另外還包括學生端和教師端,並且除了以模組的形式匯入到主工程還有獨立打包成單獨的app。由於最初是各自開發自己獨立的模組,沒有什麼溝通和約定的,所以最初的合併經歷了一段痛苦的煎熬,遇到了不小的挑戰初步形成了以下的結果

- 資源衝突:在所有的模組資源統一加上字首
- 引入依賴庫版本不同以及重複引用: 約定好一些公共的基礎庫(比如網路,圖片載入,資料解析等)
- 打包時間過長(我用的mac打包時間在10分鐘左右,同時用的windows 8g執行記憶體打包時間在40多分鐘):沒有徹底解決
- 主工程引用自module直接通過實現類實現跳轉未能實現介面分離:沒有解決
- 同層級的業務庫不好通訊:沒有解決
雖然筆主已經離開這家公司已經快一年時間,不過有時間總會回憶起以前採坑的種種。
在學習該框架之後,我會這樣的改進

按照官方的說法主要可以解決四個問題
- 通訊問題
- 複用問題
- 依賴注入
- 編譯問題
詳細參見 官方指導 或在文末檢視 參考連結
接下來介紹如何使用
使用
五個註解的使用
官方提供了五個註解,分別是 RouterUri
、 RouterService
、 RouterRegex
、 RouterProvider
、 RouterPage
,接下來分別介紹它們的使用
RouterUri
說明:可以註解在Activity(可以是類名字串或者是類)和UriHandler上
- String[] path :定義的路徑
- String scheme,host :定義協議和域名 根據協議和域名可以實現外部跳轉(具體下面會講如何跳轉)
- boolean exported: 是否允許外部跳轉
- Class[] interceptors:對Request攔截處理
例子
由於官方demo裡都有案例,這裡我就講一個demo沒有的情況:從其他app跳轉到指定的類
在官方demo裡有個類 UriProxyActivity
在AndroidManifest.xml定義了過濾條件( intent-filter
)
<data android:host="demo_host" android:scheme="demo_scheme" />
這裡我們在別的app啟動UriProxyActivity就可以通過
Intent intent = new Intent(); intent.setData(Uri.parse("demo_scheme://demo_host/not_exported")); startActivity(intent);
來進行跳轉,執行該跳轉發現彈出Toast “沒有許可權(403)”,說明跳轉成功,相應的改成 demo_scheme://demo_host/exported
則跳轉到 ExportedActivity
PS: ExportedActivity的exported 設定為true
NotExportedActivity設定為false
RouterService
說明:宣告一個Service,通過interface和key載入實現類。此註解可以用在任意類上
這算是一個工具,通過 Router
的相應方法可以直接獲取相應的實現類
相應的方法有
- <I, T extends I> T getService(Class<I> clazz, String key)
建立指定key的實現類例項,使用 {@link RouterProvider} 方法或無引數構造 - <I, T extends I> T getService(Class<I> clazz, String key, Context context)
建立指定key的實現類例項,使用Context引數構造 - <I, T extends I> List<T> getAllServices(Class<I> clazz)
建立所有實現類的例項,使用 {@link RouterProvider} 方法或無引數構造
為了方便使用,在router/method裡,還提供了各個引數方法,開發者可以通過 <T> T callMethod(String key, Object... args)
來呼叫方法的實現。
通過該註解可以很容易的實現通過介面實現模組間的通訊
RouterRegex
說明:指定一個正則匹配的跳轉,此註解可以用在Activity和UriHandler上
可以算是 RouterUri
的擴充套件,只不過它的匹配規則是通過正則表示式,這裡不作過多說明
RouterProvider
說明:指定一個靜態方法,用於構造Service
在前面介紹 RouterService
說過獲取介面實現類的時候都會事先獲取被RouterProvider註解過的靜態方法返回該實現類。
RouterPage
說明:指定一個內部頁面跳轉,此註解可以用在Activity和UriHandler上
該
該註解處理且只處理所有格式為 wm_router://page/* 的URI(參見 PageAnnotationHandler
)
其他
其它也沒什麼要介紹的了,官方的demo已經介紹的足夠詳細了
PS:驀然發現 發現這篇文章有點多餘!!!很多時間發覺看了原始碼之後,覺得自己寫出如何使用都顯得多此一舉。有興趣歡迎看我第二篇文章——原始碼解析篇。

天氣涼了,大家注意保暖
參考連結
https://tech.meituan.com/meituan_waimai_android_open_source_routing_framework.html
https://tech.meituan.com/meituan_food_delivery_android_architecture_evolution.html
https://github.com/meituan/WMRouter