您的位置:首页 > 移动开发 > Android开发

Android开发,WebView下Java和JavaScript互相调用(2)

2015-03-12 12:13 741 查看
转载的,文章来源

还有一篇别人写的,感觉还可以,这里没有列出。

更多关于Java和JavaSc的调用

如何实现

实现Java和js交互十分便捷。通常只需要以下几步。

WebView开启JavaScript脚本执行

WebView设置供JavaScript调用的交互接口。

客户端和网页端编写调用对方的代码。

本例代码

为了便于讲解,先贴出全部代码

Java代码

package com.example.javajsinteractiondemo;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends Activity {
private static final String LOGTAG = "MainActivity";
@SuppressLint("JavascriptInterface")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final WebView myWebView = (WebView) findViewById(R.id.myWebView);
WebSettings settings = myWebView.getSettings();
settings.setJavaScriptEnabled(true);
myWebView.addJavascriptInterface(new JsInteration(), "control");
myWebView.setWebChromeClient(new WebChromeClient() {});
myWebView.setWebViewClient(new WebViewClient() {

@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
testMethod(myWebView);
}

});
myWebView.loadUrl("file:///android_asset/js_java_interaction.html");
}

private void testMethod(WebView webView) {
String call = "javascript:sayHello()";

call = "javascript:alertMessage("" + "content" + "")";

call = "javascript:toastMessage("" + "content" + "")";

call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);

}

public class JsInteration {

@JavascriptInterface
public void toastMessage(String message) {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
}

@JavascriptInterface
public void onSumResult(int result) {
Log.i(LOGTAG, "onSumResult result=" + result);
}
}

}


前端网页代码

<html>
<script type="text/javascript">
function sayHello() {
alert("Hello")
}

function alertMessage(message) {
alert(message)
}

function toastMessage(message) {
window.control.toastMessage(message)
}

function sumToJava(number1, number2){
window.control.onSumResult(number1 + number2)
}
</script>
Java-Javascript Interaction In Android
</html>


调用示例

js调用Java

调用格式为window.jsInterfaceName.methodName(parameterValues) 此例中我们使用的是control作为注入接口名称。

function toastMessage(message) {

window.control.toastMessage(message)

}

function sumToJava(number1, number2){

window.control.onSumResult(number1 + number2)

}

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代码将值返回。

1.Java调用js代码

String call = “javascript:sumToJava(1,2)”;

webView.loadUrl(call);

2.js函数处理,并将结果通过调用java方法返回

function sumToJava(number1, number2){

window.control.onSumResult(number1 + number2)

}

3.Java在回调方法中获取js函数返回值

@JavascriptInterface

public void onSumResult(int result) {

Log.i(LOGTAG, “onSumResult result=” + result);

}

处理

Android 4.4之后使用evaluateJavascript即可。这里展示一个简单的交互示例 具有返回值的js方法

function getGreetings() {

return 1;

}

java代码时用evaluateJavascript方法调用

private void testEvaluateJavascript(WebView webView) {

webView.evaluateJavascript(“getGreetings()”, new ValueCallback() {

@Override

public void onReceiveValue(String value) {

Log.i(LOGTAG, “onReceiveValue value=” + value);

}});

}

输出结果

I/MainActivity( 1432): onReceiveValue value=1

注意

上面限定了结果返回结果为String,对于简单的类型会尝试转换成字符串返回,对于复杂的数据类型,建议以字符串形式的json返回。

evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: