JavaScript与Java通信

1、WebView中JavaScript调用Android程序中Java:

使用WebView类中的addJavascriptInterface()方法,可以使用它扩展嵌入式浏览器内的DOM(文档对象模型),并定义JavaScript代码可以访问的新对象。JavaScript代码调用该对象的方法时,实际上它会调用Android程序中的方法。

2、在Android程序中调用JavaScript方法:

调用loadUrl()方法,将URL以javascript:要执行的代码 的形式传递给它。浏览器会在当前页面执行给定的JavaScript表达式,而不是转到新的页面。

实例:

构建一个Android程序,布局如下(res/layout/activity_local_browser.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <WebView
        android:id="@+id/web_view"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1.0" />
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1.0"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/url_field"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/textview"/>
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/call_javascript_from_android" />
        <TextView
            android:id="@+id/text_view"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

可以看出,布局的上半部分是WeView控件,下部分是来自Android用户界面的TextView和Button。

下面需要完成将被加载到WebView中的index.html文件(assets/index.html),代码如下

<html>
<head>
<script language="JavaScript">
	function callJS(arg){
			document.getElementById('replaceme').innerHTML = arg;
		}
</script>
</head>
<body>
<h1>WebView</h1>
<p>
<a href="#" onclick="window.alert('Alert from JavaScript')">
	Display JavaScript alert</a>
</p>
<p>
<a href="#" onclick="window.android.callAndroid('Hello from Browser')">
	Call Android from JavaScript</a>
</p>
<p id="replaceme">
</p>
</body>
</html>

可以看到,callJS()函数是将会在Java代码中被调用JavaScript函数,它接收一个参数并赋值给replaceme标签。往下的两条链接分别是调用window.alert()函数(显示短消息)和window.android对象的callAndroid()方法(在Java代码中定义好的)。

同时不要忘记在res/values/strings.xml文件中完成字符串的赋值:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">LocalBrower</string>
    <string name="action_settings">Settings</string>
    <string name="textview">TextView</string>
    <string name="call_javascript_from_android">Call JavaScript from Android</string>
</resources>

完成这些准备后,就可以把目光放程序的LocalBrowser类上了,代码如下:

package com.example.localbrowser;
import android.support.v7.app.ActionBarActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.WebView;
import android.webkit.WebChromeClient;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

@SuppressLint("JavascriptInterface")
public class LocalBrowser extends ActionBarActivity {
	private WebView webview;
	private Button button;
	private TextView textview;
	private final Handler handler = new Handler();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_local_browser);

		webview = (WebView) findViewById(R.id.web_view);
		button = (Button) findViewById(R.id.button);
		textview = (TextView) findViewById(R.id.text_view);

		button.setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				//单击按钮时,通过WebView.loadUrl()方法调用index.html中定义的callJS()函数
				webview.loadUrl("javascript:callJS('Hello from Android')");
			}
		});
		//打开JavaScript(默认是关闭的)
		webview.getSettings().setJavaScriptEnabled(true);
		//往WebView中注入Java对象,从而使得在index.tml中能使用此对象的方法
		webview.addJavascriptInterface(new AndroidBridge(), "android");

		webview.setWebChromeClient(new WebChromeClient() {
			// 覆盖默认的window.alert()的展示界面
			public boolean onJsAlert(final WebView view, final String url,
					final String message, JsResult result) {
				Toast.makeText(LocalBrowser.this, message, 3000).show();
				result.confirm();
				return true;
			}
		});
		webview.loadUrl("file:///android_asset/index.html");//加载本地网页,注意有3个斜杠
	}
	public class AndroidBridge {
		@JavascriptInterface
		// 要通过JavaScript调用的Java代码片段
		public void callAndroid(final String arg) {
			handler.post(new Runnable() {
				public void run() {
					textview.setText(arg);
				}
			});
		}
	}
}

整个过程很简单,但有点要注意的是:

在AdroidBridge类中

