WebView-JsBridge框架使用Demo

前言

GitHub源代码
随着市面上WebApp应用的逐渐普及,Android中的WebView应用越来越广泛,使用WebView中比较经典的问题就是如何让Navtive和Js进行通信,相关原理可以查看WebView应用实战

JsBridge解决了那些问题

  • 支持单向给Js发送全局信息
  • 支持Native和JavaScript双向通信

Android JsBridge 的使用

Android JsBridge 搭建

搭建流程总结

  • 在app级别的build.gradle中添加JsBridge URI
  • 使用的是封装的BridgeWebView而不是原生的WebView

在app级别的build.gradle中添加JsBridge URI:

    compile 'com.github.lzyzsd:jsbridge:1.0.4'

使用BridgeWebView替代WebView

    <com.github.lzyzsd.jsbridge.BridgeWebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
     </com.github.lzyzsd.jsbridge.BridgeWebView>

Android JsBridgeAPI使用

JsBridge主要提供了两个API:

  • BridgeWebView.callHandler(String handlerName, String data, CallBackFunction callBack):调用JS方法
  • BridgeWebView.registerHandler(String handlerName, BridgeHandler handler) :注册方法,以供JS调用原生方法
Native调用JS的方法

BridgeWebView.callHandler(String handlerName, String data, CallBackFunction callBack)
用于调用JS的方法,有三个参数,分别表示:
handlerName:操作方法名,注册一个调用JS function 的方法,handlerName指代JS function的方法名,也是一种标识
data:是想要发送的字符串数据,可以把任何想发送的数据进行序列化发送
callBack:回调方法,调用JS方法成功后,JS方法进行回调
代码样列如下:

 BridgeWebView.callHandler("functionInJs", "data from Java", new CallBackFunction() {

		@Override
		public void onCallBack(String data) {
			// TODO Auto-generated method stub
			Log.i(TAG, "reponse data from js " + data);
		}

});

这段代码,就是调用了JS的functionInJs方法,调用信息为 “data from Java”,然后显示JS返回的数据,完成整个流程的双向通信。

Native注册方法让JS调用

BridgeWebView.registerHandler(String handlerName, BridgeHandler handler)
注册一个本地方法以供JS调用,该方法有三个参数,handlerName为本地方法名,handler是处理方法,当JS调用handlerName方法时,handler里的方法将会被调用。
代码样列:

		BridgeWebView.registerHandler("submitFromWeb", new BridgeHandler() {

			@Override
			public void handler(String data, CallBackFunction function) {
				Log.i(TAG, "handler = submitFromWeb, data from web = " + data);
                function.onCallBack("submitFromWeb exe, response data 中文 from Java");
			}

		});

当Js需要调用原生的方法时,这个方法就可以做相应的逻辑,处理完成后,把处理结果返回前端。

设置默认的处理Handler

JsBridge为了解决JS调用了还没有注册的本地方法问题,集成了一个DefaultHandler类以处理默认的行为,以防止出现注册后没有任何响应的问题:

BridgeWebView.setDefaultHandler(new DefaultHandler());
给JS发送无需响应的数据
BridgeWebView.send("hello");

不指定handlerName,也没有回调,发送后Js会有对应的默认function进行处理.

JavaScript JsBridge使用

JsBridge还配套编写了WebViewJavascriptBridge.js的脚本以供WebApp直接进行使用,主要运行在配套的自定义WebViews上可以就使用window.WebViewJavascriptBridge对象进行使用相关的API。

JavaScript JsBridge 坏境配置

在使用JavaScript JsBridge 之前,我们需要监听window是否已经具备WebViewJavascriptBridge对象:

        function connectWebViewJavascriptBridge(callback) {
            if (window.WebViewJavascriptBridge) {
                callback(WebViewJavascriptBridge)
            } else {
                document.addEventListener(
                    'WebViewJavascriptBridgeReady'
                    , function() {
                        callback(WebViewJavascriptBridge)
                    },
                    false
                );
            }
        }

这段代码的意识是通过判断window.WebViewJavascriptBridge是否存在,如果存在说明window坏境已经对脚本进行了初始化可以使用,如果不存在就添加WebViewJavascriptBridgeReady监听,当初始化完毕后,调用回调函数callback进行一些初始化操作。

JavaScript JsBridge API使用

JavaScript调用原生的方法
window.WebViewJavascriptBridge.callHandler(
         'submitFromWeb'
          , {'param': '中文测试'}
           , function(responseData) {
            document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData
         }
 );

这个方法调用了Native的submitFromWeb方法,并在调用成功后进行一些显示处理。

JavaScript注册function方法供Native调用

在之前,我们已经知道window.WebViewJavascriptBridge初始化完毕会进行调用回调callback,一般在callback中会做JS的function的方法注册和默认处理方法的注册。下面我们来看看注册function方法的样列,只有进行了注册的方法,Native才能调用:

        connectWebViewJavascriptBridge(function(bridge) {
            bridge.registerHandler("functionInJs", function(data, responseCallback) {
                document.getElementById("show").innerHTML = ("data from Java: = " + data);
                if (responseCallback) {
                    var responseData = "Javascript Says Right back aka!";
                    responseCallback(responseData);
                }
            });
        })

样列中注册了functionInJs方法,当Native调用functionInJs方法的时候,就会回调这个方法,然后JS进行一些处理后,回调结果给Native.

JavaScript创建默认的处理function

有些为了通讯方便或者方便调试等因素,我们需要注册一个统一处理的方法进行管理,这个方法在初始化的时候就要定好:

        connectWebViewJavascriptBridge(function(bridge) {
            bridge.init(function(message, responseCallback) {
                console.log('JS got a message', message);
                var data = {
                    'Javascript Responds': '测试中文!'
                };

                if (responseCallback) {
                    console.log('JS responding with', data);
                    responseCallback(data);
                }
            });
        })

上面的方法进行初始化一个方法,进行无没有注册方法被Native调用的管理,也接受WebView.send()过来的数据。

JavaScript单向发送数据
            window.WebViewJavascriptBridge.send(
                data
                , function(responseData) {
                    document.getElementById("show").innerHTML =
                     "repsonseData from java, data = " + responseData
                }
            );

结语

  • JavaScript脚本的API和Java Native的库比较起来大家都能看出都支持类似的功能
  • 主要支持发送信息给前端然后处理完成后响应,也支持前端发送数据,并在接受到后给前端发送响应信息,这很类似两端进行C/S通信
  • 两端的核心原理思想其实很简单,就是我给你发送信息,然后你接收到后,对我进行发送信息进行响应,这就完成了整个双向通信的流程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值