在Android上怎样实现JAVA和JS交互

如题所述

java和js交互分为三种情况,分别是:

1 调用网页上的js代码

Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true,,然后通过loadUrl就可以直接进行调用,如下所示:

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl("javascript:test()");

2 网页java代码的方法

在网页中调用java代码,需要在webview控件中添加javascriptInterface。如下所示:

mWebView.addJavascriptInterface(newObject() { 
            publicvoid clickOnAndroid() { 
                mHandler.post(newRunnable() { 
                    publicvoid run() { 
                        Toast.makeText(Test.this,"测试调用java", Toast.LENGTH_LONG).show();
                    } 
                }); 
            } 
        },"demo");

在网页中,只需要像调用js方法一样,进行调用就可以

<div id='b'><a onclick="window.demo.clickOnAndroid()">b.c</a></div>

3 Java代码调用js并传参

首先需要带参数的js函数,如functiontest(str),然后只需在调用js时传入参数即可,如下所示:

mWebView.loadUrl("javascript:test('aa')");

4.Js中调用java函数并传参

首先一样需要带参数的函数形式,但需注意此处的参数需要final类型,即得到以后不可修改,如果需要修改其中的值,可以先设置中间变量,然后进行修改。如下所示:

mWebView.addJavascriptInterface(newObject() { 
            publicvoid clickOnAndroid(final int i) { 
                mHandler.post(newRunnable() { 
                    publicvoid run() { 
                                intj = i;
                                j++;
                 Toast.makeText(Test.this,"测试调用java" + String.valueOf(j), Toast.LENGTH_LONG).show();
                    }
                });
            } 
        },"demo");

然后在html页面中,利用如下代码<divid='b'><a onclick="window.demo.clickOnAndroid(2)">b.c</a></div>,

下面是安卓无忧中js 与安卓相互调用的效果图,可以百度一下安卓无忧,点击源码,看看里面的源码。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-04-30
其实webview加载资源的速度并不慢,但是如果资源多了,当然就很慢。图片、css 、js 、html这些资源每个大概需要10-200ms ,一般都是30ms就ok了。不过webview是必须等到全部资源都完成加载,才会进行渲染的,所以加载的速度很重要!从Google上我们了解到,webview加载页面的顺序是:先加载html,然后从里面解析出css、js文件和页面上的图片资源进行加载。如果webkit的缓存里面有,就不加载。加载完这些资源之后,就进行css的渲染和js的执行。Css的渲染一般不需要很长时间,几十毫秒就ok。关键是js的执行,如果用了jQuery,则执行起来需要5-6秒。而在这段时间,如果不在webview里设置背景,网页部分是白色的,很难看。这是一个很糟糕的用户体验。所以#欧#柏泰#克建议如果用网页布局程序,最好别用那些庞大的js框架。最好使用原生的js写业务脚本,以提升加载速度,改善用户体验。
在Android上怎样实现JAVA和JS交互呢?Android的webview是基于webkit内核的,webview中集成了js与java互调的接口函数,通过addJavas criptInterface方法,可以将Java的类注册进webkit,给网页上的js进行调用,而且还可以通过loadUrl方法是给webkit传递一个URL,供浏览器来进行解析,实现Java和js交互。
要想运行网页上的js脚本,webview必须设置支持Javas cript。
Java代码
1mWebview.getSettings().setJavas criptEnabled(true);
然后是设置webview要加载的网页:
web的网页:webView.loadUrl("http://www.google.com");
本地的网页:webView.loadUrl("file:///android_asset/XX.html"); //本地的存放在:assets文件夹中
webview做完基本的初始化后我们还要要给它,加进一个回调的代理类Javas criptInterface,并给它一个调用的名称:ncp
Java代码
1mWebView.addJavas criptInterface(new Javas criptInterface(),"ncp");
Javas criptInterface可以是一个普通的Java类,类实现的方法,均可被js回调:
Java代码
final class Javas criptInterface {
public int callOnJs() {
return 1000;
}
public void callOnJs2(String mode) {
//TODO
}
}
Java要调用js的方法,只需知道js的方法名称即可:
Java代码
1mWebView.loadUrl("javas cript:onSaveCallback()");
js 这边就更简单:
Js代码
window.onload = function(){
document.getElementById('btn_1').addEventListener('click', onBtnClick, false);
var _int_value = window.ncp.callOnJs();
alert("get int from java:" + _int_value );
}
function onBtnClick() {
window.ncp.callOnJs2("click");
}
Java和js交互有以下一些特点:
1.Java 调用 js 里面的函数,速度并不令人满意,大概一次一两百毫秒吧,如果要做交互性很强的事情,这种速度会让人疯掉的。而反过来就不一样了, js 去调 java 的方法,速度很快,基本上 40-50 毫秒一次。所以尽量用 js 调用 java 方法,而不是 java 去调用 js 函数。
2.Java 调用 js 的函数,没有返回值,而 Js 调用 java 方法,可以有返回值。返回值可以是基本类型、字符串,也可以是对象。如果是字符串,有个很讨厌的问题,第 3 点我会讲的。如果是对象,这个对象会被转换为 js 的对象,直接可以访问里面的方法。但是我不推荐 java 返回给 js 的是对象,除非是必须。因为 js 收到 java 返回的对象,会产生一些交换对象,而如果这些对象的数量增加到了 500 或 600 以上,程序就会出问题。所以尽量返回基本数据类型或者字符串。
3.Js 调用 Java 的方法,返回值如果是字符串,你会发现这个字符串是 native 的,不能对它进行一些修改操作,比如想对它 substr ,取不到。怎么解决呢?转成 locale 的。使用 toLocaleString() 函数就可以了。不过这个函数的速度并不快,转化的字符串如果很多,将会很耗费时间。本回答被提问者采纳
第2个回答  2016-08-23

