当前位置: 首页 > 编程笔记 >

详解Android JS相互调用

督劲
2023-03-14
本文向大家介绍详解Android JS相互调用,包括了详解Android JS相互调用的使用技巧和注意事项,需要的朋友参考一下

最近在研究Android、JS相互调用,之前没怎么接触过,只知道loadUrl()就可以加载一个网页了,研究过之后发现Android可以调JS,JS也可以调Android原生控件,很开心啊。下面小编就开始喽:
原理就是Java和JS调用,在Android中是通过WebView来实现的。
下面先说一下简单的Android和JS相互调用

  • 首先通过loadurl()来加载网页
  • WebView开启JS脚本执行
  • Android端提供JS调用的交互接口

简单的看一下代码:

mWebView=(MyWebView)findViewById(R.id.wv_container_information);
    mWebSetting = mWebView.getSettings();
    mWebSetting.setJavaScriptEnabled(true);
//js调用Android中的方法
    mWebView.addJavascriptInterface(this, "XXX");//XXX未html中的方法
    /**
   * 客户端提供send_comment方法被js调用
   * by:chenhe at:2015/09/28
   *
   * @param uuid   uuid
   * @param fun_name 调用的方法名
   * @param json   js给客户端的json
   */
  @JavascriptInterface
  public void send_comment(final String uuid, final String fun_name, final String json) {

    new Thread(new Runnable() {
      @Override
      public void run() {
        commend = CommandFactory.getInstance().createCommand(fun_name);
        if (commend != null) {
          commend.setFun_name(fun_name);
          commend.setmHandler(mHandler);
          commend.setParam(json);
          commend.setUuid(uuid);
          commend.setWebView(mWebView);
          commend.do_result(context);
        }
      }
    }).start();
  }

这里通过mWebView.addJavascriptInterface()实现调用JS中的方法,也就是说第二个参数为网页中的方法叫XXX();它里面的参数则为我下面send_command();方法中的参数然后我再做一些操作。最后通过loadurl();就实现调用了。很简答相信大家也都会用,也都用过,那么下面给大家详细介绍一下怎样通过这样的调用来实现JS调用Android端的一些控件

步骤

  • 首先JS调用客服端的某个方法,将需要的参数传递过来
  • 然后客户端根据JS的需求去执行相关操作
  • 执行完操作之后回掉JS方法

具体实现

第一步就是上面所描述的过程

这里省略了(其中fun_name就是JS要调的方法名字举个例子:比如它想要客户端实现弹出Dialog,那么web端定义一个方法名为:popup.alert)

客服端通过方法名字来执行相关操作

通过方法名我们本地去弹出Dialog,或者根据服务器返回的json数据来执行一些其他复杂的操作,我这里就不具体说明了,可以有很多,比如打开通讯录选择联系人、获取手机唯一标识符、设置导航栏、、弹出日期选择框等等。

执行完相关操作再回调JS的方法将信息返回给JS

比如上面的打开通讯录选择联系人之后我们可以将联系人的手机号姓名等属性通过Json返回给JS。
大体思路就是这样,看一下代码:

@JavascriptInterface 
public void send_comment(final String fun_name, final String json) {

  //根据fun_name处理不同业务
  new Thread(new Runnable() {
    @Override
    public void run() {
      //注意此处必须是异步处理
      JSONObject jsonObject = null;
      try {
        jsonObject = new JSONObject(json);
      } catch (JSONException e) {
        e.printStackTrace();
      }
      String title = jsonObject.optString("title");
      String message = jsonObject.optString("message");
      //TODO:根据message执行相关操作
      Message msg = new Message();
      msg.what = 0;
      msg.obj = jsonObject;
      handler.senMessage(msg);
    }
  }).start();
}

/**
 * 回掉JS方法将处理信息返回给JS
 * @param isSuccess
 * @param json
 */
public void returnToJs(final boolean isSuccess, final JSONObject json){
  Log.d("----", "javascript:app_result('" + isSuccess + "','" + json.toString() + "')");
      String data = "javascript:app_result('" + isSuccess + "','" + json.toString() + "')";
      webView.loadUrl(data);
}

private Handler handler = new Handler(){
  @Override
  public void handleMessage(Message msg) {
    super.handleMessage(msg);
    if (msg.what==0){
      //TODO:执行相关操作
      returnToJs(true, (JSONObject) msg.obj);
    }
  }
};

这样就实现了基本的JS调Android原生控件了,主要是和JS配合好就能完美实现了,现在好多的APP都用的这种方式来实现。所以说弄清楚这一块很有必要,其实也没什么,说是JS调用Android,其实就是Android这边提供一个java接口来loadurl()就可以。

以上就是为大家分享的Android JS相互调用的具体方法,希望对大家的学习有所帮助。

 类似资料:
  • 本文向大家介绍对vue中methods互相调用的方法详解,包括了对vue中methods互相调用的方法详解的使用技巧和注意事项,需要的朋友参考一下 如下所示: 最近在学习vue,并用vue+vue-router+axios+elementUI做了一个pos收银系统的前端页面,但是中间遇到methods里的方法调用问题。本身源码是没有调用的,但是我想直接调用多方便,结果出错了……然后百度了一波,终于

  • 本文向大家介绍Linux makefile 和shell文件相互调用实例详解,包括了Linux makefile 和shell文件相互调用实例详解的使用技巧和注意事项,需要的朋友参考一下 shell 文件内调用makefile文件: 说明:./configure文件是shell脚本文件,即shell内调用shell文件是很容易的;TemplateProcesser目录内有Makefile文件,调用

  • 本文向大家介绍Java Date与String的相互转换详解,包括了Java Date与String的相互转换详解的使用技巧和注意事项,需要的朋友参考一下 Java Date与String的相互转换详解 前言: 我们在注册网站的时候,往往需要填写个人信息,如姓名,年龄,出生日期等,在页面上的出生日期的值传递到后台的时候是一个字符串,而我们存入数据库的时候确需要一个日期类型,反过来,在页面上显示的时

  • 本文向大家介绍Python时间戳使用和相互转换详解,包括了Python时间戳使用和相互转换详解的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Python时间戳使用和相互转换的具体代码,供大家参考,具体内容如下 1.将字符串的时间转换为时间戳 方法:      2.字符串格式更改 如a = "2013-10-10 23:40:00",想改为 a ="2013/10/10 23:40:

  • 本文向大家介绍详解Struts2中json 相互引用死循环解决办法,包括了详解Struts2中json 相互引用死循环解决办法的使用技巧和注意事项,需要的朋友参考一下 方法1 :利用Struts 2的支持的可配置结果,可以达到过滤器的效果。Action的处理结果配置支持正则表达式。 但是如果返回的对象是一个数组格式的Json数据。比如peson Bean中有对象persion1…person9,而

  • 请求参数 easyopen定义了7个固定的参数,用json接收 { "name":"goods.get", "version":"2.0", "app_key":"test", "data":"%7B%22goods_name%22%3A%22iphone6%22%7D", "format":"json", "timestamp":"