webView.evaluateJavascript("(function() { return " + command + “; })();”, new ValueCallback() {
@Override
public void onReceiveValue(String result) {
// 此处的result便是 ABC
}
});
Javascript 向 Native 发送数据
Javascript向Native发送数据有4种方式,第一种方式是借助webChromClient
中的onJsAlert()
, onJsPromot()
的方法来获取Javascript相关数据。第二种方式是采用覆盖shouldOverrideUrlLoading
方法,拦截url协议。第三种是最方便的,也就是@JavascriptInterface
方案, 现在大多数App都会用到这种方式, 后面会详细介绍。最后一种是利用在webView
中嵌入iframe
的方式,通过更新iframe
的url。比较出名的混合框架JsBridge
之前就是采用这种方式,现已改成采用@JavascriptInterface
这种方式了。以下简单介绍一下各种方式的使用。
onJsPrompt
webChromeClient
中提供了onJsAlert
, onJsPrompt
方法,方便开发者重写Javascript中的alert
, prompt
方法对应的行为。我们可以在这两个方法中任选一个做为native和js进行交互的桥梁。通常我们借助于onJsPrompt
方法来实现, 就是因为在js中,这个方法通常我们用得比较少。而对于onJsAlert()
, 当调用js中的alert()
时会触发,我们可以通过重写这个方法来实现自定义的提示View
但是这种方式对传入的数据量有限制,和手机的WebView版本有关,以我的测试机为例,在oppo reno
手机 android 10上面, 其传递数据最多只能是10k。 而用@JavascriptInterface
方案, 传递的数据最多可达20 - 30M
我们来看前端网页的写法, 直接调用prompt
函数
var data = prompt(“native://getUserInfo?id=1”);
console.log(‘data:’ + data);
在为WebView设置WebChromeClient
的时候重写onJsPrompt
方法,如下:
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
Uri uri = Uri.parse(message);
//如果是调nativeAPI.
if (url.startsWith(“native://”)) {
result.confirm(“call natvie api success”);
return true;
}
return super.onJsPrompt(view, url, message, defaultValue, result);
}
shouldOverrideUrlLoading
前端页面的Js代码:
document.location=“native://getUserInfo?id=1”;
native层面在为WebView设置WebViewClient
对象时,我们需要重写shouldOverrideUrlLoading
方法。需要注意的是,WebViewClient
中有两个shouldOverrideUrlLoading
方法的定义:
public boolean shouldOverrideUrlLoading(WebView view, String url)
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
其中上面一个在sdk中已被标记Deprecate