WebView应用详解

Android WebView与JSBridge实战详解:从基础配置到高级应用 本文介绍了Android混合开发中WebView与JSBridge的核心应用。首先讲解了WebView基础配置,包括启用JavaScript、DOM存储等设置,以及本地assets目录调试方法。重点分析了JSBridge双向通信实现:原生调用JavaScript通过evaluateJavascript方法获取返回值;JavaScript调用原生则需使用@JavascriptInterface注解。最后针对Vue3项目,提供了打包配置方案以确保资源路径正确。这些技术要点为混合应用开发提供了实用解决方案。 阅读详情

 

前面几篇文章已经介绍过WebView的相关内容了,但是都是专题形式,这次算是一个综合的补充吧!

  • Android与前端交互之JSBridge

https://blog.youkuaiyun.com/yoonerloop/article/details/78033908

  • Android中网页数据的抓取和修改

https://blog.youkuaiyun.com/yoonerloop/article/details/59158191

本文将介绍WebView相关属性、浏览器监听、加载过程监听、JS和WebView原生通信这几个方面!

一、WebView基本信息配置

WebSettings webSettings = getSettings();

//支持js
webSettings.setJavaScriptEnabled(true);
//支持插件
webSettings.setPluginsEnabled(true);
//提高渲染的优先级
webSettings.setRenderPriority(RenderPriority.HIGH);
//否通过手势触发播放媒体,默认是true,需要手势触发,默认true
webSettings.setMediaPlaybackRequiresUserGesture(true);
//将图片调整到适合webview的大小
webSettings.setUseWideViewPort(true);
// 缩放至屏幕的大小
webSettings.setLoadWithOverviewMode(true);
//支持缩放,默认为true。是下面那个的前提。
webSettings.setSupportZoom(true);
//设置内置的缩放控件。
webSettings.setBuiltInZoomControls(true);
//隐藏原生的缩放控件
webSettings.setDisplayZoomControls(false);
//支持内容重新布局
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
//打开H5缓存,默认关闭
webSettings.setAppCacheEnabled(true);
//设置缓存模式
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
//支持自动加载图片
webSettings.setLoadsImagesAutomatically(true);
//设置可以访问文件
webSettings.setAllowFileAccess(true);
//当webview调用requestFocus时为webview设置节点
webSettings.setNeedInitialFocus(true);
//支持通过JS打开新窗口
webSettings.setJavaScriptCanOpenWindowsAutomatically(false);
//设置WebView是否保存表单数据,默认true,保存数据。
webSettings.setSaveFormData(false);
//否支持多屏窗口,默认支持
webSettings.setSupportMultipleWindows(true);
//设置代理字符串,如果为空则使用系统提供的
webSettings.setUserAgentString("");
// 开启 DOM storage API 功能
webSettings.webSettings.setDomStorageEnabled(true);
//开启 database storage API 功能
webSettings.webSettings.setDatabaseEnabled(true);
//开启 Application Caches 功能
webSettings.webSettings.setAppCacheEnabled(true);

//设置下载
webview.setDownloadListener(new WebDownLoadListener());
//监听WebView弹窗
webview.setWebChromeClient(new WebChromeClient());
//监听WebView加载
mWebView.setWebViewClient(new BasicWebViewClient());

二、WebView加载方式

在WebView有三种常用的加载方式:分别是loadUrl,LoadData,LoadDataWithBase

1、loadUrl直接加载一个URL就可以实现网页的加载。

2、wvWebView.loadData(String data,String minmeTye,String encoding);

  • 参数一:要加载的网页字符串数据,
  • 参数二:加载minmeTye数据,一般为图片,
  • 参数三:编码格式。

此方法会自动把特殊字符转换,需要设置过滤,因此在加载css等含有特殊字符的文件应该谨慎。

3、wvWebView.loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl);

  • 参数一:要加载的网页数据的路径,即包含各类资源的总路径,
  • 参数二:需要加载的网页内容的字符串数据,
  • 参数三:加载minmeTye数据,一般为图片,
  • 参数四:编码格式,
  • 参数五:返回的URL,一般为null。

一般会使用方式一来加载图片,但是有时候加载的URL会关联多个文件,例如:一个HTML中含有的多个js,css,图片等资源,若是使用的一种加载方式会显示不全,无法显示图片等等,这时候需要用到第三种方式加载,他比第二种方式更加强大。

