常见js和java交互

**

前言

**
Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。

如何实现

实现Java和js交互十分便捷。通常只需要以下几步:
1、WebView开启JavaScript脚本执行。
2、WebView设置供JavaScript调用的交互接口。
3、客户端和网页端编写调用对方的代码。

示例代码

java端

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);//必须,开启js功能
      myWebView.addJavascriptInterface(new JsInteration(), "control");//定义java对象的在js中可用于访问的别名, window.control.xxx
      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  //此注释非常重要,4.2以上用于规避android addJavascriptInterface漏洞,低版本的不应该使用addJavascriptInterface, 而且onJsPrompt进行数据交互
      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);
      }
  }
}

前端:

<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>

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

调用js无参无返回值函数
String call = “javascript:sayHello()”;
//loadUrl(网页地址)打开网页
webView.loadUrl(call);

调用js有参无返回值函数
//注意对于字符串作为参数值需要进行转义双引号
String call = “javascript:alertMessage(”" + “content” + “”)";
webView.loadUrl(call);

调用js有参数有返回值的函数
Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。

Android 4.4调用返回值的js函数方法:
Js:

function getGreetings() {
      return 1;
}

Java:

webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String value) {
        Log.i(LOGTAG, "onReceiveValue value=" + value);
    }});

低于4.4:

String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);
function sumToJava(number1, number2){
       window.control.onSumResult(number1 + number2)
}
@JavascriptInterface
public void onSumResult(int result) {
  Log.i(LOGTAG, "onSumResult result=" + result);
}

你可能感兴趣的:(android,浏览器)