js调用java
1. JavascriptInterface
这是Android提供的Javascript与Native通信的官方解决方案。
首先Java代码要实现这么一个类,它的作用是提供给Javascript调用。
public class JavascriptInterface {
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show();
}
}
然后把这个类添加到WebView的JavascriptInterface中。
webView.addJavascriptInterface(new JavascriptInterface(), "javascriptInterface");
在Javascript代码中就能直接通过“javascriptInterface”直接调用了该Native的类的方法。
function showToast(toast) {
javascript:javascriptInterface.showToast(toast);
}
但是这个官方提供的解决方案在Android4.2之前存在安全漏洞。在Android4.2之后,加入了@JavascriptInterface才得到解决。所以考虑到兼容低版本的系统,JavascriptInterface并不适合。
如需回调,增加callbackId,通过java to js进行回调。
2.WebViewClient.shouldOverrideUrlLoading()
拦截所有WebView的Url跳转。页面可以构造一个特殊格式的Url跳转,shouldOverrideUrlLoading拦截Url后判断其格式,然后Native就能执行自身的逻辑了。
public class CustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (isJsBridgeUrl(url)) {
// JSbridge的处理逻辑
//openURL: jsbridge://publicAccount/pbReport?p=10004&p1=appid%3D1000218%26typeid%3D1000280%26
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
}
java调用js
Java通信Javascript只有一种方式。
那就是调用WebView.loadUrl()去执行一个预先定义好的Javascript方法。
webView.loadUrl(String.format("javascript:JsBridge.handleMessageFromNative(%s)", data));
如需回调,增加callbackId,通过js to java进行回调。
参考文章
网友评论