JSBridge 相关的导入使用不在详述,很多博客介绍的都非常详细。
在上一篇博客 Webview : Denied starting an intent without a user gesture 中,为了能使用 JS 中的 window.location 方法,不得不使用了如下代码
webView.setWebViewClient(new BridgeWebViewClient(webView) {
//覆盖shouldOverrideUrlLoading 方法
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
这段代码导致我不管如何照着官方的 demo 调试都无法是的 JS 和 java 相互调用,在对比过代码并且我查看了 BridgeWebView 的部分代码之后看到了如下代码:
public class BridgeWebView extends WebView implements WebViewJavascriptBridge {
...
private void init() {
this.setVerticalScrollBarEnabled(false);
this.setHorizontalScrollBarEnabled(false);
this.getSettings().setJavaScriptEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
this.setWebViewClient(generateBridgeWebViewClient());
}
protected BridgeWebViewClient generateBridgeWebViewClient() {
return new BridgeWebViewClient(this);
}
...
}
public class BridgeWebViewClient extends WebViewClient {
...
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
try {
url = URLDecoder.decode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (url.startsWith(BridgeUtil.YY_RETURN_DATA)) { // 如果是返回数据
webView.handlerReturnData(url);
return true;
} else if (url.startsWith(BridgeUtil.YY_OVERRIDE_SCHEMA)) { //
webView.flushMessageQueue();
return true;
} else {
return super.shouldOverrideUrlLoading(view, url);
}
}
...
}
如上代码,明显是 BridgeWebView 自己所制定的那套协议被我完全覆盖破坏了,直接将下面代码注释掉,成功运行
webView.setWebViewClient(new BridgeWebViewClient(webView) {
//覆盖shouldOverrideUrlLoading 方法
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});