Android 与H5交互之跳转拦截

  • Android拦截跳转,实现web调用原生Api
    • 定义变量
    • 在Android代码设置回调事件
    • 前端代码
    • 判断url是否合法
    • 根据不同的type执行不同的操作

Android拦截跳转,实现web调用原生Api

定义变量

private final String pre = "android://";//约定url格式private final String TYPE1 = "TYPE1";private final String TYPE2 = "TYPE2";private final String TYPE3 = "TYPE3";

在Android代码设置回调事件

// An highlighted blockwebview.setWebViewClient(new WebViewClient() {            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                //在此回调中,我们可以获得webView中的跳转地址.                //return true 表示我们消费掉此次回调                Log.e(url);//我们可以在此处打印日志查看是否有拦截带url地址                if(isAndroidLink(url,pre)){//判断是否为我们所约定的跳转                //可通过url获取参数                //列:                //该url是android方法的请求,通过解析url中的参数来执行相应方法                    if (url.length() > pre.length()) {//判断url长度大于约定长度时才做进一步判断,防止Java数组越界异常                        //截取10位以后的字符串                        String json = url.substring(pre.length(), url.length());                        //因为我们传入时base64加密过,所以需要使用base64解密,获得正确的json格式参数                        String s = new String(Base64.decode(json.getBytes(), Base64.DEFAULT));                        try {                            //获取json字符串中type值                            String type = new JSONObject(s).getString("type");                            //获取data                            JSONObject data = new JSONObject(s).getJSONObject("data");                            //对比字符串是否为指定类型,根据不同的type执行不同的操作                            executionByType(type,data);                        } catch (JSONException e) {                            e.printStackTrace();                        }                    }                    return true;                ...//执行你的代码逻辑.                }                 return super.shouldOverrideUrlLoading(view, url);            }            @Override            public void onPageFinished(WebView view, String url) {                super.onPageFinished(view, url);            }        });

前端代码

注:以下是在前端web页面中的代码

function toAndroid(type) {//此处type内容可以自定义    var host = "android://";//host可以自定义,相当于与原生做一个协议    var content =         "{" +        "\"type\":"+type+"," +        "\"data\":{" +            "\"string1\":"+type+"}" +            "\"string2\":"+type+"}" +            "\"string3\":"+type+"}" +            "\"string4\":"+type+"}" +        "}";//可在此设置你的传参    content = window.btoa(content);//此为js代码,base64转义可防止内容乱码以及简单的加密    window.location.href = host + content;//执行本地跳转}

判断url是否合法

private boolean isAndroidLink(String url,String contract){if (url.contains(contract)) {return ture;} else {return false;}}

根据不同的type执行不同的操作

private void executionByType(String type,JSONObject obj){Object 你的参数 = obj.get("你的参数");switch (type) {            case TYPE1:            //执行TYPE1相对应的操作            break;            case TYPE2:            //...            break;            case TYPE3:            //...            break;    }}

至此,我们就可以通过web的点击或者某一些触发条件,来调用我们手机端的Api来做一下事情.暂时只说到web调用原生,下回给大家带来原生回调给web页面的介绍.

更多相关文章

  1. [Android]解决EditText设置成密码模式改变提示字体的问题
  2. Google I/O Android官方新体系架构之:Lifecycle
  3. android selector 背景选择器的使用, button (未点击,点击,选中保持
  4. Android调用WCF
  5. Android(安卓)Studio 单刷《第一行代码》系列 07 —— Broadcast
  6. Android(安卓)Studio 单刷《第一行代码》系列 06 —— Fragment
  7. Android(安卓)Studio 单刷《第一行代码》系列 01 —— 第一战 He
  8. Android(安卓)Studio 单刷《第一行代码》系列 05 —— Fragment
  9. Android(安卓)Studio 单刷《第一行代码》系列 04 —— Activity

随机推荐

  1. Android中打印调用栈
  2. EasyPermission Android(安卓)6.0 最简洁
  3. 学习笔记:Android中使用网络技术的方法(web
  4. 【Arduino】Arduino接收字符串
  5. Android(安卓)常用git命令
  6. iTextPdf最简单最彻底解决中文显示
  7. 我的Android进阶之旅------>Android实现
  8. Android屏幕图标尺寸规范
  9. android.support.v7.widget.TintContextW
  10. Android(安卓)SQLite 支持嵌套事务吗?