在移动App开发中,为了快速迭代,通常都会使用Native+Web的模式开发。具体来说就是使用Java提供接口,使用WebView控件嵌套Web页面来实现UI和交互。
在Android中,Java可以很方便的提供接口给WebView中的Js进行调用,只要以下一行代码就能搞定:
mWebView.addJavascriptInterface(new JavascriptInterface(), "custom_name");
这样,JavascriptInterface的所有声明为public的方法,都能被mWebView中的Js通过以下方式调用:
window.custom_name.xxx();//xxx为JavascriptInterface的公有方法
而Java需要调用Js时,则是通过WebView实例的loadUrl方法调用:
mWebView.loadUrl("javascript:xxx(yyy)");
这其实跟你在浏览器的地址栏敲下“javascript:alert(1)”的原理是一样的。
一切看起来都是那么的美好,只是……
当Java需要传递大量字符串给Js时,URL就力不从心了。另外,从URL执行的Js,在页面没加载完成时,是有可能导致页面出现undefined错误(因为要执行的那个方法可能还没有声明呢),会引发各种奇形怪状的错误。
那要怎么办呢?
再回看上面Js调用Java接口的地方,可以发现,Js是可以直接调用Java方法并取得Java给的返回值的(必须是可序列化的数据)。那么,为何不试试把Java需要执行的Js方法,保存起来,让Js来读取、执行、并把结果写回?
步骤如下:
- Java把Js调用(命令)和回调缓存,如保存到ArrayList;
- Js定时轮询Java提供的getCommandList接口;
- Js读取到要执行命令,执行它,并把结果通过setResult写回给Java;
- Java把对应命令的回调取出并执行。
如此即完成了Java调用Js的流程。
为了方便使用,简单的封装了下,名为AndroidJavascriptBridge,可移步到Github查看源码和示例(MainActivity.java和test.js )。
使用方法
Android端调用, 加入com.imatlas.jsb 和 com.imatlas.util包, 按如下步骤调用
//1. 创建JavascriptBridge实例 final JavascriptBridge jsb = new JavascriptBridge(webView); //2. 调用Javascript方法 Bundle params = new Bundle(); params.putString("asdfasdf", "123123"); jsb.require("alert", params, new JavascriptBridge.Callback() { @Override public void onComplate(JSONObject response, String cmd, Bundle params) { Log.i("js response",response.toString()); } }); //3. 提供Java方法给Javascript调用 //添加个 messagebox 方法给js jsb.addJavaMethod("messagebox", new JavascriptBridge.Function() { @Override public Object execute(JSONObject params) { Toast.makeText(getApplicationContext(), params.toString(), Toast.LENGTH_LONG) .show(); return "{\"ret\":123}"; } });
Javascript端的调用, 须先引入web/js/jsb.js, 之后按如下方式调用
//1. 调用Java方法 jsb.require('messagebox', {'text': '你好, messagebox!'}, function(response){ alert('调用messagebox回来啦\n' + JSON.stringify(response)); }); //2. 提供Javascript方法给Java调用 jsb.addJavascriptMethod('alert', function(params){ alert( '------\n' + JSON.stringify(params) + '\n========\n'); return {'text': 'alert ok'}; });
IOS的话就要反过来了,要改成由Objective-C来轮询Js,来实现Js对Native的调用。
嗯,等改天有时间了,就把IOS也封装进来,用起来就简单多了。
转载:http://www.alloyteam.com/2013/02/java-with-javascript-more-intimate/
相关推荐
总的来说,Java调用JavaScript代码的技术让开发者能够灵活地组合两种语言的优势,实现高效且可配置的业务逻辑,为软件开发提供了更大的灵活性。然而,需要注意的是,随着技术的发展,如WebAssembly的兴起,未来跨...
在IT行业中,Java和JavaScript是两种非常重要的编程语言,它们分别在服务器端和客户端领域有着广泛的应用。然而,有时候我们可能需要在Java程序中执行JavaScript代码,这通常是出于跨语言交互或者利用JavaScript的...
6. Nashorn引擎特性:Nashorn引擎是Java中的JavaScript运行时,提供了一种方式让Java应用程序执行JavaScript代码。它包括了ECMAScript 5.1的完整实现,还支持一些扩展特性。 7. JDK中的JavaScript支持:从内容中...
在IT领域,尤其是在Web开发中,Java和JavaScript的交互是常见的需求。这两种语言在不同的环境运行,Java主要在服务器端,而JavaScript则在客户端。在数据传输过程中,为了保证数据的安全,加密技术扮演了关键角色。...
在IT领域,Java和JavaScript是两种非常重要的编程语言,它们各自有着独特的特性和用途,但同时也经常被一起提及,因为它们在构建现代Web应用程序时常常相辅相成。"Java/JavaScript专家门诊"可能是一个讨论这两种...
使用 Java 开发 SonarQube JavaScript 检测规则 在 SonarQube 中使用 Java 开发检测规则是非常重要的,特别是在 JavaScript 项目中检测代码质量。SonarQube 提供了一个强大的平台,允许开发者使用 Java 语言开发...
Java和JavaScript库之间的交互是软件开发中的一个重要主题,特别是在构建多平台应用或增强网页功能时。Java和JavaScript作为两种不同的编程语言,它们各自在特定领域有着优势:Java以其强大的后端处理能力,而...
JAVA源码JavaScript万年历JAVA源码JavaScript万年历
本主题主要关注的是如何在Java和JavaScript之间实现可互操作的AES(Advanced Encryption Standard)加密算法,这涉及到128、192和256位的密钥长度。AES是一种广泛应用的块密码,以其高效性和安全性著称,广泛用于...
"Java与Java Applet和JavaScript混编方法" Java与Java Applet和JavaScript混编方法是指在网页开发中,通过灵活使用Java、Java Applet和JavaScript三种语言的优点,实现它们之间的互相补充,开发更完美的Web应用程序...
### 探討Java與JavaScript #### 前言 随着互联网技术的日新月异,网络应用变得越来越丰富多样。为了提升用户体验,许多个人网站通过各种编程语言和技术来增强互动性和吸引力。其中,JavaScript作为一种能够创建...
该项目是一个基于Java和Javascript的家教系统设计,旨在提供一个简洁、高效的家教管理解决方案。系统采用Java开发,项目结构清晰,采用的技术是经典的SSM框架,非常适合Java项目入门学习和企业级Java开发熟悉。
本工具类用java实现了JavaScript escape/unescape 编码。对接建行支付以及需要向后端传输中文数据时可以使用得到
在Java和JavaScript环境中,ActiveMQ能够作为一个桥梁,允许不同应用程序之间进行异步通信。下面将详细探讨如何使用Java和JavaScript与ActiveMQ交互,并实现应用实例。 首先,我们要理解ActiveMQ的基本概念。消息...
Java和JavaScript在Lotus Domino/Notes5.0开发中的应用 Java和JavaScript是两种不同的编程语言...Java和JavaScript都是Lotus Domino/Notes5.0开发中的重要技术,两者可以相互配合使用,以实现更加灵活和高效的开发。
在“可以互操作的Java和Javascript RSA加密解密程序”中,我们看到这种技术被巧妙地应用于Java和JavaScript两个不同的编程环境中,实现跨平台的加密解密互操作。 首先,我们需要理解RSA算法的基本原理。RSA基于大数...
网页资料收集 JAVA与JAVASCRIPT通信乱码问题 java javascript jsp的url提交带中文参数时后台取到的是乱码问题的解决 网页资料收集 JAVA与JAVASCRIPT通信乱码问题 java javascript jsp的url提交带中文参数时后台取到...
Java 和 JavaScript 的香港身份证验证方法主要涉及对香港身份证号码格式的有效性检查,通过特定的算法来确定号码是否合法。在 Java 和 JavaScript 中,这个验证过程包括以下步骤: 1. **预处理身份证号码**: - 在...
标题“SHA MD5 Java和JavaScript加密的实现”指向的是如何在Java和JavaScript编程语言中应用这些哈希算法进行数据加密和验证。下面我们将详细介绍这两个算法以及在Java和JavaScript中的具体实现。 1. **SHA(安全...
### BSF(Java中使用JavaScript) #### 一、BSF简介 BSF(Bean Scripting Framework,豆脚本框架)是Apache的一个项目,它提供了一种机制,使得开发者能够在Java应用中集成各种脚本语言,如JavaScript、Python、...