实现Java和js交互通常只需要以下几步。

    WebView开启JavaScript脚本执行

    WebView设置供JavaScript调用的交互接口。

    客户端和网页端编写调用对方的代码。

实例演示:

1. java代码



package com.example.javajsinteractiondemo;
import android.annotation.SuppressLint;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.Menu;

import android.webkit.JavascriptInterface;

import android.webkit.WebChromeClient;

import android.webkit.WebSettings;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.Toast;
public class MainActivity extends Activity {

  private static final String LOGTAG = "MainActivity";

  @SuppressLint("JavascriptInterface")

  @Override

  protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      final WebView myWebView = (WebView) findViewById(R.id.myWebView);

      WebSettings settings = myWebView.getSettings();

      settings.setJavaScriptEnabled(true);

      myWebView.addJavascriptInterface(new JsInteration(), "control");

      myWebView.setWebChromeClient(new WebChromeClient() {});

      myWebView.setWebViewClient(new WebViewClient() {
          @Override

          public void onPageFinished(WebView view, String url) {

              super.onPageFinished(view, url);

              testMethod(myWebView);

          }

          

      });

      myWebView.loadUrl("file:///android_asset/js_java_interaction.html");

  }

  

  private void testMethod(WebView webView) {

      String call = "javascript:sayHello()";

      

      call = "javascript:alertMessage(\"" + "content" + "\")";

      

      call = "javascript:toastMessage(\"" + "content" + "\")";

      

      call = "javascript:sumToJava(1,2)";

      webView.loadUrl(call);

      

  }

  

  public class JsInteration {

      

      @JavascriptInterface

      public void toastMessage(String message) {

          Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();

      }

      

      @JavascriptInterface

      public void onSumResult(int result) {

          Log.i(LOGTAG, "onSumResult result=" + result);

      }

  }
}


2. 前端网页代码



<html>

<script type="text/javascript">

    function sayHello() {

        alert("Hello")

    }
    function alertMessage(message) {

        alert(message)

    }
    function toastMessage(message) {

        window.control.toastMessage(message)

    }
    function sumToJava(number1, number2){

       window.control.onSumResult(number1 + number2)

    }

</script>

Java-Javascript Interaction In Android

</html>

3.调用示例

js调用Java

调用格式为window.jsInterfaceName.methodName(parameterValues) 此例中我们使用的是control作为注入接口名称。



