Android WebView开发之WebView与Native交互

前言

附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);
 	}
 	});
 	 

 

 

标签

发表评论