H5页面与Android原生页面交互

来源:互联网 发布:ios工具类软件 知乎 编辑:程序博客网 时间:2024/05/02 00:48

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

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

{    "type":"user",    "phone":"18067976937",    "nick":"maoamao",}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

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");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

这里根据因为同一个页面可能会有多种不同的交互需求,所以这里用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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 信用卡没有收到又退回去了怎么办 新疆不给邮寄快递被退回运费怎么办 淘宝上已付款还在想留言怎么办 b超显示肾结石但x光看不到怎么办 洗脚让洗脚妹摸射精了怎么办 在新疆塔城干活不给工资怎么办 挨打了屁股肿的又大又硬怎么办 李贞将军有关电影小腿肌腱疼怎么办 朋友老婆老是背地里说我坏话怎么办 当你听到别人在背后说你时怎么办 分手了和前任是同事需要见面怎么办 和附近的人聊天他约你见面怎么办 微信约妹子发完红包拉黑了怎么办 户口本被前妻扣着不能结婚怎么办 部队当兵户口没注销退伍回去怎么办 没打疫苗的狗狗咬了我的嘴巴怎么办 新车被撞了还没上牌怎么办? 签了合同上两天班想辞职怎么办 刚到公司上班两天想辞职怎么办 签入职合同一天后就不想干了怎么办 入职材料交了第二天就想离职怎么办 宝宝40周多了还不想出来怎么办 工厂上班不到三个月不给辞工怎么办 单位辞职后不上班了保险怎么办 药流6个小时没流下来怎么办 小孩有口臭怎么办这几天不想吃饭 七个月宝宝口臭不想吃饭怎么办啊 老公工作累想要辞职不上班怎么办 药物流产后第6天咋下坠的怎么办 药流第一天胎囊没有掉下来怎么办 药流还有一点没流干净怎么办 3个月的宝宝被电了一下怎么办 宝宝吃奶粉过敏下巴红有疙瘩怎么办 小孩牙齿没掉又长出新牙怎么办 8个月婴儿地包天怎么办 欠别人很多钱 要告我怎么办 ps意外的遇到文件尾损坏了怎么办 长期作息不规律引起的头疼怎么办 退休年龄到了社保没满15年怎么办 要退休了单位把我工资表丢了怎么办 非工伤单位不支付病假工资怎么办