前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android原生与H5通信

Android原生与H5通信

作者头像
饮水思源为名
发布2018-09-06 12:51:57
1K0
发布2018-09-06 12:51:57
举报
文章被收录于专栏:Android小菜鸡Android小菜鸡

  如今,混合开发似乎成为了主流。H5拥有跨平台的优势,却存在性能上的问题正好可以用搭建原生壳承载H5代码的方式去解决。   如何理解这种方式,就好像说Android原生代码封装外壳,内部包含H5代码作为核心内容。更细节一点,我们把引导页、登录页、首页等等与业务关联打不并且与用户交互较多的页面用原生去写,而业务页面,逻辑代码由H5处理,将他们结合就形成了混合开发的由原生壳承载的H5APP。   这么做有什么好处呢?组个例子,我们利用这种方式做好了一个Android原生APP,现在需要做一个IOS原生APP,我们可以直接简单搭建一个IOS壳,复用H5代码,完成IOS原生APP。同时我们需要在钉钉、微信小程序等等平台搭建,可以直接复用我们已有的H5代码。   而这样的搭建方式比纯H5搭建的APP的优势在于因为有原生壳的存在,可以自由的使用原生API。保证了交互上的流畅性。

如何实现原生与H5的通信呢?

关于通讯我们需要解决两个问题:

  1. 原生向H5通讯
  2. H5向原生通讯

  第一个问题很好解决,以Android为例,WebView提供特有的方法,当你打开一个Html,你可以去调用这个Html中包含的JS。例如: webview.loadUrl("javascript:callH5('Android ok')");   第二个问题我们采用发送指令的方式来处理。同样以Android为例,WebView可以拦截html跳转时的url地址,我们可以利用这个地址,约定一个规则,如果符合规则,则拦截后不执行跳转,通过这个url获取我们需要的信息,执行对应的操作。 window.location.href=protocol://android?code=toast&data=+Json.stringify(config) 上述是一段JS的页面跳转方法。我们规定规则PRE=protocol://android?,当我们拦截的url包含PRE时,则我们认为这是一条指令,不需要跳转页面,应该执行对应操作。而参数code则是我们的指令内容,data为通信时的传参。   接下来是原生这边处理。首先我们拦截url。这里笔者还处理由于Http攻击导致H5页面出现广告的问题。我们主要是第一个if。

代码语言:javascript
复制
  webView.setWebViewClient(new WebViewClient() {
            // Load opened URL in the application instead of standard browser
            // application
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                showLogInfo("拦截到的url----"+url);
                String advertising="http://"+sharedPreferencesUtil.getData(Constant.IP, RequestConfig.IP)
                        +":"+sharedPreferencesUtil.getData(Constant.PORT,RequestConfig.IPPORT);
                if (url.contains(pre)) {
                    Map<String, String> map = getParamsMap(url, pre);
                    String code = map.get("code");
                    String data = map.get("data");
                    parseCode(code, data);
                    return true;
                }else if(!url.contains(advertising)){
                    showLogError("拦截到植入广告,广告的url——"+url);
                    return true;
                } else{
                    return false;
                }
            }
        });

return 为ture表示拦截成功,不执行后面的跳转操作。而false表示按正常流程执行。拦截成功后我们从url中获取code和data,接着就可以按照我们自己的需求去处理了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何实现原生与H5的通信呢?
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档