android与js的交互之jsbridge使用

众所周知,app的一些功能可能会使用到H5开发,这就难免会遇到java与js 的相互调用,android 利用WebViewJavascriptBridge 实现js和java的交互.

简单分析

java与js相互调用如下:
java发送数据给js,js接收并回传给java
同理,js发送数据给java,java接收并回传给js
同时两套流程都存在「默认接收」 与 「指定接收」
大致调用流程图如下:

?

依赖

项目build.gradle

repositories {
    // ...
    maven { url "https://jitpack.io" }
}

app build.gradle

dependencies {
    compile ‘com.github.lzyzsd:jsbridge:1.0.4‘
}

xml里直接使用com.github.lzyzsd.jsbridge.BridgeWebView替代原生WebView
另外放置两个Button用于测试使用

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/java_to_js_default"
        android:layout_width="180dp"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="java发送给js默认接收"
        app:layout_constraintTop_toBottomOf="@+id/nav_bar" />

    <Button
        android:id="@+id/java_to_js_spec"
        android:layout_width="180dp"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="java发送给js指定接收"
        app:layout_constraintTop_toBottomOf="@+id/java_to_js_default" />

    <com.github.lzyzsd.jsbridge.BridgeWebView
        android:id="@+id/webView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/java_to_js_spec" />

</android.support.constraint.ConstraintLayout>

html文件里简单放置两按钮发送数据,同时提供打印信息

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <button onClick="jsToJavaDefault()">js发送给java默认接收</button>
</div>
<br/>
<div>
    <button onClick="jsToJavaSpec()">js发送给java指定接收</button>
</div>
<br/>
<div id="show">打印信息</div>
</body>
</html>

这里我本地跑的一个简单的django项目,起了个服务供使用

webView.loadUrl("http://10.0.0.142:8000/cake/jsbridge");

webview加载页面

java发送数据给js

button注册监听

javaToJsDefault.setOnClickListener(this);
javaToJsSpec.setOnClickListener(this);

按钮点击事件,java传递数据给js

    //java传递数据给js
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.java_to_js_default:
                //默认接收
                webView.send("发送数据给js默认接收", new CallBackFunction() {
                    @Override
                    public void onCallBack(String data) { //处理js回传的数据
                        Toast.makeText(WebTestActivity.this, data, Toast.LENGTH_LONG).show();
                    }
                });
                break;
            case R.id.java_to_js_spec:
                //指定接收参数 functionInJs
                webView.callHandler("functionInJs", "发送数据给js指定接收", new CallBackFunction() {
                    @Override
                    public void onCallBack(String data) { //处理js回传的数据
                        Toast.makeText(WebTestActivity.this, data, Toast.LENGTH_LONG).show();
                    }
                });
                break;
            default:
                break;
        }
    }

js?WebViewJavascriptBridge注册事件监听,接收数据


<script>

       //注册事件监听,初始化
       function setupWebViewJavascriptBridge(callback) {
           if (window.WebViewJavascriptBridge) {
               callback(WebViewJavascriptBridge)
           } else {
               document.addEventListener(
                   ‘WebViewJavascriptBridgeReady‘
                   , function() {
                       callback(WebViewJavascriptBridge)
                   },
                   false
               );
           }
       }

       //回调函数,接收java发送来的数据
       setupWebViewJavascriptBridge(function(bridge) {
           //默认接收
           bridge.init(function(message, responseCallback) {
               document.getElementById("show").innerHTML = ‘默认接收到Java的数据: ‘ + message;

               var responseData = ‘js默认接收完毕,并回传数据给java‘;
               responseCallback(responseData); //回传数据给java
           });

           //指定接收,参数functionInJs 与java保持一致
           bridge.registerHandler("functionInJs", function(data, responseCallback) {
               document.getElementById("show").innerHTML = ‘指定接收到Java的数据: ‘ + data;

               var responseData = ‘js指定接收完毕,并回传数据给java‘;
               responseCallback(responseData); //回传数据给java
           });
       })

<script>

java发送给js默认接收

java发送给js指定接收

js发送数据给java

