基础知识
JS和Native之间的通信方式
在Android开发中,能实现Javascript与Native代码通信的,有4种途径:
1.JavascriptInterface
2.WebViewClient.shouldOverrideUrlLoading()
3.WebChromeClient.onConsoleMessage()
4.WebChromeClient.onJsPrompt()Native调用Javascript使用loadUrl()方法。
此处涉及到了WebViewClient和WebChromeCLient:
WebViewClient主要帮助WebView处理各种通知、请求事件的,比如:
- onPageStarted(WebView view, String url, Bitmap favicon)
- onPageFinished(WebView view, String url)
- onLoadResource(WebView view, String url)
- onReceivedError(WebView view, int errorCode, String description, String failingUrl)
- onReceivedHttpAuthRequest(WebView view,HttpAuthHandler handler, String host, String realm)
- shouldOverrideUrlLoading(WebView view, String url)//将在webview上点击的url传递过来,java代码决定是否拦截WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等比如
- onProgressChanged(WebView view, int newProgress)
- onReceivedTitle(WebView view, String title)
- onReceivedIcon(WebView view, Bitmap icon)
- onJsAlert(WebView view, String url, String message,JsResult result)//JS需要弹出警告框
- onJsConfirm(WebView view, String url, String message,JsResult result)//JS需要弹出确认框
- onJsPrompt(WebView view, String url, String message,String defaultValue, JsPromptResult result)//JS需要弹出提示信息
- onCloseWindow(WebView window)
JsBridge的实现
JsBridge中,JAVA和JS互相调用前,都需要注册方法。
//Native中注册方法,提供给JS调用(非webview原生方法,需要自定义)
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中注册方法,提供给Native调用
bridge.registerHandler("functionInJs", function(data, responseCallback) {
document.getElementById("show").innerHTML = ("data from Java: = " + data);
var responseData = "Javascript Says Right back aka!";
responseCallback(responseData);
});
JAVA注册方法:
自定义webview调用registerHandler(String h