http://note.youdao.com/noteshare?id=46cdbb294eb6bafcec1406a2a18b9d9d
一、Android调用JS方法
1.Java调用js代码(Android4.4以前)
mWebView.loadUrl("javascript:sum(3,8)");
注意,这里通过addJavascriptInterface将MyActiviy所对应的对象注入到WebView中了。
js函数处理,并将结果通过调用java方法返回
function sum(i,m){
var result = i+m;
document.getElementById("h").innerHTML= result;
}
2.JAVA中如何得到JS中的返回值(Android4.4之后)
Android 4.4之后使用evaluateJavascript即可。这里展示一个简单的交互示例
先写一个具有返回值的js方法
function getGreetings(str) {
return str;
}
java代码时用evaluateJavascript方法调用:(注意:1.evaluateJavascript执行JS方法时,网页必须加载完毕 2.网页中的JS方法是全局方法)
private void testEvaluateJavascript(WebView webView) {
webView.evaluateJavascript("javascript:getGreetings('"+"hello world!"+"')",newValueCallback() {
@Override
publicvoidonReceiveValue(String value) {
Log.i(LOGTAG,"onReceiveValue value="+ value);
}
});
}
从上面的用法中很明显看到,通过evaluateJavascript调用JS中的方法,可以向其中添加结果回调,来接收JS的return值。
注意:
上面限定了结果返回结果为String,对于简单的类型会尝试转换成字符串返回,对于复杂的数据类型,建议以字符串形式的json返回。
evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。
----------------------------------------------------------------分割线------------
二、JS调用Android
在WebView中使用JavaScript
如果在你的WebView中你将要加载的网页使用JavaScript,你必须为你的WebView启用JavaScript。一旦Javascript启用,你可以在你的应用代码和你的JavaScript代码之间创建接口。
Enabling JavaScript
启用Javascript
Javascript在WebView中默认是禁用的,你必须为你的WebView启用Javascript。你可以通过getSetting()方法获取WebSettings,然后使用setJavaScriptEnabled()启用Javascript。
例如:
WebView myWebView=(WebView)findViewById(R.id.webview);
WebSettings webSettings=myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
WebSettings提供了访问各种各样的其他有用的设置。例如,如果你正在开发一款在你的Android应用中指定WebView设计的web应用,然后你可以使用setUserAgentString()定义一个自定义用户代理字符,然后在你的网页中查询自定义用户代理字符来核实客户端请求网页确实来自Android应用。
Binding JavaScript code to Android code
绑定JavaScript代码到Android代码
当正在开发一款在Android应用中指定WebView设计的web应用时,你可以在你的Javascript和客户端Android代码之间创建接口。例如,在你的Android代码中你的Javascript代码可以调用一个方法来显示一个对话框Dialog,而不是使用Javascript的alert()功能。
在你的JavaScript和Android代码之间,要绑定一个新的接口,须调用addJavascriptInterface()方法,给这个方法传进一个绑定到你的JavaScript的类实例和一个(你的JavaScript可以调用来访问这个类)的接口名。
例如,你可以在你的Android应用中包含下面的类:
public class WebAppInterface{
ContextmContext;
/** Instantiate the interface and set the context */
WebAppInterface(Contextc){
mContext=c;
}
/** Show a toast from the web page */
@JavascriptInterface
publicvoidshowToast(Stringtoast){
Toast.makeText(mContext,toast,Toast.LENGTH_SHORT).show();
}
}
注意:如果你已经设置你的 targetSdkVersion 为17或者更高版本,你必须给你的的JavaScript可以获取到的方法(方法必须是Public)添加@JavascriptInterface注释。如果你不提供注释,当你的网页运行在Android 4.2或者更高版本的系统时,这些方法是获取不到的。
在这个例子中,WebAppInterface类允许网页使用showToast()方法创建一个Toast信息。
通过addJavascriptInterface()方法,你可以绑定这个类到你的WebView运行的JavaScript中,并命名Android接口。例如:
WebView webView=(WebView)findViewById(R.id.webview);
webView.addJavascriptInterface(newWebAppInterface(this),"Android");
这给运行在WebView中的JavaScript创建了叫“Android”的接口。在这里,你的网页应用可以访问WebAppInerface类。例如,这有一些HTML和JavaScript(当用户点击按钮时使用新接口创建toast信息的Javascript):
function showAndroidToast(toast){
Android.showToast(toast);
}
从JavaScript初始化Android接口是不需要的。WebView自动使接口可以被你的网页获取。所以,点击按钮时,showAndroidToast()功能使用Android接口调用WebAppInterface.showToast()方法。
注:绑定到你的JavaScript对象运行在另一个线程,而不是在它被创建的线程。
注意:使用addJavascriptInterface()方法JavaScript控制你的Android应用。这是非常有用的特点或者是一个危险的安全问题。当HTML在WebView中是不可信的(例如,部分或全部的HTML是由不明身份的人和进程提供的),攻击者可以在你的HTML中执行你的客户端代码,并且攻击者选择的代码可能是任何代码。这样,除非在你的WebView中的所有的HTML和JavaScript代码都是你写的,否则,你不要使用addJavascriptInterface()方法。在你的WebView中,你也应该不要允许用户去导航到其他的不是你自己的网页(相反,允许用户的默认浏览器去打开不相关的链接——默认情况下,用户的浏览器打开所有的链接,所以在下面小节的描述中如果你处理网页导航应小心)。