
与h5的交互
2018, Jul 01
JSBridge 原理
- 设置具备与js交互的能力,通过mWebView.addJavascriptInterface的方式将JavaScriptinterface对象交给页面(WebView.addJavascriptInterface接口向Web页面注入Java对象,页面Javascript脚本可直接引用该对象并调用该对象的方法。) ——> 页面可以调用JavaScriptinterface的方法
- JavaScriptinterface实现所有接口的执行方式。
- JavaScriptinterface中持有一个handler,通过handler来处理调用app的一些方法。
- 传入参数:所有的方法的调用参数都有一个json串,在方法中解析这个json串按照约定的格式解析出对应的需要参数。
- 回调:在页面传入的json数据中会有callback_id,app在接收到数据后会解析出里面的callback(方法名)和callback_id(回调的id),再加上结果拼成调用javascript的url:“javascript:callback(‘callbackid’,result);然后通过webview的loadurl来发送这个方法。
- 调用js,就是通过loadurl
public void setJSBridge(Activity activity, WebView webView, Handler handler, View root) {
this.mWebView = webView;
JavaScriptinterface obj = new JavaScriptinterface(activity, mWebView, root);
obj.setHandler(handler);
mWebView.addJavascriptInterface(obj, "LetvJSBridge_For_Android");//JavaScriptinterface <---> android
// 可能重入,防止引起的内存泄露
if (mJavaScriptinterface != null) {
mJavaScriptinterface.destory();
}
setJavaScriptinterface(obj);
}
调试:
- 在webviewChromeClient中的onConsoleMessage方法中可以打印JS的debug日志,(参数:message, lineNumber, sourceID)
- onJsPrompt():在js中执行alert、confirm和prompt这三个方法时,会进入Android的onJsAlert、onJsConfirm和onJsPrompt回调。 由于prompt的使用频率较低,因此通常采用prompt实现js和Native的通信。
另一种与h5交互的方式是定义scheme协议,然后再shouldOverrideUrlLoading的时候去解析url,解析出uri然后设置intent去调用对应的activity