日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

客户端相关知识学习(三)之Android原生与H5交互的实现

發布時間:2025/3/15 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 客户端相关知识学习(三)之Android原生与H5交互的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android原生與H5交互的實現

H5調用原生的方式

方式可能有多種,根據開發經驗,接觸過兩種方式。

方法一:Android向H5注入全局js對象,也就是H5調Android

1.首先對WebView進行初始化

WebSettings settings = webview.getSettings();

settings.setJavaScriptEnabled(true); //允許在WebView中使用js

2.創建一個類JavaScriptMetod,專門用來給js提供可調用的方法

3.創建該類的構造方法,提供兩個參數,WebView對象和上下文對象

private Context mContext;

private WebView mWebView;

public JavaScriptMethod(Context context, WebView webView) {

  mContext = context;

  mWebView = webView;

}

4.創建一個字符串常量,作為android與js通信的接口,即字符串映射對象

public static final String JAVAINTERFACE = "javaInterface";

5.接下來就是創建給js調用的方法,方法的參數接收一個json字符串(注意:在Android4.2之后,為了提高代碼安全性,方法必須使用注解@JavascriptInterface,否則無法調用)

@JavascriptInterface

//andorid4.2(包括android4.2)以上,如果不寫該注解,js無法調用android方法

public void showToast(String json){

  Toast.makeText(context, json, Toast.LENGTH_SHORT).show();

}

6.在WebView初始化代碼中執行如下代碼

//創建上面創建類的對象

JavaScriptMetod m = new JavaScriptMetod(this, webview);

//其實就是告訴js,我提供給哪個對象給你調用,這樣js就可以調用對象里面的方法

//第二個參數就是該類中的字符串常量

webview.addJavascriptInterface(m, JavaScriptMetod.javaInterface);

現在,在js中就可以調用JavaScriptMetod中的方法了,調用方式如下

//參數一般為json格式

var json = {"name":"javascript"};

//javaInterface是上面所說的字符串映射對象

window.javaInterface.showToast(JSON.stringify(json));

網絡上介紹js與android原生交互的文章里,大部分都是上面這種方式,但是這種方式并不適用于ios,也就是說,window.javaInterface.showToast(JSON.stringify(json))這樣的js代碼并不適用于ios,如果用以上的方法,就得分別為android和ios各

寫一套js代碼。這樣很顯然是不太合理的,所以在實際開發中,一般都使用接下來的第二種方法。

方法二:H5發起自定義協議請求,Android攔截請求,再由Android調用H5中的回調函數

這種方法實現的思想是js發出一個url請求,并將所需的參數添加到該url中。android端通過webView.setWebViewClient()攔截url,解析url中攜帶的參數,并根據參數信息進行相應的操作。

1.與方法一相同,首先都需要對webview進行初始化

WebSettings settings = webview.getSettings();

settings.setJavaScriptEnabled(true); //允許在WebView中使用js?

2.首先看js中的代碼是怎么寫的

$("#showtoast").click(function () {

  var json = {"data": "I am a toast"};

  window.location.href="protocol://android?code=toast&data="+JSON.stringify(json);

});

$("#call").click(function () {

  var json = {"data": "10086"};

  window.location.href="protocol://android?code=call&data="+JSON.stringify(json);

});

這里定義兩個點擊事件,分別控制android顯示toast和打電話的操作。其中,protocol://android為自定義的H5與android間的通信協議,與http請求進行區分。code規定了要進行的操作,data為傳輸的數據。

3.android中的代碼

webView.setWebViewClient(new WebViewClient() {

  @Override

  public boolean shouldOverrideUrlLoading(WebView view, String url) {

  /**

  * 通過判斷攔截到的url是否含有pre,來辨別是http請求還是調用android方法的請求

  */

  String pre = "protocol://android";

  if (!url.contains(pre)) {

    //該url是http請求,用webview加載url

    return false;

  }

  //該url是調用android方法的請求,通過解析url中的參數來執行相應方法

  Map map = getParamsMap(url, pre);

    String code = map.get("code");

    String data = map.get("data");

    parseCode(code, data);

    return true;

  }

});

其中,getParamsMap()方法從攔截到的url解析出code,data參數,parseCode()方法將根據不同的code進行相應的操作,代碼如下:

private Map getParamsMap(String url, String pre) {

  ArrayMap queryStringMap = new ArrayMap<>();

    if (url.contains(pre)) {

      int index = url.indexOf(pre);

      int end = index + pre.length();

      String queryString = url.substring(end + 1);

      String[] queryStringSplit = queryString.split("&");

      String[] queryStringParam;

      for (String qs : queryStringSplit) {

        if (qs.toLowerCase().startsWith("data=")) {

          //單獨處理data項,避免data內部的&被拆分

          int dataIndex = queryString.indexOf("data=");

          String dataValue = queryString.substring(dataIndex + 5);

          queryStringMap.put("data", dataValue);

        } else {

          queryStringParam = qs.split("=");

          String value = "";

            if (queryStringParam.length > 1) {

              //避免后臺有時候不傳值,如“key=”這種

              value = queryStringParam[1];

            }

          queryStringMap.put(queryStringParam[0].toLowerCase(), value);

        }

      }

    }

  return queryStringMap;

}

private void parseCode(String code, String data) {

  if(code.equals("call")) {

    try {

      JSONObject json = new JSONObject(data);

      String phone = json.optString("data");

      //執行打電話的操作,具體代碼省略

      PhoneUtils.call(this, phone);

    } catch (JSONException e) {

      e.printStackTrace();

    }

  return;

}

if(code.equals("toast")) {

  try {

    JSONObject json = new JSONObject(data);

    String toast = json.optString("data");

    Toast.makeText(this, toast, Toast.LENGTH_SHORT).show();

  } catch (JSONException e) {

    e.printStackTrace();

  }

  return;

 }

}

最后,特別說明一下shouldOverrideUrlLoading()方法的返回值問題,該方法的返回值有三種:

  • 返回true,即根據代碼邏輯執行相應操作,webview不加載該url;

  • 返回false,除執行相應代碼外,webview加載該url;

  • 返回super.shouldOverrideUrlLoading(),點進父類中,我們可以看到,返回的還是false。

轉載于:https://www.cnblogs.com/kunmomo/p/11556135.html

總結

以上是生活随笔為你收集整理的客户端相关知识学习(三)之Android原生与H5交互的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产传媒在线视频 | 午夜免费在线 | 亚洲av第一成肉网 | 国产高清视频在线免费观看 | 中国特级黄色大片 | 国产精品网页 | 性生活网址 | 美国伊人网 | 欧美sm凌虐视频网站 | 国产真实乱人偷精品人妻 | 借种(出轨高h) | 999久久久久久 | 国产啊v在线 | 国产欧美综合一区二区三区 | 性按摩玩人妻hd中文字幕 | 一进一出好爽视频 | 国产在线中文 | 久久久久97| 欧美色图在线播放 | 国产在线视频你懂得 | 午夜理伦三级做爰电影 | 国产乡下妇女做爰毛片 | 91福利社在线观看 | 久久香蕉综合 | 边啃奶头边躁狠狠躁 | 黑丝少妇喷水 | 老太脱裤让老头玩ⅹxxxx | 国产看真人毛片爱做a片 | 亚洲成人激情av | 李宗瑞91在线正在播放 | 台湾av在线播放 | 激情三区 | 免费看日韩 | 懂色av一区二区三区 | 琪琪av在线| 欧美精品成人一区二区三区四区 | 日韩www在线观看 | 日韩欧美一级大片 | 国产精品第157页 | 快色视频 | 永久精品网站 | 海角国产乱辈乱精品视频 | 日韩欧美视频网站 | 久久伊 | 国产精品日韩专区 | 欧美骚少妇| 超91在线 | 国产精品jizz在线观看无码 | 97狠狠操| 美日韩在线观看 | 日日夜夜狠狠操 | 国产剧情在线观看 | 欧美自拍色图 | 国产又黄又硬又粗 | 国产在线视频二区 | 久热国产精品 | 欧美另类第一页 | 91免费黄视频| 午夜插插插| 午夜国产在线 | 视频在线看| videos另类灌满极品另类 | 一区二区三区视频播放 | 强行挺进白丝老师里呻吟 | 亚洲欧美日韩免费 | 观看av | 亚洲精品国产无码 | 成人影视在线播放 | 一级黄色大片免费观看 | 国产三级在线观看完整版 | 香蕉成视频人app下载安装 | av中文一区 | 久久精品国产亚洲av久 | 日韩国产成人无码av毛片 | 免费在线看黄视频 | 国产又大又黄又爽 | 亚洲黄色免费网站 | 国产大奶在线观看 | 欧美一区二区视频在线 | 天堂网2018| 亚洲日本中文 | 久草免费资源站 | 一区二区看片 | 国产精品一区二区在线免费观看 | 爱色av网站 | 国产精品久久久久久久久免费看 | 欧美性精品| 丰满少妇一区二区 | 日本xxxx高清| 欧美先锋影音 | 黄网站欧美内射 | 久久国产柳州莫菁门 | 免费av免费观看 | 国产成人精品一区二区无码呦 | 天天欧美 | 天堂在线观看 | a级片免费在线观看 | 亚洲一区二区三区在线免费观看 | 激情久久中文字幕 |