4.2之前向WebView注入的对象所暴露的接口callAndroid没有注释语句@JavascriptInterface,而4.2及以后的则多了注释语句@JavascriptInterface。如果去掉这行代码,当程序调用此方法时,将不能成功,而logcat会报如下输出:

E/Web
Console: Uncaught TypeError: Object [object Object] has no method ‘callAndroid‘

程序界面:

当单击按钮和链接时,它会在两个环境间进行调用,下面是运行效果图

JavaScript与Java通信

时间: 2024-09-30 00:35:38

JavaScript与Java通信的相关文章

Flex Socket与Java通信实例说明(转)

Flex Socket与Java通信实例说明(转) 这两天一直在flex的Socket ,现在终于懂了很多.由浅到深一步一步深入.慢慢体会实例,虽然实例都是在网上找的,但也经过了我的测试.我比较喜欢注释,也注释了很多. 跟着走你就会懂.. Flex端 和 Java端, 先运行Java端启动服务.然后在测试Flex. 实例一: Flex端: <?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow

JavaScript和Java之间的关系

今天来简单而又详细地说说JavaScript和Java的关系. 开门见山总结性一句话,它们之间的关系 = 雷锋和雷峰塔之间的关系,换句话说:它们之间没什么关系. 但往往有不少初学者甚至中级者认为它们之间有密切的关系,这很让人无语. 个人认为如果不分辨清楚,Java学得越好的初学者,对于JavaScript就会学得越糟.因为在一张白纸上好画图,在一张花纸上就很难再画图了. 比较 JavaScript Java 诞生时间 1995年 1995年 曾用名 Mocha, LiveScript Oak 母

javascript与java的不同之处

javascript与java的不同之处 虽然很像,但不是一种语言. 二者的区别体现在: 首先,它们是两个公司开发的不同的两个产品,Java是SUN公司推出的新一代面向对象的程序设计语言,特别适合于Internet应用程序开发, 而JavaScript是Netscape公司的产品,其目的是为了扩展Netscape Navigator功能,而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言. 其次,JavaScript是基于对象的,而Java是面向对象的,即Java是一种真正的面向对

JavaScript调Java

1.映射Java对象到JavaScript对象上 MainActivity.java package com.example.jsdemo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.webkit.WebSettings; import android.webkit.WebView; public class MainActivity extends AppC

JavaScript仿Java实现Map

var Map = function() {  this.elements = new Array();  this.size = function() {   return this.elements.length;  }  this.isEmpty = function() {   return (this.elements.length < 1);  }  this.clear = function() {   this.elements.length = 0;  }  this.put 

浅谈javascript和java中的字符串

javascript字符串操作 一.字符串的创建 创建一个字符串有几种方法. 1.最简单的是用引号将一组字符包含起来  var myStr = "Hello, String!";// 在js中单双引号没有区别 2.可使用如下语句:var myStr1 = new String("Hello, String!"); 1 2 console.log(typeof myStr);//"string" console.log(typeof myStr1)

Crosswalk+Cordova开发安卓app之 JavaScript调用java (附源代码下载)

 Crosswalk+Cordova开发安卓app之 JavaScript调用java (附源代码下载) 定义js回调接口 /** * js回调接口 * * @author graceup * */ public class JsInterface { public JsInterface() { } @JavascriptInterface public String sayHello() { // TODO do more thing return "Hello World!";

atitit.javascript调用java in swt attilax 总结

atitit.javascript调用java in swt attilax 总结 1. BrowserFunction 简介1 1.1. BrowserFunction 可以分为三类: 1 1.2. 事件监听2 2. ati的实现2 2.1. 页面调用2 2.1.1. --------nativeswing的实现2 2.2. java代码2 3. ---code4 4. 参考5 1. BrowserFunction 简介 为了让读者更好的理解后面的内容,在正式介绍之前,需要让读者简单了解一下 

AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】

先简单从百度找来介绍: ? 1 2 3 4 5 6     密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准Rijndael加密法, 是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界 所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日 发布于FIPS PUB197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对