实现JS和Native有两种方式:
- shouldOverrideUrlLoading(WebView view, String url)
- js与java互相调用
先来说一下第一种方式shouldOverrideUrlLoading(WebView view, String url)
通过给WebView加一个事件监听对象(WebViewClient)并重写shouldOverrideUrlLoading(WebView view, String url)方法。当按下某个连接时WebViewClient会调用这个方法,并传递参数view和url
开始第二种.JS和Java互调
如何实现java和js互调
- WebView开启JavaScript脚本执行
- WebView设置供JavaScript调用的交互接口
- 客户端和网页端编写调用对方的代码
JS调用JAVA
JS : window.jsInterfaceName.methodName(parameterValues)
native: webView.addJavascriptInterface(new JsInteration(), “androidNative”);
下面给出一个实例,方便理解
webView.addJavascriptInterface(new JsInteration(), “androidNative”);
@JavascriptInterface
public void helloJS(){…}
window.androidNative.helloJS();
Java调用JS
webView调用js的基本格式为webView.loadUrl(“javascript:methodName(parameterValues)”)
- 调用js无参无返回值函数: String call =“javascript:sayHello()”;webView.loadUrl(call);
- 调用js有参无返回值函数:String call = “javascript:alertMessage(\”” + “content” + “\”)”; webView.loadUrl(call);
- 调用js有参数有返回值的函数
Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。
Android 4.4之后使用evaluateJavascript即可。
private void testEvaluateJavascript(WebView webView) {
webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.i(LOGTAG, "onReceiveValue value=" + value);
}});
}
注:
- 参数类型如果是简单的int或String,可以直接传,对于复杂的数据类型,建议以字符串形式的json返回。
- evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。
当native与js交互时存cookie看到很多人遇到过这样一个问题,cookie存不进去,网上有很多解释方案,但是很多没说到重点上,这里直接贴一下代码:
public static void synCookies(Context context, String url, String version) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeAllCookie();
cookieManager.setCookie(url, "sessionKey=" + UserInfoShareprefrence.getInstance(context).getLocalSessionKey());
cookieManager.setCookie(url, "productVersion=android-epocket-v" + version);
CookieSyncManager.getInstance().sync();
}
存不进去的很大一部分原因是你的url不对,他官方给出的解释是这样的
/**
* Sets a cookie for the given URL. Any existing cookie with the same host,
* path and name will be replaced with the new cookie. The cookie being set
* will be ignored if it is expired.
*
* @param url the URL for which the cookie is to be set
* @param value the cookie as a string, using the format of the 'Set-Cookie'
* HTTP response header
*/
public void setCookie(String url, String value) {
throw new MustOverrideException();
}
其实没说明白url到底是什么,这里的url就是显示的url的域名,这里顺便贴出取域名的方法,给出的是通过正则提取域名
/**
* 获得域名
*
* @param url
* @return
*/
public static String getDomain(String url) {
Pattern p = Pattern.compile("[^//]*?\\.(com|cn|net|org|biz|info|cc|tv)", Pattern.CASE_INSENSITIVE);
Matcher matcher = p.matcher(url);
matcher.find();
return matcher.group();
}
还有一点就是,如果你想传递多个值给cookie的话,可以多次使用setCookie,不要擅自的自己拼值,因为你拼的字符串中可能存在分号,内部多分号做了特殊处理,截取分号之前的,之后的直接放弃!