文末有demo工程和相關lib,附帶aar
Android與Js通信的文章已經太多,而且都寫的非常詳細,這裡隻針對使用JsBridge的庫進行二次封裝使用進行介紹,使用簡單。
為什麼使用JsBridge?
Android 調用 Js 的方法 - Android 沒法拿到傳回值
Android調用Js方法時,需要手寫完整的Js腳本和參數,出錯幾率大
Js無法知道調用Android本地方法成功與否,需要Android再次調用相關的Js方法,增加前端和Android開發的互動難度。
JsBridge是'大頭鬼'為Android與Js互動寫的一個通用庫,解決了Android無法通過回調與Js互動的問題,并且封裝了Android與Js雙向的調用方法。
JsBridge 開源位址:https://github.com/lzyzsd/JsBridge
使用步驟
1引入library依賴/導入aar并依賴/直接複制lib中所有的類和assets檔案夾下的js注入檔案到工程、(由于隻是對開源庫進行的封裝,是以不再釋出到jCenter和mavenCentral)
2 将布局檔案中的WebView控件替換為BridgeWebView
圖2-1
3 初始化工具類,将bridgeWebView傳入
WebViewTools webViewTools = new WebViewTools(webView);
4-1 Js調用Android方法
注意:Js和Android方法的第一個參數需要兩端保持一緻,并且Js代碼必須使用window.WebViewJavascriptBridge.callHandler(x,y,function(data))這種類型的方法,因為在Android端進行的Js檔案的注入,如果不用該方法,Android端則與Js無法與正确互動
//Js代碼
//Js方法第一個參數為兩端約定好的方法名
//第二個參數為傳遞給Android的資料内容,String類型
//第三個參數為function回調
function testClick1() {
//喚起本地方法
window.WebViewJavascriptBridge.callHandler(
'callNative'
, {'data': 'data com from Js'}
, function(responseData) {
//responseData是Android回調給Js的資料
//注意responseData隻能是String類型
}
);
}
//Android端代碼
//第一個參數為兩端約定好的方法名
//第二個參數為方法回調
webViewTools.registerWebViewFunction("callNative", new JsCallBack() {
@Override
public void notifyNativeMethod() {
//喚起本地功能
}
@Override
public void JsData(String data) {
Log.d("WebViewTools", "Js傳遞過來的資料"+data);
}
@Override
public void CallBack(CallBackFunction function) {
function.onCallBack("傳遞給Js的資料内容");
}
});
4-2Android調用Js方法
注意:Js和Android方法的第一個參數需要兩端保持一緻,并且Js代碼必須使用 bridge.registerHandler(x, function(data, responseCallback){}因為在Android端進行的Js檔案的注入,如果不用該方法,Android端則與Js無法與正确互動
//Js代碼
bridge.registerHandler("callJs", function(data, responseCallback) {
//data為Android端傳遞過來的資料
responseCallback("回調給Android的資料");
});
//Android端代碼
webViewTools.callWebFunction("callJs", "data from Java", new JavaCallBack() {
@Override
public void onJsResponse(String data) {
Log.d("webViewTools", "Js的回調資料" + data);
}
});
這樣就完成了Android和Js的雙向調用,并且雙向都能通過回調進行相應的資料互動。因為暫時隻是使用了雙向的通信方法,更多的配置和使用請檢視原項目位址:JsBridge
相關資料: