Why?
- Route(路由)眾所周知是網絡中的名次,具體來說是指IP層協議的內容,路由協議主要有OSPF、RIPS、BGP,那么Android里的Route指的是什么呢?
- Android里的Route也如同IP層的Route一樣,作用類似尋址,但是尋的“址”并不是IP地址,而是頁面,試想以下場景:
- 實際開發中某個點擊事件要求跳轉某個頁面,但是在開發過程中并不能確定是要跳轉到Activity A or B or C, 如果PM突然改變了跳轉邏輯,按照最傳統的方法我們只能修改代碼發布新的apk,或者先進一點吧,采用熱修復,但是無論怎么樣其實都只是修改一個跳轉的目標Activity罷了,都要讓用戶機器上的重新編譯相關代碼,而其實變化的只是半行代碼。這點繁瑣&簡單工作都不應該再交付給程序員,但是PM又不寫代碼,那應該怎么樣才能完美解決這個問題呢?
- Route則克服了相應的缺點:
- Route在編碼階段,建立對應的映射表/路由表,根據Server(后臺)提供的一個標識符(Uri)來選擇已經編寫好的頁面。這個頁面可以是我們最熟悉的Activity,也可以是承載在WebView上的H5(當然,這兩句話是廢話)。
- 對比傳統方式:優勢不言而喻,無需重新提審,無需讓用戶Update
- 對比熱修復:熱修復也無需用戶顯示Update,對用戶是隱式的,也是利用Server進行動態更新,但是熱修復到手機上還是要進行代碼更新,即修改對應的dex文件,而Route不需要更改dex,一方面熱修復的方式做了不必要的操作,是一種效率上的低下;另一方面,熱修復到底還是要編寫新代碼的,而Route只要修改Server發來的標識符(Uri)即可,這樣的操作是可以不需要程序員的:
- 只要響應的前端開發者為PM寫好對應的UI,讓他們選擇對應的標識符,就可以讓非技術人員修改頁面跳轉了
How?
說起來很玄幻,但是其實實現起來并不難(但是第一個提出這種思想的人依舊很牛)
-
Route是通過Uri來確定目的跳轉頁面,Uri的格式是
? scheme: scheme-part
scheme可以是自己定義的,比如說activity://testModule/testActivity,然后Route的框架通過解析這個Uri創建一個Intent(或者其他啟動信息類,比如用來使用H5頁面),啟動對應的頁面,即有一個對應的路由表用來映射Uri和對應的頁面跳轉
一個優秀的Route框架應該是可以自動收集每個頁面,建立Uri和UI的映射關系,生成路由表相應表項(可以通過Annotations來幫助框架收集)
Conclusion
- 要實現一個簡單的Router其實并不難,重要的是思想;但如果你想要實現一個優雅的、接口靈活的Router,那工作量還是挺大的:比如說可能要借助注解,要利用Gradle插件自動匹配Uri和UI以生成路由表
Library
- AndRouter
- ...