原生调H5
方式1 mWebView.loadUrl() : 方便简洁,效率低,获取返回值麻烦。不需要获取返回值、对性能要求较低时使用
方式2 mWebView.evaluateJavascript() : 效率高 ,向下兼容性差(仅用于4.4+, API>=19 )
public void loadJs(String js) {
// evaluateJavascript在 Android4.4 (API 19)版本之后才可使用,所以使用时需进行版本判断
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
mWebView.loadUrl(js);
} else {
mWebView.evaluateJavascript(js, new ValueCallback() {
@Override
public void onReceiveValue(String value) {
//此处为 js 返回的结果
}
});
}
}
使用:
原生调用:
String js = “javascript:showAlertFromAndroid(\”I’m from TestWebViewActivity\”)”;
mFragment.loadJs(js);
H5中js方法:
function showAlertFromAndroid(text){
alert(text);
}
H5调原生
方式1 拦截shouldOverrideUrlLoading 根据不同的url 跳转不同的原生业务
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
view.loadUrl(request.getUrl().toString());
}
// 拦截url
return true;
}
}
方式2 拦截onJsPrompt 根据不同的url 跳转不同的原生业务
private class MyWebChromeClient extends WebChromeClient {
@Override
public void onReceivedTitle(WebView view, String title) {
if (onTitleChangedListener != null) {
onTitleChangedListener.onTitleChanged(title);
}
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
//拦截JsPrompt,进行业务处理
//dispatch(message);
//执行confirm返回结果
result.confirm(“success”);
//true,拦截JavaScript的弹窗。如果拦截了,不会出现弹窗。
//false,不拦截JavaScript的弹窗,由WebView自行决定弹窗。
return true;
}
}
如下,在 onJsPrompt 中接收到的message 就是
test_html
function myPrompt() {
var value = “custom://test.com/home/news?name=娱乐&size=30”
var result = prompt(value,”张某某”)
alert(result);
}
showPrompt
方式3 使用mWebView.addJavascriptInterface(object, name)
Android4.2 以前WebView 提供了javascript 调用Java代码的方法,会造成很大的安全漏洞。Android官方在API 17后,限制javascript代码只能调用声明了@JavascriptInterface 注解的Java方法。
如下
//java的object类对象映射到js的name对象
mWebView.addJavascriptInterface(new H5ToAndroid(), “H5ToAndroidProxy”);
public class H5ToAndroid {
@SuppressLint(“JavascriptInterface”)
@JavascriptInterface
public String sendMessage(String message) {
//拦截message
return “success”;
}
}
html代码:
test_html
function h5ToAndroid() {
var result = H5ToAndroidProxy.sendMessage(“custom://test.com/home/news?name=娱乐&size=30”);
alert(result);
}
h5ToAndroid
哦了,先到这儿吧~