三、setWebChromeClient

在基本信息配置里面有个setWebChromeClient,该信息配置的作用是捕获View的事件。如果只是简单的加载网页,这个过程可能用不着。如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。下面介绍各个方法的作用。

1、void  onProgressChanged(WebView view, int newProgress)

设置加载进度,0——100之间,0表示开始加载,100表示加载完成,可以在这个过程中设置进度操作或者处理自定义进度条。

2、public void onReceivedTitle(WebView view, String title)

获取网页标题

3、public boolean onConsoleMessage(ConsoleMessage consoleMessage)

拦截控制台信息,当html中调用console相关输出的时候会回调onConsoleMessage显示打印信息。

4、public boolean onJsAlert(WebView view, String url, String message, JsResult result)

当网页调用alert()来弹出alert弹出框前回调,用以拦截alert()函数。

5、public boolean onJsConfirm(WebView view, String url, String message, JsResult result)

当网页调用confirm()来弹出confirm弹出框前回调,用以拦截confirm()函数。

6、public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)

当网页调用prompt()来弹出prompt弹出框前回调,用以拦截prompt()函数。

7、public Bitmap getDefaultVideoPoster()

视频(全屏)播放时候,当视频不能播放时候显示指定的Bitmap图片。

8、 public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams)

当用户按下“选择文件”按钮来处理带有“file”输入类型的HTML表单时候回调,这时候需要调用startActivityForResult打开手机图库页面。

9、public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback)

请求位置信息和权限。

10、public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback)

视频全屏时候调用。

11、 public void onHideCustomView()

退出视频全屏时候调用。

其他不常用的就不再介绍了。这些里面最常用的使用onProgressChanged设置进度,使用onJsAlert、onJsConfirm打印交互日志等。

四、setWebViewClient

setWebViewClient相比setWebChromeClient更加常用,更实用,他能够监听H5加载的整个过程。

1、 public void onPageStarted(WebView view, String url, Bitmap favicon)

开始加载的时候调用,可用于加载中的loading的显示,启动超时时间计算等等。

2、public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

重定向时候调用,可以拦截一些网页做定向跳转,可以根据定义好的连接协议解析连接做出相应的行为,呼起第三方APP以及登陆验证等等。

3、public void onPageFinished(WebView view, String url)

加载完成时候回调,可用于加载过程中loading的隐藏,配合onPageStarted计算加载超时时间,URL过滤,获取WebView信息,设置数据等等。

4、 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
       public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)

加载出现错误时候回调,API 23以上上面onReceivedError回调方法失效,无法触发,错误页面直接白屏显示,得在第二个方法中拦截。

5、public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)

加载SSL错误时候回调。

其他的都不太常用,上面的setWebViewClient几个方法都是比较常用的。

五、JS调用Android方法

setWebChromeClient和setWebViewClient比较重要,因此上面做了详细的介绍,便于理解整个加载的过程。通常再加载H5中我们还需要和前端保持通信,Android调用JS返回的数据,和JS调用Android本地数据,这两个相互调用的过程之前有篇文章专门通过JSBradge框架进行使用介绍,这次介绍通过Android原生方法进行通信,先来介绍Android调用JS返回的数据。

1、根据和前端约定好的字段进行使用addJavascriptInterface方法进行注册

addJavascriptInterface(new AppJavascript(), "AppJavascript");

"AppJavascript"就是和前端约定的规则字段。

2、创建AppJavascript对象,并给方法添加注解

    public class JavascriptBridge {

        /**
         * JS调用addJsData方法并且传递json数据。
         */
        @JavascriptInterface
        public void addJsData( String json) {

        }

        /**
         * JS调用getVersionCode方法获取APP的版本号。
         */
        @JavascriptInterface
        public String getVersionCode() {
            return Utils.getVersion();
        }
    }

只要JS注册该字段"AppJavascript"之后,就可以调用JavascriptBridge里面添加@JavascriptInterface的方法了,如上面的addJsData方法,JS调用了addJsData方法,就会把所需要的信息该传递过来,这样客户端就能够收到数据,从而进行相应的处理。在这里一般客户端和前端约定一个数据规则例如根据类型执行动作打开native页面,开关设置页面,展示native弹窗分享等,根据数据获取id,name,callback等等。这样就完成了JS调用native端的通信。

