Android页面内嵌套h5页面已经是随处可见了。在Android原生页面和h5页面的取舍上那些不是本文的重点。重点是,如此多的页面用网页来写,那么必定涉及到网页与原生的交互,俗称js交互。

目标:h5页面点击按钮Android端接收到网页传给的json数据。

实现

网页端
网页端添加如下内容

<script type="text/javascript"> var hasBridge = false    function connectWebViewJavascriptBridge(callback) {            if (window.WebViewJavascriptBridge) {                callback(WebViewJavascriptBridge)            } else {                document.addEventListener('WebViewJavascriptBridgeReady', function () {                    callback(WebViewJavascriptBridge)                }, false)            }        }        connectWebViewJavascriptBridge(function (bridge) {            bridge.init(function (message, responseCallback) {                hasBridge = true                var data = {'Javascript Responds': 'Wee!'}                $("#document .disabled").removeClass("disabled")                responseCallback(data)            })            $("#mzy").click(function(){                var sendObj = {"type":"user"};                sendObj["phone"] = "18067976937";                sendObj["nick"] = "maoamao";                bridge.send(JSON.stringify(sendObj), function (responseData) {                });            })        })script>

其中 mzy 是定义的一个id = “mzy”的按钮。传递的json数据为

{    "type":"user",    "phone":"18067976937",    "nick":"maoamao",}

Android端
Android端这里使用的github上开元项目BridgeWebView来显示h5页面。使用如下:

 webview.setWebViewClient(new BridgeWebViewClient(webview) {            @Override            public void onPageStarted(WebView view, String url, Bitmap favicon) {                super.onPageStarted(view, url, favicon);            }            @Override            public void onPageFinished(WebView view, String url) {                super.onPageFinished(view, url);            }            @Override            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {                super.onReceivedError(view, errorCode, description, failingUrl);                view.loadData(errorHtml, "text/html; charset=UTF-8", null);            }        });        //JS交互        webview.setDefaultHandler(new DefaultHandler() {            @Override            public void handler(String data, CallBackFunction function) {                super.handler(data, function);                Log.e("data", "data = " + data);                try {                    Gson gson = new GsonBuilder()                            .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)                            .setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();                    JSONObject jsonObject = new JSONObject(data);                    String type = jsonObject.getString("type");                    if (null != type && type.equals("user")) {                        String nick = jsonObject.getString("nick");                        Log.i("nick","nick = "+nick);                    } else if (null != type && type.equals("XXXXXX")) {                        xxxxxxxx;                    }                } catch (JSONException e) {                    e.printStackTrace();                }            }        });        webview.loadUrl("XXXXXXXXXX");        webview.send("hello-javascript");

这里根据因为同一个页面可能会有多种不同的交互需求,所以这里用type来区分不同的交互类型。这里可以根据jsonObject.getString(“nick”)获取到nick字段。 webview.loadUrl(“XXXXXXXXXX”);设置成你自己的h5页面地址即可。

目标二:Android端传递参数给web页

上面代码块里面最后一句webview.send(“hello-javascript”);就是Android端发送了一个”hello-javascript”字符串给web页。

web页接收Android发来的参数

<script>    function connectWebViewJavascriptBridge(callback) {        if (window.WebViewJavascriptBridge) {            callback(WebViewJavascriptBridge)        } else {              document.addEventListener('WebViewJavascriptBridgeReady', function(){                callback(WebViewJavascriptBridge)            }, false)        }    }    connectWebViewJavascriptBridge(function (bridge) {        bridge.init(function (message, responseCallback) {            alert("message"+message)            var data = {'Javascript Responds': 'Wee!'}            new Vue({                el: "#vue-app",                template: "#app-template",                data:{                    tab: 1,                },                events: {                    'bridgeEvt': function(obj) {                        bridge.send(JSON.stringify(obj),function(responseData){                            console.log(responseData);                        })                    }                },                ready: function(){                    if(/notice_type=2/.test(location.href)) {                        this.tab = 2                    }                },            });            responseCallback(data)        })    })script>

其中alert(“message”+message)message就是从Android传过来的参数。我们可以进行处理。

更多相关文章

  1. Android(安卓)Camera OMXCameraAdapter.cpp初始化分析
  2. Android(安卓)js交互 与 Html启动App
  3. Android的webview研究
  4. Android(安卓): 如何在WebView显示的页面中查找内容
  5. Android(安卓)多媒体数据库
  6. Android商城购物车页面实现和逻辑实现
  7. 如何通过网页打开Android(安卓)APP
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python技巧匿名函数、回调函数和高阶函数

随机推荐

  1. Android链式方法显示Dialog
  2. 【Android(安卓)总结】缩写
  3. 14 Android(安卓)android 按钮效果的两种
  4. [置顶] androidの下拉菜单Spinner使用
  5. Android(安卓)实现部分文字高亮的三种方
  6. Android中如何判断是否联网
  7. 【Android-File】Android文件的读写
  8. Android(安卓)pthread mutex 实现分析
  9. android 渐变背景
  10. Android(安卓)Error:AAPT: error: resourc