`

让Java跟Javascript更加亲密

 
阅读更多

在移动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来读取、执行、并把结果写回?

步骤如下:

  1. Java把Js调用(命令)和回调缓存,如保存到ArrayList;
  2. Js定时轮询Java提供的getCommandList接口;
  3. Js读取到要执行命令,执行它,并把结果通过setResult写回给Java;
  4. 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/

分享到:
评论

相关推荐

    JavaScript重点总结

    JavaScript语法与C++和Java有相似之处,但它是弱类型的语言,这意味着变量在声明时不需要指定数据类型。JavaScript的数据类型包括基本类型(如String、Number、Boolean、Null、Undefined)和引用类型(如Object)。...

    Happy-Birthday-AR:使用Spark AR和JavaScript进行3D增强现实体验

    使用Spark AR和JavaScript进行3D增强现实体验 灵感 在某人的特殊场合中却没有实际出现的好方法是什么? 通过向他们发送专门为他们定制的AR蛋糕。 尤其是在这次Covid-19大流行期间,我们离我们最亲密的人很远。 拥有...

    网页美工经典案例教程(PDG)

    2. JavaScript:用于实现交互效果和动态功能,如表单验证、动画和Ajax异步通信,JavaScript是现代网页美工不可或缺的工具。 3. 框架与库:如Bootstrap、Vue.js等,它们提供了预设的样式和组件,加速开发进程,同时...

    让你女友桌面全是玫瑰花的小程序~~非源码哦

    为了实现这些功能,用户可能需要学习一些基础的编程知识,如熟悉Python、Java或JavaScript等编程语言,以及掌握如何使用PyQt、Tkinter或React Native等图形用户界面框架。 虽然这个程序本身只是一个简单的小项目,...

    性感的代码编辑器

    它内置了丰富的代码高亮和自动完成功能,可以智能识别多种编程语言,包括但不限于Python、Java、JavaScript、C++、PHP等,极大地提高了编写代码的效率。同时,Sublime Text的多选功能允许开发者同时进行多个位置的...

    Aprecie:迷你社交网络可激发基于DigixStruts的认可

    在社交网络中,"认可"可能指的是点赞、评论、分享等互动行为,而"基于DigixStruts的认可"可能意味着Aprecie利用这一技术提供了更加独特或增强的用户认可机制,例如更智能的推荐系统、更安全的数据处理或更高效的用户...

    日记工具 记录生活点滴

    10. **开发技术**:制作这样的日记工具可能涉及到的技术包括前端界面开发(如HTML、CSS、JavaScript),后端服务器管理(如Python、Java或Node.js),数据库管理(如SQLite、MySQL),以及可能的移动平台开发(如...

    缘分测试小软件

    4. **编程语言选择**:开发此类应用可以选择多种编程语言,如Java、Python、C#或JavaScript等。选择取决于开发者熟悉的技术栈和平台,如果是移动端应用,可能是Android的Java或Kotlin,或是iOS的Swift或Objective-C...

    javaweb-社区团购系统.zip

    2. **JSP**:用于创建动态网页,将HTML与Java代码分离,使得页面更加直观易读。 3. **JavaBean**:封装业务数据和逻辑,提供给Servlet或JSP调用。 4. **MVC(Model-View-Controller)**:设计模式,将数据模型、视图...

    基于springboot的宠物咖啡馆平台源码数据库.doc

    它不仅为顾客提供了一个与宠物亲密接触的空间,也满足了人们在繁忙生活中寻找放松和快乐的需求。为了更好地管理和运营宠物咖啡馆,提升顾客体验和服务质量,开发一套基于Spring Boot的宠物咖啡馆平台显得尤为重要。 ...

Global site tag (gtag.js) - Google Analytics