五、Android调用JS方法

再有些情况下Android需要调用JS方法将数据结果反馈回去,例如登陆成功失败,H分享的平台等,这时候需要JS提供方法,客户端进行调用,将数据反馈回去。可以使用:webView.loadUrl("javascript:"+xxx()),例如:

    //无参数
    webView.loadUrl("javascript:method()");
    //一个参数
    webView.loadUrl("javascript:" + method + "('" + code + "')");
    //两个参数
    mWebView.loadUrl("javascript:" + method + "('" + platfrom + "','" + code + "')";

括号里面表示的就是参数,需要注意的是参数的形式,参数是要用英文单引号括起来的,否则会报错参数未定义,导致交互失败。


 

 

5分钟搞定Nano-Banana图片编辑API对接:从Base64编码到生成图片全流程 本文详细介绍了如何快速对接Nano-Banana图片编辑API,基于gemini-2.5-flash-image-preview模型,从环境准备、Base64编码到API调用的全流程。通过实战示例和优化技巧,帮助开发者高效集成AI图片处理能力,提升产品竞争力。 阅读详情

相关推荐

EDKII实战:手把手调试PciHostBridge.c,看UEFI如何分配你的PCIe设备资源(IO/Memory空间)

本文深入解析EDKII中PciHostBridge.c模块的工作原理,详细指导如何调试PCIe设备资源分配(IO/Memory空间)。通过实战案例展示UEFI环境下Root Bridge初始化、地址空间转换及协议安装等核心流程,提供常见问题排查方法与性能优化建议,帮助开发者解决PCIe设备兼容性问题。

weixin_29201933的博客 208

webview使用详解(一)

问题背景 安卓日常开发和学习过程中,经常会使用到webview来加载网页,比如前两天过来了这样一个需求:拦截某一个链接不执行此链接,执行指定跳转到其他activity页面。这就要求我们对webview加载的URL进行判断,如果是属于需要屏蔽的URL,我们就进行拦截,并且执行相应的操作。那么首先,我们来熟悉下webview的...

baorant24的博客 3655

SAP MIRO发票自动化:BAPI_INCOMINGINVOICE_CREATE实战解析

本文深入解析了如何使用SAP标准BAPI_INCOMINGINVOICE_CREATE实现MIRO发票校验流程的自动化。通过实战代码示例,详细阐述了从采购订单和收货凭证获取数据、构建BAPI核心参数、处理常见错误到高级场景优化的完整路径,旨在帮助SAP开发人员构建稳定、高效的自动化解决方案,提升财务处理效率与准确性。

weixin_29243279的博客 499

安卓WebView的使用

WebView是Android中的原生UI控件,主要用于在app应用中方便地访问远程网页或本地html资源。同时,WebView也在Android中充当Java代码和JS代码之间交互的桥梁。实际上,也可以将WebView看做一个功能最小化的浏览器。

qq_40364278的博客 1万+

小案例:利用图床自动化批量上传图片并获取图片链接

用python爬虫写了一个小脚本,用来自动上传图片到图床,然后返回链接,我们只需直接复制链接就可以。(需要安装Requests库) 因为不同图床需要提交的POST表单不一致,所以在这里我用ImgURL图床做示范,如果大家有需求,可自行修改代码。使用脚本的时候,我们只需把需要上传的图片和这个脚本放在同一个文件夹中,然后运行脚本,稍作等待,看到提示时就可以在脚本运行文件夹中发现一个名为“图片链接地址.txt”的文件,里面就是图片链接啦! 四、图片链接地址.txt(单张图片):...

采菊东篱下,Python满乾坤! 4406

从JX-2R-01热敏打印机芯到稳定打印:硬件设计与时序控制的实践指南

本文详细解析了JX-2R-01热敏打印机芯的硬件设计与驱动开发全流程。核心内容包括:实现严格的双电源上电时序控制、采用PWM恒流驱动步进电机确保走纸平稳,以及精确控制SPI数据加载与加热脉冲时序以获得清晰打印效果。文章提供了从电路设计、芯片选型到代码调试的实战指南,旨在帮助开发者构建稳定可靠的热敏打印模块。

weixin_29169899的博客 217

WebView的使用详解

WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。一般来说Webview可单独使用,可联合其子类一起使用,下面会介绍几种:1.Webview自身的常见方法;2.Webview的最常用的子类3.(WebSettings类、WebViewClient类、WebChromeClient类)Android和Js的交互3.1 Webview常用方法3.1.1 加载URL。

LJQDMY的博客 3498

0009 用VisualStudio设计Max工具

这次分享个独家专利^)^:在Visual Studio中设计3dsMax脚本工具界面。 某次做原型设计时,需求改来改去,实在懒得搞GUI;虽然也尝试在Axure RP里画原型,但还是Visual Studio更顺手,也更容易测试一些交互,就直接在VS里做了。后来突发奇想,想实验一把能否直接用到Max里去,结果没想到成功了,效果还挺好。发现了新大陆,记录一下。   开始: 在VS里新建W...

