Android hybrid 開發實踐(android webview)
阿新 • • 發佈:2018-11-02
關於Android 和 h5 hybrid 開發的實踐在網上有很多,Android自身就有一個webview,很多實踐都是通過webview來實現的,以下是記錄一下自己的實踐。
1、Android與H5通訊方式
主要有兩種:有基於url攔截的,也有基於prompt攔截的。 Android上面最火的這個開源專案 JsBridge就是基於url來進行攔截的2、JsBridge原理和用法
原理 Android呼叫H5:通過webview類的loadUrl方法可以直接執行js程式碼,類似瀏覽器位址列輸入一段js一樣的效果webview.loadUrl("javascript: alert('hello world')");
H5呼叫Android:webview可以攔截H5發起的任意url請求,webview通過約定的規則對攔截到的url進行處理(消費),即可實現H5呼叫Android
var ifm = document.createElement('iframe');
ifm.src = 'jsbridge://namespace.method?[...args]';
JsBridge上面已經封裝了一層協議了,關於協議的設定我們之前有這篇文章Android自定義UrlSchema。所以如果要自定義一套協議的話,可以參考下面這個方式
schema即自行約定的私有協議,一般是公司名或者應用名schema://classname/method?value={} // Android會收到這個url
classname/method這兩個一起,指定API名稱,classname可以是Android的類名,當然也可以只是一個普通字串(如namespace),只要Android方便識別即可
value是與method對應的引數
請求示例:
// H5直接指定包名和方法名,這樣更容易擴充套件 iframe.src = `myschema://com.mycompany.hybrid.InteractHandler/toast?value={msg: 'hello world'}` // 用約定的字串也可以,Android拿到之後自己再做一次map iframe.src = `myschema://interact/toast?value={msg: 'hello world'}
JsBridge用法1:
java註冊handler方法以供h5裡面的js呼叫
webView.registerHandler("submitFromWeb", new BridgeHandler() {
@Override
public void handler(String data, CallBackFunction function) {
Log.i(TAG, "handler = submitFromWeb, data from web = " + data);
function.onCallBack("submitFromWeb exe, response data from Java");
}
});
js可以通過下面的方式呼叫這個的java handler的“submitFromWeb”方法
WebViewJavascriptBridge.callHandler(
'submitFromWeb'
, {'param': str1}
, function(responseData) {
document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData
}
);
JsBridge用法2:
js註冊handler方法以供Java裡面的程式碼呼叫
WebViewJavascriptBridge.registerHandler("functionInJs", function(data, responseCallback) {
document.getElementById("show").innerHTML = ("data from Java: = " + data);
var responseData = "Javascript Says Right back aka!";
responseCallback(responseData);
});
java裡面可以通過以下方式來呼叫這個js handler的“functionInJs"方法
webView.callHandler("functionInJs", new Gson().toJson(user), new CallBackFunction() {
@Override
public void onCallBack(String data) {
}
});
3、使用過程中的問題
1、最主要有一個是效能問題,通過iframe的src來進行跳轉會遇到載入慢的問題,存在js已經載入完了,但是bridge還沒有ready的情況,以至於有些情況下前端任務這個時間差太長了
2、是否存在jsbridge載入失敗,可以通過cookiemanager傳遞一些內容?
3、使用者資訊的傳遞,通過token來傳遞
4、js中如何加上許可權控制?java中如何控制js中程式碼的許可權? 參考各種h5型別的開放平臺實現
4、結語
效能問題可以考慮不採用url方式,而採用promt方式來實現?