function toastMessage(message) {

  window.control.toastMessage(message)

}
function sumToJava(number1, number2){

   window.control.onSumResult(number1 + number2)

}

4. Java调用JS

webView调用js的基本格式为webView.loadUrl(“javascript:methodName(parameterValues)”)

调用js无参无返回值函数



String call = "javascript:sayHello()";

webView.loadUrl(call);

调用js有参无返回值函数

注意对于字符串作为参数值需要进行转义双引号。



String call = "javascript:alertMessage(\"" + "content" + "\")";

webView.loadUrl(call);

调用js有参数有返回值的函数

第3个回答  2016-06-02
Android的webview是基于webkit内核的,webview中集成了js与java互调的接口函数,通过addJavas criptInterface方法,可以将Java的类注册进webkit,给网页上的js进行调用,而且还可以通过loadUrl方法是给webkit传递一个URL,供浏览器来进行解析,实现Java和js交互。
要想运行网页上的js脚本,webview必须设置支持Javas cript。
Java代码
1mWebview.getSettings().setJavas criptEnabled(true);
然后是设置webview要加载的网页:
web的网页:webView.loadUrl("http://www.google.com");
本地的网页:webView.loadUrl("file:///android_asset/XX.html"); //本地的存放在:assets文件夹中
webview做完基本的初始化后我们还要要给它,加进一个回调的代理类Javas criptInterface,并给它一个调用的名称:ncp
Java代码
1mWebView.addJavas criptInterface(new Javas criptInterface(),"ncp");
Javas criptInterface可以是一个普通的Java类,类实现的方法,均可被js回调:
Java代码
final class Javas criptInterface {
public int callOnJs() {
return 1000;
}
public void callOnJs2(String mode) {
//TODO
}
}
Java要调用js的方法,只需知道js的方法名称即可:
Java代码
1mWebView.loadUrl("javas cript:onSaveCallback()");
js 这边就更简单:
Js代码
window.onload = function(){
document.getElementById('btn_1').addEventListener('click', onBtnClick, false);
var _int_value = window.ncp.callOnJs();
alert("get int from java:" + _int_value );
}
function onBtnClick() {
window.ncp.callOnJs2("click");
}
第4个回答  2016-09-13
说的不对别喷~
大概是这样子的:
1、首先ajax发起一个长链接到后台,查询消息队列是否有消息。
2、java代码执行完了,然后向消息队列中推送消息。
3、第一步中收到消息队列的消息,返回到前台,执行JS代码。

消息队列可以自己写,也可以用第三方的,比如说:activeMQ
第5个回答  2016-05-19
以页面上获取手机GPS数据为例,在MainActivity类的onCreate()方法中,加入:
  //下面这段代码用来获取手机GPS位置信息,页面pdaMain.jsp中定时来获取GPS信息并存入数据库
  webView.addJavascriptInterface(new Object(){
  @JavascriptInterface
  public String getLocation(){
  HashMap<String,String> map=GetLocationByGPS.getLocation(MainActivity.this);
  String latitude=map.get("latitude")!=null?map.get("latitude").toString():"none";//经度
  String longitude=map.get("longitude")!=null?map.get("longitude").toString():"none";//纬度
  String altitude=map.get("altitude")!=null?map.get("altitude").toString():"none";//海拔
  //同时返回IP和MAC地址
  String ipAndMac=GetPadIpAndMac.getLocalMacAddressFromWifiInfo(MainActivity.this);
  if(ipAndMac==null||ipAndMac.equals("")){
  ipAndMac="none/none";
  }
  return latitude+"/"+longitude+"/"+altitude+"/"+ipAndMac;
  }
  },"getGPSData");
然后,在页面pdaMain.jsp中,用
<javascript>
  var backStr=window.getGPSData.getLocation();
</javascript>

backStr返回:精度/维度/海拔/IP
第6个回答  2016-05-24
在Android上怎样实现JAVA和JS交互呢?Android的webview是基于webkit内核的,webview中集成了js与java互调的接口函数,通过addJavas criptInterface方法,可以将Java的类注册进webkit,给网页上的js进行调用,而且还可以通过loadUrl方法是给webkit传递一个URL,供浏览器来进行解析,实现Java和js交互。