热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WebView详细使用四(和H5JS交互)

一、WebView和H5交互接口(IEvent)定义H5和Android原生交互三要素:行为(方法)、参数、返回值。定义一个通用的接口,包括上面三要素。***Web交互事件处理的接
一、WebView和H5交互接口(IEvent )定义
  • H5和Android原生交互三要素:行为(方法)、参数、返回值。
  • 定义一个通用的接口,包括上面三要素。

/**
* Web交互事件处理的接口定义
*/
public interface IEvent {
/**
* H5调用原生方法
* @param params 传递的是Json数据
* @return 也是Json数据
*/
String execute(String params);
}

注意:execute方法名称是和H5约定的。

  1. params:H5调用时传递过来的数据,用Json形式,比如H5要调用原生的分享,数据如下:

{
"action": "share",// 行为:分享
// 分享要使用到的数据
"data": {
"shareTitle": "",
"shareDes": "",
"shareImageUrl": "",
"shareActionUrl": "",
"shareType": "",
....// 其它参数
}
}

  1. 返回String类型也是用Json,比如H5要获取原生的UserToken数据如下:

// params:H5调用时传递过来的数据
{
"action": "getUserToken",// 行为:获取用户的UserToken
// 无数据传递给Android
"data": {

}
}
// Android返回给H5的数据
{
"action": "getUserToken",// 行为:获取用户的UserToken
// Android给H5的数据
"data": {
"userToken":"xxxxxx"
}
}

二、WebView和H5交互方法参数和返回值的定义
  1. 数据和返回值无论是数据格式还是形式,其实都是一样。
  2. Android解析H5传递过来的参数时候,可以根据Action的值去解析Data的值。
  3. Data的值是不确定的,不确定的可以用泛型定义。

/**
* 1. H5传递过来的参数
*/
public class ParamsData {
public String action;
public T data;
}
/**
* 2. 返回给H5的参数
*/
public class ReturnParamsData {
public String action;
public T data;
public ReturnParamsData(String action) {
this.action = action;
}
}

三、WebView和H5交互接口(IEvent )实现

/**
* Web JS交互的事件处理
*/
public class JSEvent implements IEvent {
private Activity activity;
public JSEvent(Activity activity) {
this.activity = activity;
}
@Override
@JavascriptInterface
public String execute(String params) {
// TODO 待解析params数据
return null;
}
}

注意:execute方法上要加上@JavascriptInterface

四、数据解析和返回给H5的数据创建(用到JSONObject和Gson)

/**
* Web JS交互的事件处理
*/
public class JSEvent implements IEvent {
// 实际开发用得上
private Activity mActivity;
private Gson gson = new Gson();
public JSEvent(Activity activity) {
this.mActivity = activity;
}
@Override
@JavascriptInterface
public String execute(String params) {
// 1. 先判断数据是不是空
if (!TextUtils.isEmpty(params)) {
try {
JSONObject object = new JSONObject(params);
// 2. 拿到行为
String action = object.getString("action");
// 3. 创建返回的数据
ReturnParamsData rData = new ReturnParamsData(action);
// 4. 根据行为去做真正的数据解析
switch (action) {
case "share": // 分享行为
// 分享数据解析
ShareData shareData = parseJson(ShareData.class, params);
// TODO 调原生要做的事情
break;
}
// 5. 组装H5要的数据
rData.data=getReturnData(action);
// 返回给H5的数据,自己组装好
return gson.toJson(rData);
} catch (Throwable e) {
e.printStackTrace();
}
}
return null;
}
/**
* 根据动作,组装数据给H5
*/
private ReturnData getReturnData(String action) {
ReturnData rData = new ReturnData();
switch (action){
case "getUserToken":
rData.userToken="用户的UserToken";
break;
case "getUserId":
rData.userId="用户的UserId";
break;
}
return rData;
}
/**
* 解析H5传递过来的数据
*
* @param clazz T的实际类型
* @param json H5传递过来的参数
* @param 实际类型
* @return 实际类型
*/
private T parseJson(Class clazz, String json) {
Type type = new ParamsTypeImpl(ParamsData.class, new Type[]{clazz});
ParamsData data = gson.fromJson(json, type);
return data.data;
}
}
// -----------------------------------下面是用到的类,实际开发根据项目定义---------------------------------------
/**
* 分享的数据的实体Bean
*/
public class ShareData {
public String shareTitle;
public String shareDes;
public String shareImageUrl;
public String shareActionUrl;
public String shareType;
}
/**
* H5要的数据,根据实际项目,可以继续扩展
*/
public class ReturnData {
public String userToken; // 用户的Token
public String userId;// 用户ID
public String userType;// 用户类型
}
/**
* 解析JavaBean的实际类型
*/
public class ParamsTypeImpl implements ParameterizedType {
private final Class raw;
private final Type[] args;
public ParamsTypeImpl(Class raw, Type[] args) {
this.raw = raw;
this.args = args != null ? args : new Type[0];
}
@Override
public Type[] getActualTypeArguments() {
return args;
}
@Override
public Type getRawType() {
return raw;
}
@Override
public Type getOwnerType() {
return null;
}
}

四、项目里面使用

/**
* JS注入的名称,和H5约定的
*/
private static final String JS_NAME = "appXXX";
@SuppressLint("JavascriptInterface")
private void initWebView() {
// ...... 前面省去一些代码
WebSettings webSetting = webView.getSettings();
// ===设置JS可用
webSetting.setJavascriptEnabled(true);
// JS打开窗口
webSetting.setJavascriptCanOpenWindowsAutomatically(true);
// ===设置JS可用
// 注入JS交互
mWebView.addJavascriptInterface(new JSEvent(this), JS_NAME);
}

至此WebView的使用写完。


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了GregorianCalendar类的基本信息,包括它是Calendar的子类,提供了世界上大多数国家使用的标准日历系统。默认情况下,它对应格里高利日历创立时的日期,但可以通过调用setGregorianChange()方法来更改起始日期。同时,文中还提到了GregorianCalendar类为每个日历字段使用的默认值。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
author-avatar
360691894_8a5c48
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有