
Hybrid
輕量級(jí) H5 Native Hybrid 框架
輕量級(jí)litehybrid框架適合適合大多數(shù) app 的 H5 Native 交互的,交互原理較為簡單。
GitHub 地址:LiteHybrid。其代碼分兩部分,litehybird/ 為框架代碼。 example/ 為示例代碼,
原理:
1. 封裝原生 webview,使用 WebViewClient 與 WebChromeClient
2. H5 調(diào)用 Native 采用 js prompt 方式
3. Native 調(diào)用 H5 采用 loadurl API
使用說明:
1. errorview 和 loadingview 可以自定義
2. 對 WebView 設(shè)置可以通過 LHPreferences傳遞,如 agent等
3. 通過INVOKE注解,來使H5調(diào)用相應(yīng)Native函數(shù),參見INVOKE類,結(jié)構(gòu)合理。
使用方式:
其中,H5調(diào)用 native,以 JSONObject 方式傳遞調(diào)用信息,格式約定如下:
{
"invoke": "ANNOTATION_METHOD"
"paras": JSONObject
}
其中,"invoke" 值為字符串,對應(yīng)調(diào)用方法,如下文中 popToast。"paras" 為對應(yīng)參數(shù)信息,參數(shù)內(nèi)容約定為 JSONObject.
“ANNOTATION_METHOD” 聲明如下,參見 WebViewActivity 里的 Invoker1:
@INVOKE("popToast")
public void popToast(JSONObject msgObj) {
...
}
注意事項(xiàng):
1. 方法為 public,否則會(huì)有 IllegalAccessException
2. 方法約定一個(gè)參數(shù),JSONObject paras,為H5 傳遞來 paras 值
3. 方法 @INVOKE("popToast") 注解中的 popToast等字段,對應(yīng) H5 傳遞來的 XXX_METHOD,采用字符串對比方式定位應(yīng)該調(diào)用函數(shù)。
webview 使用經(jīng)驗(yàn)
H5頁面加載過程中的狀態(tài)處理
webview 通過WebViewClient 處理H5頁面加載過程中的狀態(tài),頁面加載時(shí)候, WebviewClient 給出的回調(diào)調(diào)用順序不同,通常使用的三種回調(diào)分析如下:
正常情況下
onPageStarted -> onPageFinished
失敗情況下:
onPageStarted -> onReceivedError -> onPageFinished
超時(shí)情況下:
onPageStarted -> 30s-> onReceivedError -> onPageFinished
在加載過程中重試:
onPageStarted -> 重試-> onPageFinished -> onPageStarted
H5內(nèi)JS的回調(diào)處理
webview 通過 WebChromeClient處理 H5 內(nèi)js的回調(diào),本框架使用了onJsPrompt方式,其他還有alert方式等。
其他
1. webview 在被銷毀后,litehybrid的 LHWebView 中有標(biāo)志位標(biāo)志進(jìn)行判斷,因?yàn)閣ebview銷毀后并不立即為空,再調(diào)用可能會(huì)引發(fā)異常。此處同Android SDK中的的 webviewfragment處理一致。
2. 提前超時(shí):提前超時(shí)時(shí),使用了 loadurl("about:blank") 進(jìn)行清除緩存,但loadurl("about:blank") 會(huì)重新執(zhí)行 webview 的生命周期,LHWebViewClient 有標(biāo)志位進(jìn)行處理。
3. 賬戶信息應(yīng)當(dāng)采用諸如cookie方式注入提取,example中未體現(xiàn)。
4. webview onPagefinished 后,js 不一定完全加載成功。最好方式是用JS的回調(diào)通知native調(diào)用H5內(nèi)js時(shí)機(jī)準(zhǔn)備好。
Please read the fucking source code, 不好的地方指出來相互學(xué)習(xí)