移動開發的跨平臺與快速發佈一直是開發者的追求,也是技術的一個發展趨勢,如今各大廠開始有了本身的大前端團隊,因此咱們也開始了本身的探索,目前來講主要有兩種思路:javascript
Hybrid App
表明:Cordova
Webview
加載Web
頁面,在Native
和Web
頁面之間創建雙向通訊H5
代碼Native
化 表明:ReactNative
,Weex
等Api
,把H5
代碼編譯成二進制代碼直接運行 其實關於這兩種思路對比,網上有不少大牛分析的很全面了,總結來講各有利弊很難完美,本篇文章咱們主要講一下Hybrid App實踐,採用先後端分離以及單頁應用技術開發Web
頁面,使用WebView
加載Web
頁面,並經過JS
通訊提供一些Native
層的支持,經過接口獲取差別化頁面資源文件,在本地整合更新,還能夠達到熱更新的需求。在我看來此方案更適用於須要快速發佈、多端兼容、對性能要求稍低的業務,正好符合咱們的需求。 html
這裏我整理了Android
端會用到代碼,包含JS
通訊,文件處理工具類,閃屏輔助類和WebView
的封裝。
Github地址:github.com/free46000/H…,請你們多多關注,因爲源碼並無完善,因此暫時沒有發佈到Maven
倉庫前端
既然肯定了方向,那麼就應該肯定具體的方案了,經過本身的經驗和網上資料整理,畫了時序圖:
java
按照圖上的時序,接下來講一下每一步中的實踐,以及碰到的坑。下面講解git
Html
相關資源文件壓縮後放在assets
文件夾下便可閃屏頁展現
因爲上面的解壓資源,還有Webview
初始化、JS
的加載執行、html
的渲染都是耗時操做,而且都是發生在Html
展現以前,因此咱們選擇把閃屏頁用Native
原生代碼來編寫,採用覆蓋WebView
所在頁面的方案,這樣在閃屏頁隱藏的時候,用戶就能夠看到業務界面,提高用戶體驗。
注:另外提供Android
兩種閃屏優化的小技巧,使用透明主題或者設置主題背景圖片程序員
加載本地Html頁面
直接使用WebView#loadUrl()
加載本地資源文件便可。因爲WebView
加載不一樣頁面會出現閃屏的問題,因此咱們採用Vue + Vue Router
構建單頁應用。
這裏Vue Router
會有一個小坑,提醒你們注意一下:Vue Router
默認採用hash
模式,會有一個醜陋的#
符號,做爲一個有追求的程序員怎麼能容許這種很醜的hash
,一種更優雅的方式使用HTML5 History
模式,可是不幸的是,加載本地資源文件的方式並不能正常解析HTML5 History
模式的url
,因此只能採用hash
模式。github
數據請求
爲了節省用戶的流量和時間,須要把Html
資源文件存儲在本地,這樣數據的請求必須在客戶端完成。有兩種方案供選擇:
一是Native
層攔截並請求數據再返回給Html
層去展現,這樣會增長工做量,也不利於職責的分離,因此放棄。
二是直接使用JS
請求數據,這樣會出現跨域訪問的問題,相比較來講仍是這個比較容易解決的,採用CORS
便可後端
Native調用JSNative
層調用JS
比較簡單,執行一段JS
代碼便可,如:javascript:callJS()
跨域
JS調用NativeJS
層調用Native
,在Android
上來講主要分爲三種:
一:經過WebView#addJavascriptInterface()
進行映射,使用起來簡單,可是有安全風險,棄用
二:自定義協議而後由Native
層攔截並解析請求,使用起來複雜,容易和業務耦合,也不是最優選,棄用
三:攔截JS#prompt()
方法並解析,使用起來複雜,可是比第一種更安全,比第二種靈活,因此使用此方案安全
資源文件採起差別化更新方案,本地存儲一個標識,能夠爲版本號或者更新時間,這個能夠和後端同窗一塊兒商量肯定。
資源文件下載還有推送之類的因爲Html
的侷限性,因此仍是直接由Native
層作比較合適,下面簡單講解下應用中的兩種更新方式:
根據差別化清單對資源文件進行整合,存放在臨時目錄中,而後在第二次打開應用時更換,並展現更新後的界面,達到熱更新的效果。
本文只是歸納的講告終構的內容,可能會遺漏一些要點,若是你們有什麼問題歡迎留言或者去GitHub
上提交issue
做者開源了一個優雅的實現多類型的RecyclerView類庫 支持DataBinding Form表單錄入,跨多個RecyclerView拖動 Github地址:github.com/free46000/M…