首页 > 其他分享 >客户端相关知识学习(三)之Android原生与H5交互的实现

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

时间:2023-11-28 12:58:39浏览次数:30  
标签:String url H5 json Android js data android 客户端

 

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。

标签:String,url,H5,json,Android,js,data,android,客户端
From: https://www.cnblogs.com/onesea/p/17861677.html

相关文章

  • 客户端相关知识学习(四)之H5页面如何嵌套到APP中
      Android原生如何渲染H5页面Android与H5的交互方式大概有以下1种:利用WebView进行交互(系统API)iOS原生如何渲染H5页面iOS与H5的交互方式大概有以下5种:利用WKWebView进行交互(系统API)利用UIWebView进行交互(系统API)苹果的javascriptcore.f......
  • 客户端相关知识学习(五)之什么是webView
      webview是什么?作用是什么?和浏览器有什么关系?Android系统中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件也就是说WebView是一个基于webkit引擎、可以解析DOM元素展现web页面的控件,它和浏览器展示页面的原理是相同的所以可以把它当做浏览器......
  • 客户端相关知识学习(八)之Android“.9.png”
    客户端相关知识学习(八)之Android“.9.png” 参考Android中.9图片的含义及制作教程.9.pngAndroid.9.png的介绍......
  • 客户端相关知识学习(七)之沉浸式
      何为沉浸式设计我们可以将为了沉浸式(心流)而进行的设计可以称之为沉浸式设计(为心流而设计)。沉浸模式就是突出内容,排除干扰,对界面除内容以外的东西尽可能的进行圆润的简化,将用户所关注的内容最大程度的呈现于屏幕之上。沉浸式设计案例而沉浸式设计的例子通常就是隐藏状......
  • 客户端相关知识学习(十)之app给h5传递数据
      方法一:app可以把参数传到h5的链接里,用类似?xx=xx&xx=xx的形式拼接,js解析参数即可。方法二:情况一:app调用h5原生app都可以对js的function进行触发,前端要做的只是将js定义好方法名和参数,交给app人员即可,app将数据通过参数传入情况二:h5调用app当H5页面加载时,就可以通过j......
  • 客户端相关知识学习(九)之h5给app传递数据
      方法一:情况一:if (window.JdAndroid){     window.JdAndroid.setPayCompleted();     window.JdAndroid.setPageIndex("cashierDesk_finish");}调用方式:h5调用Android方法传递数据:通过参数传递给Android情况二:var viewA......
  • 客户端相关知识学习(十二)之在h5页面打开另一个页面
      以京东收银台为例,收银台首页和成功页使用的是一个webview,在成功页点击一个按钮可能会跳转,可能是http(h5页面)也可能是openapp(原生页面/h5页面)Androidhttp:不会打开新的webview,就在收银台的webview中打开openapp:打开新的webviewiOShttp:不会打开新的webview,就在收银台的we......
  • 客户端相关知识学习(十一)之Android H5交互Webview实现localStorage数据存储
      前言最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识webView开启支持H5 LocalStorage存储有些时候我们发现写的本地存储没有起作用,那是因为默认WebView没有开启LocalStorage存储。开启方法如下首先得有Webview控件:有人问我是不是需要写布局文件......
  • 如何根据ua判断ios、android、ipad?如何判断app版本
    如何根据ua判断ios、android、ipad?如何判断app版本 根据ua判断iOSvar ua = navigator.userAgent;if(ua.match(/(iPhone\sOS)\s([\d_]+)/)){//isios}根据ua判断ipadvar ua = navigator.userAgent;if(ua.match(/(iPad).*OS\s([\d_]+)/)){//is......
  • Android Compose 的导航(Navigation)
    基础知识基本内容看官方吧:Android使用Compose进行导航B回调数据给A内容当您从A导航到B并且希望B将信息传回A时,您可以传递回调(此处onSelect):有两者方法:自定义回调函数and使用相同ViewModel,需要根据具体的应用场景和需求来选择适合的方法。如果仅需要简单......