whwst的专栏 769

WebView技术详解

WebView,简而言之,就是一种能被原生应用(如App)集成的浏览器技术。通过WebView,原生应用能够直接展示网络内容,无需用户切换至外部浏览器。这种技术不仅提高了应用的便捷性,还增强了用户的网络体验。WebView本质上是一个可视化的控件,它可以作为原生应用的视觉呈现部分,在日常使用中,WebView可能被巧妙地融入原生UI元素中,以至于用户甚至察觉不到它的存在。WebView是一个内置的浏览器控件,可以在移动应用(如Android和iOS应用)或桌面应用中加载和渲染HTML网页内容。

weixin_70208651的博客 4205

学Simulink——基于Simulink的固态变压器(SST)多级协同控制​

本文介绍了基于Simulink的固态变压器(SST)多级协同控制系统设计与仿真方法。SST作为智能电网关键设备,包含AC-DC整流、DC-DC隔离和DC-AC逆变三级变换器。针对级间耦合问题,提出了能量-功率协同控制策略,通过纵向解耦和横向联动实现稳定运行。详细演示了在Simulink中搭建三级主电路、设计协同控制器(含电网定向控制、功率前馈和虚拟惯性控制)的全过程,并通过负载突变测试验证了系统动态性能(直流母线电压波动<2%)。最后给出了工程部署建议,包括数字控制延时补偿、启动序列设计和代码自动生成

xiaoheshang_123的博客 202

YoloV8改进策略:轻量级的CloFormer助力Yolov8在速度和精度上实现双双提升

CloFormer是清华大学在今年发表的轻量级主干网络,引入了AttnConv,一种attention风格的卷积算子。所提出的AttnConv使用共享权重来聚合局部信息,并配置精心设计的上下文感知权重来增强局部特征。AttnConv和普通attention的结合使用池化来减少CloFormer中的FLOPs,使模型能够感知高频和低频信息。这篇文章主要向大家讲解如何将CloFormer加入到YoloV8中。论文链接:https://arxiv.org/abs/2303.17803v5。

m0_47867638的博客 4311

WebView简易网页网络访问

示例代码块 html代码: html> head> title>JS交互title> meta http-equiv="content-type" content="text/html; charset=utf-8"/> script type="text/javascript"> function invokedByJava(param) { docume

xuwanli2012的博客 801

C# ScottPlot 5.0 WinForms 十字光标示例:轻松实现动态数值显示,你学会了吗?

ScottPlot是一个免费、开源的.NET交互式绘图库,能够轻松地实现大型数据集的交互式显示。它支持多种图表类型,如折线图、柱状图、饼图、散点图等。ScottPlot的性能非常出色,即使是处理千万级别的数据也游刃有余。

java专栏 2213

Android WebView应用详解

WebView是Android中一个非常实用的组件,它和Safai、Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面。使用WebView开发软件有一下几个优点: 1.可以打开远程URL页面,也可以加载本地HTML数据; 2.可以无缝的在java和javascript之间进行交互操作; 3.高度的定制性,可根据开发者的需要进行多样性定制。

阳光灿烂的日子的博客 717

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

转 Android WebView应用详解

蛙扑安卓: WebView是Android中一个非常实用的组件,它和Safai、Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面。使用WebView开发软件有一下几个优点: 1.可以打开远程URL页面,也可以加载本地HTML数据; 2.可以无缝的在java和javascript之间进行交互操作; 3.高度的定制性,可根据开发...

diniushu8825的博客 147

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android 中 Webview基本应用详解

WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。

yuminfeng728的博客 537

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ReactNative进阶(十):WebView 应用详解

使用WebView组件可通过url来加载显示一个网页,也可以传入一段html代码来显示。下面对其主要属性和方法进行介绍。1. 主要属性source:在WebView中载入一段静态的html代码或是一个url(还可以附带一些header选项);:设置是否自动调整内容。bool;:设置内容所占的尺寸大小。:当网页加载之前注入一段js代码。其值是字符串形式。(默认值:无):是否开启页面加载的状态,其值为true或者false。bounces(仅iOS,默认值:true):回弹特性。如果设置为false。

IT全栈 华强工作室 8416

安卓应用开发中 WebView 内存占用过大问题详解

摘要 WebView在Android应用中展示网页时存在严重内存管理问题,主要表现为内存持续增长、应用崩溃和界面卡顿。主要原因包括未正确销毁WebView导致的内存泄漏、硬件加速带来的GPU内存激增,以及缓存未及时清理等。解决方案需从多维度入手:1) 严格遵循销毁流程,包括移除父容器、清除历史记录、销毁实例等;2) 合理管理硬件加速,按需启用或禁用;3) 将WebView放入独立进程以便彻底释放内存;4) 及时清理各类缓存数据;5) 针对低版本Android进行特殊处理。此外,对频繁使用WebView的场景

