Android WebView与Native交互
红日666 人气:0前言
附GitHub源码:WebViewExplore
一、JS调用Native的三种方式
1、通过WebView的addJavascriptInterface进行对象映射
需要注意的是这种调用方式,如果你的 minSdkVersion <=16那么需要考虑到4.2之前的漏洞问题。
mWebView.addJavascriptInterface(new JsCallAndroidInterface(), "JSCallBackInterface");
/** * JS调用android原生方法1: * * 通过WebView的addJavascriptInterface()进行对象映射 */ private class JsCallAndroidInterface { /** *@JavascriptInterface注解方法. * js端调用,4.2以后安全;4.2以前,当JS拿到Android这个对象后, * 就可以调用这个Android对象中所有的方法,包括系统类(java.lang.Runtime 类) * 从而进行任意代码执行。 * @param msg */ @JavascriptInterface public void callback(String msg) { ToastUtil.showToast(APIWebViewActivity.this, "JS方法回调到web了 :" + msg); } }
2、通过WebViewClient shouldOverrideUrlLoading方法回调拦截url:
与url重定向类似,可在此做url的拦截,已达到针对性的调用native方法的目的。
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (resolveShouldLoadLogic(url)) { return true; } return super.shouldOverrideUrlLoading(view, url); }
/** * JS调用android原生方法2: * * 通过WebViewClient shouldOverrideUrlLoading方法回调拦截url * * 根据协议的参数,判断是否是所需要的url: * 一般根据scheme(协议格式),authority(协议名)来判读 * * @param url * @return */ private boolean resolveShouldLoadLogic(String url) { Uri uri = Uri.parse(url); if (uri.getScheme().equals("js")) { if (uri.getAuthority().equals("Authority")) { ToastUtil.showToast(APIWebViewActivity.this, "方法2"); } return true; } return false; }
3、通过WebChromeClient的 onJsPrompt()等方法 ,回调拦截JS对话框prompt()等:
/** * 是否支持页面中的js输入弹出框 * * @param view * @param url * @param message * @param defaultValue * @param result * @return */ @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { if (resolveJSPrompt(message)) { return true; } return super.onJsPrompt(view, url, message, defaultValue, result); }
/** * JS调用android原生方法3: * * 通过WebChromeClient的 onJsAlert() onJsConfirm() onJsPrompt() 方法 * 回调拦截JS对话框alert() confirm() prompt() */ private boolean resolveJSPrompt(String message) { Uri uri = Uri.parse(message); if (uri.getScheme().equals("js")) { if (uri.getAuthority().equals("Authority")) { ToastUtil.showToast(APIWebViewActivity.this, "方法3"); } return true; } return false; }
完整源码
Js调用Native示例源码-JsToNativeBridgeActivity
二、Native调用WebView的两种方案
1、loadUrl("javascript:callJS()"):
此方法简洁、效率低。当不需要返回值且对性能要求较低时可以考虑使用:
/** * Native调用JS方法一: * 方法简洁、效率低 * 当不需要获取返回值且对性能要求较低时可选择使用。 */ webView.loadUrl("javascript:callJS()");
2、evaluateJavascript(script,resultCallback):
需4.4以上才可使用,效率高且有返回值:
/** * Native调用JS方法二: * 效率高,有返回值(4.4以上系统使用) */ webView.evaluateJavascript("javascript:callJS('yao')", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { //此处为JS返回的结果 Logger.d("value:" + value); } });
完整源码
Native调用JS示例源码-NativeToJsBridgeActivity
加载全部内容