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

AndroidWebView与Native交互

篇首语:本文由编程笔记#小编为大家整理,主要介绍了AndroidWebView与Native交互相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Android WebView 与 Native 交互相关的知识,希望对你有一定的参考价值。



android WebView 与 Native 交互

Android 开发过程中,难免会用到 WebView 展示一些 H5 页面,这样就免不了需要和 Native 进行一些信息的交互。比如获取当前登陆状态、保存一些值、调起相应页面或者功能等。

这里将 H5Android 交互这块封装成了一个模块,有兴趣可以看下 WNBridge,访问不了的可以下载资源

先来看一下效果图


Android 与 H5 交互

Android 调用 JS 代码还是比较方便的,直接调用 WebView 的相关方法即可


  • WebView.loadUrl()
  • WebView.evaluateJavascript()

WebView.evaluateJavascript() 是在 Android 4.4 才开始支持的,运行效率比 loadUrl() 高,同时还支持传入一个回调,方便 H5 返回相关信息。

webView.evaluateJavascript("callJsFunction()", new ValueCallback()
@Override
public void onReceiveValue(String value)


);

H5 与 Android 交互

H5Android 交互,大致有三种方式:


  • 拦截 WebViewClient 相关方法
  • 拦截 WebChromeClient 相关方法
  • 使用 Android 原生的 addJavascriptInterface 接口

接下来我们就逐个来分析一下这些骚操作。。。


addJavascriptInterface

这种方式是谷歌推荐使用的,也是 Android 原生的方法,可参考 官方文档。不过在 Android 4.2 之前有相关的安全漏洞,具体啥操作导致的漏洞在这就不说了,网上一大堆,可以自己搜索一下。这里简单贴上使用方法

class JsObject
@JavascriptInterface
public String toString() return "injectedObject";

webview.getSettings().setJavascriptEnabled(true);
webView.addJavascriptInterface(new JsObject(), "InjectedObject");
webView.loadData("", "text/html", null);
webView.loadUrl("Javascript:alert(injectedObject.toString())");

//在 js 代码中直接调用即可
InjectedObject.toString()

拦截 WebViewClient

我们可以重写 WebViewClient 的以下相关方法进行拦截处理。可以根据定制的协议进行相应的分发调用。这里没有使用这种处理办法,而是将相关协议转换成 onJsPrompt 相关协议进行处理。


  • shouldOverrideUrlLoading()
  • shouldInterceptRequest()

具体实现如下

public static class WNBridgeWebViewClient extends WebViewClient
private WNJsInterface jsInterface;
public WNBridgeWebViewClient(WNJsInterface jsInterface)
this.jsInterface = jsInterface;

@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
String promptParams = convertUrl2PromptParams(request.getUrl().toString());
if (!TextUtils.isEmpty(promptParams))
WNBridge.handleJsBridge(jsInterface,promptParams);
return true;


return super.shouldOverrideUrlLoading(view, request);

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
String promptParams = convertUrl2PromptParams(url);
if (!TextUtils.isEmpty(promptParams))
WNBridge.handleJsBridge(jsInterface,promptParams);
return true;

return super.shouldOverrideUrlLoading(view, url);

@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
String promptParams = convertUrl2PromptParams(request.getUrl().toString());
if (!TextUtils.isEmpty(promptParams))
WNBridge.handleJsBridge(jsInterface,promptParams);
return null;


return super.shouldInterceptRequest(view, request);

@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
String promptParams = convertUrl2PromptParams(url);
if (!TextUtils.isEmpty(promptParams))
WNBridge.handleJsBridge(jsInterface,promptParams);
return null;

return super.shouldInterceptRequest(view, url);

protected String convertUrl2PromptParams(String url)
return null;

protected String generatePromptParams(String method,String jsonParams,String callbackFunction,String transferParams)
try
JSONObject jsonObject = new JSONObject();
jsonObject.put("method",method);
jsonObject.put("methodParams",jsonParams);
jsonObject.put("callbackFunction",callbackFunction);
jsonObject.put("transferParams",transferParams);
return jsonObject.toString();
catch (JSONException e)
e.printStackTrace();
return null;




拦截 WebChromeClient

我们可以重写 WebChromeClient 的以下相关方法进行拦截处理,重写那个方法都可以,原理都是相同的。然后根据定制的协议进行相应的分发调用。


  • onJsPrompt()
  • onJsAlert()
  • onJsConfirm()

具体实现如下

public static class WNBridgeWebChromeClient extends WebChromeClient
private WNJsInterface jsInterface;
public WNBridgeWebChromeClient(WNJsInterface jsInterface)
this.jsInterface = jsInterface;

@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)
WNBridge.handleJsBridge(jsInterface,message);
result.cancel();
return true;

private void onDestroy()
jsInterface.onDestroy();




推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
author-avatar
乱舞仙魔神啊_414
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有