深山技术宅的博客 1385

React Native进阶(六十一): WebView 替代方案 react-native-webview 应用详解

是一个的第三方库,用于在应用中嵌入Web内容。它基于原生WebView控件,提供了丰富的API和灵活的配置选项,使开发者能够轻松地在应用中展示网页、处理网页事件等。此外,还具备性能优化、安全性提升等优势,使得它在替代原生WebView方面更具竞争力。随着WebView组件从核心库中移除,成为了替代原生WebView的最佳选择。它具备丰富的API和配置选项、性能优化、安全性提升等优势,使得开发者能够更轻松地在应用中嵌入Web内容。未来,随着的不断发展,

IT全栈 华强工作室 1303

ReactNative进阶(十):WebView 应用详解_react native webview

2.2 加载 html 代码 2.3 RN -> HTML5 通信 当加载时,可实现和之间的通信。向发送数据可以通过函数实现。如下:RN html 在中定义一个按钮,并添加事件向发送数据: 当中调用了函数后,的函数将会被回调,用来处理向发送的数据,可以通过获取发送过来的数据。 2.4 HTML5(Vue) -> RN 通信 HTML5 RN 还是通过提供的 属性完成回调。 回调函数实现逻辑如下:正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我

2401_84434442的博客 1803

NW.js项目中的webview标签详解与应用指南

NW.js项目中的webview标签详解与应用指南 【免费下载链接】nw.js Call all Node.js modules directly from DOM/WebWorker and enable a new way of writing applications with all Web technologi...

gitblog_01040的博客 399

h5plus 当前webview_HTML5+ - webview应用窗口详解(一)

Webview模块管理应用窗口界面,实现多窗口的逻辑控制管理操作。通过plus.webview可获取应用界面管理对象。plus.webview.all();获取所有Webview窗口返回值:Array[ WebviewObject ] : 应用中创建的所有Webview窗口对象数组。var wvs=plus.webview.all();for(var i=0;iconsole.log("webvi...

weixin_30070339的博客 2285

Node-WebKit中的Webview标签详解与应用指南

Node-WebKit中的Webview标签详解与应用指南 【免费下载链接】nw.js 项目地址: https://gitcode.com/gh_mirrors/nwj/nw.js ...

gitblog_00824的博客 463

安卓应用开发中WebView内存泄漏详解及解决方案

摘要: Android应用开发中,WebView组件常引发内存泄漏问题,表现为内存持续增长、OOM崩溃等。主要原因包括WebView内部长期持有Activity引用、未正确销毁、缓存未清理及系统版本差异。解决方案包括:在onDestroy()中移除并销毁WebView、清除缓存与Cookie、动态创建WebView、使用独立进程隔离WebView(最彻底)等。开发者需结合项目需求选择合适方法,避免内存泄漏导致应用崩溃。

深山技术宅的博客 864
上一篇: TransactionTooLargeException异常
下一篇: 软键盘打开和关闭监听
一杯清泉
博客等级 码龄11年 314粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值