js->java 通过addjavascriptinterface(大家都知道)
java->js 通过loadurl("javascript:alert('test!!!')")(大家也都知道)
教大家一个不知道的方法,java可以调用js里的方法并返回值 或者 获得js里面的变量值。(类似于ios平台里的方式)
类实现
public static class MyWebView extends WebView {
public MyWebView(Context context) {
super(context);
}
public String stringByEvaluatingJavaScriptFromString(String script) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
try {
Field mp = WebView.class.getDeclaredField("mProvider");
mp.setAccessible(true);
Object webViewObject = mp.get(this);
Field wc = webViewObject.getClass().getDeclaredField("mWebViewCore");
wc.setAccessible(true);
Object webViewCore = wc.get(webViewObject);
Field bf = webViewCore.getClass().getDeclaredField("mBrowserFrame");
bf.setAccessible(true);
Object browserFrame = bf.get(webViewCore);
Method stringByEvaluatingJavaScriptFromString = browserFrame.getClass()
.getDeclaredMethod("stringByEvaluatingJavaScriptFromString",
String.class);
stringByEvaluatingJavaScriptFromString.setAccessible(true);
Object obj_value = stringByEvaluatingJavaScriptFromString.invoke(
browserFrame, script);
return String.valueOf(obj_value);
} catch (Exception e) {
Log.e("!!!", "stringByEvaluatingJavaScriptFromString", e);
}
return null;
} else {
try {
Field[] fields = WebView.class.getDeclaredFields();
// 由webview取到webviewcore
Field field_webviewcore = WebView.class.getDeclaredField("mWebViewCore");
field_webviewcore.setAccessible(true);
Object obj_webviewcore = field_webviewcore.get(this);
// 由webviewcore取到BrowserFrame
Field field_BrowserFrame = obj_webviewcore.getClass().getDeclaredField(
"mBrowserFrame");
field_BrowserFrame.setAccessible(true);
Object obj_frame = field_BrowserFrame.get(obj_webviewcore);
// 获取BrowserFrame对象的stringByEvaluatingJavaScriptFromString方法
Method method_stringByEvaluatingJavaScriptFromString = obj_frame.getClass()
.getMethod("stringByEvaluatingJavaScriptFromString", String.class);
// 执行stringByEvaluatingJavaScriptFromString方法
Object obj_value = method_stringByEvaluatingJavaScriptFromString.invoke(
obj_frame,
script);
// 返回执行结果
return String.valueOf(obj_value);
} catch (Exception e) {
Log.e("!!!", "stringByEvaluatingJavaScriptFromString", e);
}
return null;
}
}
}
调用方式
MyWebView webView = new MyWebView(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadData(
"<html><body><script type=\"text/javascript\">var myvalue = 'jjjjj';function fun1(){return 'function return test';} document.write('123');</script></body></html>",
"text/html", "UTF-8");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
Toast.makeText(
MainAct.this,
((MyWebView) view)
.stringByEvaluatingJavaScriptFromString("myvalue"),
Toast.LENGTH_LONG)
.show();
super.onPageFinished(view, url);
}
});
参考链接:http://stackoverflow.com/questions/6456994/exist-stringbyevaluatingjavascriptfromstring-for-android