js按钮点击事件, 同时需要上面WebViewJavascriptBridge的注册监听回调函数

    //js传递数据给java
    function jsToJavaDefault() {
       var data = ‘发送数据给java默认接收‘;
       window.WebViewJavascriptBridge.send(
           data
           , function(responseData) { //处理java回传的数据
              document.getElementById("show").innerHTML = responseData;
           }
       );
   }

   function jsToJavaSpec() {
       var data=‘发送数据给java指定接收‘;
       window.WebViewJavascriptBridge.callHandler(
           ‘submitFromWeb‘ //指定接收参数 submitFromWeb与java一致
           ,data
           , function(responseData) { //处理java回传的数据
              document.getElementById("show").innerHTML = responseData;
           }
       );
   }

java 监听接收数据

        //默认接收
        webView.setDefaultHandler(new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {
                String msg = "默认接收到js的数据:" + data;
                Toast.makeText(WebTestActivity.this, msg, Toast.LENGTH_LONG).show();

                function.onCallBack("java默认接收完毕,并回传数据给js"); //回传数据给js
            }
        });
        //指定接收 submitFromWeb 与js保持一致
        webView.registerHandler("submitFromWeb", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {
                String msg = "指定接收到js的数据:" + data;
                Toast.makeText(WebTestActivity.this, msg, Toast.LENGTH_LONG).show();

                function.onCallBack("java指定接收完毕,并回传数据给js"); //回传数据给js
            }
        });

js发送给java默认接收

js发送给java指定接收

至此,jsBridge的使用流程完毕。同时欢迎关注

原文地址:http://blog.51cto.com/14009815/2341667

时间: 2024-11-09 01:00:23

android与js的交互之jsbridge使用的相关文章

浅谈混合开发与Android,JS数据交互

本文是作者原创,如转载请注明出处! 一.概论 现在时代已经走过了移动互联网的超级火爆阶段,市场上移动开发人员已经趋于饱和,显然,只会原生APP的开发已不能满足市场的需求,随着H5的兴起与火爆,H5在原生APP中的使用越来越广泛,也就是我们常说的混合开发(Hybrid APP).最新很火的微信小程序相信大家都是知道的,实际上微信小程序加载的界面就是一个HTML5的界面,HTML5界面在一些电商类的APP中主要承担展示数据的作用,但是他的作用并不仅限于此,最起码js调用原生方法和原生调用js的方法是

android 与js交互

android与js交互 // 设置编码 webView.getSettings().setDefaultTextEncodingName("utf-8"); // 支持js webView.getSettings().setJavaScriptEnabled(true); //参数1为传递的android对象,参数2为传递对象的变量名称之后JS中使用变量名进行对对象的操作 webView.addJavascriptInterface(new TestJs(), "testO

(转)Android与js交互实例(附源码)

本文转载于:http://blog.csdn.net/ithomer/article/details/8737999# Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true Android(Java)与JavaScript(HTML)交互有四种情况: 1) Android(Java)调用HTML中js代码 2) Android(Java)调用HTML中js代码(带参数) 3) HTML中js调用Android(

Webview Android与js交互

Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true Android(Java)与JavaScript(HTML)交互有四种情况: 1) Android(Java)调用HTML中js代码 2) Android(Java)调用HTML中js代码(带参数) 3) HTML中js调用Android(Java)代码 4) HTML中js调用Android(Java)代码(带参数) 下面示例总结这四种情况,直接上干货:

android code 和js的交互

小弟现在需要android code 和js的交互.出现了问题,求大家带一带啊. 我的页面:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,

Android—android与js交互以及相互传参

Android中可以通过WebView来实现与js的交互,让用户可以在android客户端看到js写的页面,接下来为大家介绍的就是怎样实现此功能: 首先android项目目录下有“assets”文件夹,开发者需要将html文件拷贝到此文件夹下. html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-tra

WebViewJavascriptBridge实现js与android和ios原生交互

1.实现原生与js交互     <!-- 申明交互 这段代码固定必须有 --> function setupWebViewJavascriptBridge(callback) {     //android使用     if (window.WebViewJavascriptBridge) {         callback(window.WebViewJavascriptBridge)     } else {         document.addEventListener(     

Android与js交互实例

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true Android(Java)与JavaScript(HTML)交互有四种情况: 1) Android(Java)调用HTML中js代码 2) Android(Java)调用HTML中js代码(带参

android 和 js 交互

1.html代码 <script type="text/javascript"> function javacalljs(){ document.getElementById("content").innerHTML = "JAVA调用了JS的无参函数"; } function javacalljswith(arg){ document.getElementById("content").innerHTML = (