博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript与Java通信
阅读量:6702 次
发布时间:2019-06-25

本文共 3360 字,大约阅读时间需要 11 分钟。

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)

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

以下须要完毕将被载入到WebView中的index.html文件(assets/index.html),代码例如以下

WebView

Display JavaScript alert

Call Android from JavaScript

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

同一时候不要忘记在res/values/strings.xml文件里完毕字符串的赋值:

LocalBrower
Settings
TextView
Call JavaScript from Android

完毕这些准备后,就能够把目光放在程序的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);				}			});		}	}}

整个过程非常easy,但有点要注意的是:

在AdroidBridge类中

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

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

程序界面:

当单击button和链接时,它会在两个环境间进行调用,以下是执行效果图

你可能感兴趣的文章
SQLServer 维护脚本分享(09)相关文件读取
查看>>
Winscp开源的SSH|SFTP
查看>>
闪回之 回收站、Flashback Drop (table、index、trigger等)
查看>>
office-word去掉效验红色的波浪线
查看>>
Struts2之Action与配置文件
查看>>
POJ 3278 Catch That Cow(BFS,板子题)
查看>>
在Winform开发中使用FastReport创建报表
查看>>
vuejs监听苹果iphone手机键盘事件
查看>>
Spring中基于AOP的@AspectJ
查看>>
excel vba 实现跨表单(sheet) 搜索 - 显示搜索行记录搜索历史
查看>>
Dos命令下目录操作
查看>>
Unity长连接
查看>>
cocos2d-x-3.1 数据结构之Vector (coco2d-x 学习笔记六)
查看>>
将树莓派Raspberry Pi设置为无线路由器(WiFi热点AP,RTL8188CUS芯片)
查看>>
OA系统权限管理设计方案
查看>>
TI C66x DSP 系统events及其应用 - 5.11(中断控制寄存器)
查看>>
《开源框架那点事儿25》:对框架模板引擎实现方式的改造实录
查看>>
『Scrapy』全流程爬虫demo
查看>>
Android跳转到系统Wifi界面的方式
查看>>
细说业务逻辑 -- 丢失的业务逻辑层
查看>>