【Android】webview常用方法和使用

news2025/5/13 19:30:31

文章目录

  • 前言
  • 一、常见用法
  • 二、基础属性
    • webView的常用方法
    • WebViewClient的常用方法
    • WebChromeClient的常用方法
    • WebSettings的相关方法
  • 三、加载流程和事件回调
  • 四、webview和JS之间的互相调用
    • 总结
  • 五、参考链接


前言

最近项目又用到了webview,在回顾复习一次webview相关的知识,顺手整理下。

webview是一个基于webkit引擎、展现web页面的控件(4.4以下使用webkit引擎,4.4以后使用chrome内核),在Android开发中常用于展示网页和执行JavaScript。

一、常见用法

webview展示网页需要联网,网络权限需要配置,以下为常用的实现的案例

 		mWebview = findViewById(R.id.wb);
        // 校验网络
        if (!NetworkUtil.getInstance(this).isNetworkAvailable()) {
            return;
        }
		// 允许JS调用
        mWebview.getSettings().setJavaScriptEnabled(true);

        // 解决白边问题
        mWebview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        mWebview.loadUrl(“url”);
        mWebview.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);

            }

            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
            }
        });

注意webview内存泄露,及时释放资源

protected void onDestroy() {
        if (mWebview != null) {
            mWebview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            mWebview.clearHistory();

            ((ViewGroup) mWebview.getParent()).removeView(mWebview);
            mWebview.destroy();
            mWebview = null;
        }
        super.onDestroy();
        Log.d(TAG, "onDestroy ...");
    }

二、基础属性

以下是webview中相关设置的常用方法介绍

webView的常用方法

// 恢复pauseTimers状态
1.web_view.resumeTimers();
// 它会暂停所有webview的布局显示、解析、延时,从而降低CPU功耗
2.web_view.pauseTimers();
// 激活WebView为活跃状态,能正常执行网页的响应
3.web_view.onResume();
// 当页面被失去焦点被切换到后台不可见状态,需要执行onPause()
// 通过onPause()动作通知内核暂停所有的动作,比如DOM的解析、JavaScript执行等
4.web_view.onPause();
// webview调用destory时,webview仍绑定在Activity上
// 这是由于自定义webview构建时传入了该Activity的context对象
// 因此需要先从父容器中移除webview,然后再销毁webview
rootLayout.removeView(web_view);
5.web_view.destroy();
// 是否可以后退
6.web_view.canGoBack()
// 后退网页
7.web_view.goBack()
// 是否可以前进
8.web_view.canGoForward()
// 前进网页
9.web_view.goForward()
// 清除网页访问留下的缓存
// 由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.
10.web_view.clearCache(true);
// 清除当前webview访问的历史记录
// 只会webview访问历史记录里的所有记录除了当前访问记录
11.web_view.clearHistory();
// 这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据
12.web_view.clearFormData();

WebViewClient的常用方法

WebViewClient用于处理各种通知和请求事件的一些方法。

onPageStarted():页面开始加载时调用,这时候可以显示加载进度条,让用户耐心等待页面的加载。
onPageFinished():页面完成加载时调用,这时候可以隐藏加载进度条,提醒用户页面已经完成加载。
onLoadResource():页面每次加载资源时调用。
shouldOverrideUrlLoading()WebView加载url默认会调用系统的浏览器,通过重写该方法,实现在当前应用内完成页面加载。
onReceivedError():页面加载发生错误时调用,这时候可以跳转到自定义的错误提醒页面,总比系统默认的错误页面美观,优化用户体验。
onReceivedHttpError():页面加载请求时发生错误。
onReceivedSslError():页面加载资源时发生错误。
shouldOverrideKeyEvent():覆盖按键默认的响应事件,这时候可以根据自身的需求在点击某些按键时加入相应的逻辑。
onScaleChanged():页面的缩放比例发生变化时调用,这时候可以根据当前的缩放比例来重新调整WebView中显示的内容,如修改字体大小、图片大小等。
shouldInterceptRequest():可以根据请求携带的内容来判断是否需要拦截请求。

WebChromeClient的常用方法

此类用于处理网站图标,网站标题,网站弹窗等,以下是相关方法

onProgressChanged():页面加载进度发生变化时调用,可以通过该方法实时向用户反馈加载情况,如显示进度条等。
onReceivedIcon():接收Web页面的图标,可以通过该方法把图标设置在原生的控件上,如Toolbar等。
onReceivedTitle():接收Web页面的标题,可以通过该方法把图标设置在原生的控件上,如Toolbar等。
onJsAlert():处理JS的Alert对话框。
onJsPrompt():处理JS的Prompt对话框。
onJsConfirm():处理JS的Confirm对话框。
onPermissionRequest()Web页面请求Android权限时调用。
onPermissionRequestCanceled()Web页面请求Android权限被取消时调用。
onShowFileChooser()Web页面上传文件时调用。
getVideoLoadingProgressView():自定义媒体文件播放加载时的进度条。
getDefaultVideoPoster():设置媒体文件默认的预览图。
onShowCustomView():媒体文件进入全屏时调用。
onHideCustomView():媒体文件退出全屏时调用。

WebSettings的相关方法

WebSettings webSettings = webView.getSettings();

webSettings.setJavaScriptEnabled(true); -> 是否开启JS支持
webSettings.setPluginsEnabled(true); -> 是否开启插件支持
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); -> 是否允许JS打开新窗口

webSettings.setUseWideViewPort(true); -> 缩放至屏幕大小
webSettings.setLoadWithOverviewMode(true); -> 缩放至屏幕大小
webSettings.setSupportZoom(true); -> 是否支持缩放
webSettings.setBuiltInZoomControls(true); -> 是否支持缩放变焦,前提是支持缩放
webSettings.setDisplayZoomControls(false); -> 是否隐藏缩放控件

webSettings.setAllowFileAccess(true); -> 是否允许访问文件
webSettings.setDomStorageEnabled(true); -> 是否节点缓存
webSettings.setDatabaseEnabled(true); -> 是否数据缓存
webSettings.setAppCacheEnabled(true); -> 是否应用缓存
webSettings.setAppCachePath(uri); -> 设置缓存路径

webSettings.setMediaPlaybackRequiresUserGesture(false); -> 是否要手势触发媒体
webSettings.setStandardFontFamily("sans-serif"); -> 设置字体库格式
webSettings.setFixedFontFamily("monospace"); -> 设置字体库格式
webSettings.setSansSerifFontFamily("sans-serif"); -> 设置字体库格式
webSettings.setSerifFontFamily("sans-serif"); -> 设置字体库格式
webSettings.setCursiveFontFamily("cursive"); -> 设置字体库格式
webSettings.setFantasyFontFamily("fantasy"); -> 设置字体库格式
webSettings.setTextZoom(100); -> 设置文本缩放的百分比
webSettings.setMinimumFontSize(8); -> 设置文本字体的最小值(1~72)
webSettings.setDefaultFontSize(16); -> 设置文本字体默认的大小

webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); -> 按规则重新布局
webSettings.setLoadsImagesAutomatically(false); -> 是否自动加载图片
webSettings.setDefaultTextEncodingName("UTF-8"); -> 设置编码格式
webSettings.setNeedInitialFocus(true); -> 是否需要获取焦点
webSettings.setGeolocationEnabled(false); -> 设置开启定位功能
webSettings.setBlockNetworkLoads(false); -> 是否从网络获取资源

三、加载流程和事件回调

webview从loadUrl加载开始到onPageFinished页面加载完成,其中的加载流程和事件回调,这篇文章讲得很详细,
深入理解Android WebView的加载流程与事件回调
在这里插入图片描述

四、webview和JS之间的互相调用

对于JS调用Android方式3种:
1.通过WebView的addJavascriptInterface()进行对象映射
2.通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url
(有问题,报了"ReferenceError: android is not defined")
3.通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

对于Android调用JS方式2种:
1.通过WebView的loadUrl()
2.通过WebView的evaluateJavascript()

常用方法
Android调用JS

        mWebview.evaluateJavascript("javascript:confim()", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                Logger.d(TAG, "webView result: ..." + value);
               
            }
        });

JS调用Android

mWebview.getSettings().setJavaScriptEnabled(true);
mWebview.addJavascriptInterface(this, "android");

    @JavascriptInterface
    public void closeWebview() {
        Logger.d(TAG, "webView onBack ...");
        finish();
    }
    

总结

基本的webview一些用法和相关属性介绍大致就是上面这些,webview在应用中一般用于加载免责协议,使用说明,电子手册等一些需要经常动态的多文字或多数据需要经常更新或维护的场景。

五、参考链接

  • Android 原生WebView的使用
  • Carson带你学Android:这是一份全面&详细的WebView学习攻略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

malloc calloc和realloc区别和联系

malloc malloc是一个⼀个动态内存开辟的函数&#xff1a; 它的函数原型是void* malloc (size_t size);这个函数向内存申请⼀块连续可⽤的空间&#xff0c;并返回指向这块空间的指针。 1.如果开辟成功&#xff0c;则返回⼀个指向开辟好空间的指针。 2.如果如果开辟失败&#xf…

Android studio中关于printf和print和println的区别

print:为一般输出&#xff0c;同样不能保留精度格式转化&#xff0c;也不能换行输出&#xff0c;输出需要加上换行符printf:常用于格式转换&#xff0c;但需要注意不是换行输出&#xff0c;只用于精度转换&#xff0c;跟C语言的printf一样的&#xff0c;输出需要加上换行符prin…

计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议

文章目录 一、TCP/IP五层模型&#xff08;重要&#xff09;二、应用层常见的协议三、TCP与UDP3.1 TCP、UDP的区别&#xff08;重要&#xff09;3.2 运行于TCP、UDP上的协议3.3 TCP的三次握手、四次挥手3.3.1 TCP的三次握手3.3.2 TCP的四次挥手3.3.3 随机生成序列号的原因 四、T…

分布式——BASE理论

简单来说&#xff1a; BASE&#xff08;Basically Available、Soft state、Eventual consistency&#xff09;是基于CAP理论逐步演化而来的&#xff0c;核心思想是即便不能达到强一致性&#xff08;Strong consistency&#xff09;&#xff0c;也可以根据应用特点采用适当的方…

【RabbitMQ】07-业务幂等处理

1. 方式一 序列化设置唯一Id。 Beanpublic MessageConverter messageConverter() {Jackson2JsonMessageConverter jjmc new Jackson2JsonMessageConverter();jjmc.setCreateMessageIds(true);return jjmc;}RabbitListener(bindings QueueBinding(value Queue(name "d…

【多线程奇妙屋】你听说过设计模式吗?软件开发中可全局访问一个对象的设计模式——单例模式,工作常用, 建议收藏 ! ! !

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

android studio 配置过程

Android studio版本&#xff1a;Android Studio Ladybug | 2024.2.1 windows 10 x64 关键问题解决方法&#xff1a; 1.设置代理&#xff1a; 退出首次配置&#xff0c;进入ide&#xff08;必要时新建工程&#xff09;然后&#xff1a; 然后重启ide 等待下载完成。 代理地…

java ssm 个人学习管理系统 学习安排 学生在线学习管理 源码 jsp

一、项目简介 本项目是一套基于SSM的个人学习管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&#x…

【harbor】离线安装2.9.0-arm64架构服务制作和升级部署

harbor官网地址&#xff1a;Harbor 参考文档可以看这里&#xff1a;部署 harbor 2.10.1 arm64 - 简书。 前提环境准备&#xff1a; 安装docker 和 docker-compose 先拉arm64架构的harbor相关镜像 docker pull --platformlinux/arm64 ghcr.io/octohelm/harbor/harbor-regist…

ssm+vue708基于BS的库存管理软件设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

速通LoRA:《LoRA: Low-Rank Adaptation of Large Language Models》全文解读

文章目录 总览AbstractIntroductionProblem StatementAren’t Existing Solutions Good Enough?Our MethodLow-Rank-Parametrized Update MatricesApplying LoRA to Transformer 何为高斯随机初始化Empirical ExperimentsBaselinesRoBERTa base/largeDeBERTa XXLGPT-2 medium/…

智慧园区解决方案:科技赋能,打造未来管理新典范

智慧园区作为城市发展的重要组成部分&#xff0c;正以前所未有的速度蓬勃发展。随着5G、云计算、大数据、物联网&#xff08;IoT&#xff09;、BIM&#xff08;建筑信息模型&#xff09;、人工智能&#xff08;AI&#xff09;及区块链等前沿技术的日益成熟与融合应用&#xff0…

如何优化Elasticsearch的查询性能?

优化Elasticsearch查询性能可以从以下几个方面进行&#xff1a; 合理设计索引和分片&#xff1a; 确保设置合理的分片和副本数&#xff0c;考虑数据量、节点数和集群大小。根据数据量和节点数量调整分片数量&#xff0c;避免使用过多分片&#xff0c;因为每个分片都需要额外的…

前端 JS面向对象 原型 prototype

目录 一、问题引出 二、prototype原型对象 三、小结 四、constructor 五、__proto__对象原型 六、原型链 一、问题引出 由于JS的构造函数存在内存浪费问题&#xff1a; function Star(name,age){this.namenamethis.ageagethis.singfunction () {console.log("唱歌&…

【MATLAB代码】二维平面上的TDOA,使用加权最小二乘法,不限制锚点数量,代码可复制粘贴

本文所述的MATLAB代码实现了一个基于两步加权最小二乘法的二维目标定位算法,利用多个锚点(基站)和时间差到达(TDOA)数据来估计未知目标的位置。 订阅专栏后可以看到完整代码,复制到MATLAB空脚本上面即可直接运行。若需要单独下载,可通过下面的链接:https://download.cs…

推荐一款完全开源的多端仓库管理系统

简介 模块 安装 UI展示 开源地址 今天给大家介绍一款完全开源的仓库管理系统&#xff0c;本系统采用Python语言开发。 简介 该库存管理系统是目前福特亚太区售后物流仓储供应链流程。离开福特后&#xff0c;开始了这个项目。为了帮助一些有需要的人。OneAPP 理念。支持扫…

第七部分:2. STM32之ADC实验--AD多通道(AD采集三路传感器模块实验:光敏传感器、热敏传感器、反射式传感器附赠温湿度传感器教程)

这个多通道采用非扫描模式--单次转换模式 1.代码配置链路图 2. ADC的输入通道 3.ADC的非扫描模式的转换模式&#xff08;单次和连续&#xff09; 4.ADC的扫描模式的转换模式&#xff08;单次和连续&#xff09; 5.采集校准 代码实验&#xff1a; 代码部分&#xff1a; #inclu…

手持测温热像仪市场规模:预计2030年全球市场规模将达到24.9亿美元

手持测温热像仪是一种能够实时监测和记录物体表面温度分布的高科技仪器。其核心功能在于&#xff0c;利用物体自身辐射出的热红外线来生成可视化的温度分布图像&#xff0c;进而为各种应用提供精准的温度数据。这一技术的普及和应用&#xff0c;无疑极大地提升了我们对于物体温…

web——[SUCTF 2019]EasySQL1——堆叠注入

这个题主要是讲述了堆叠注入的用法&#xff0c;来复现一下 什么是堆叠注入 堆叠注入&#xff1a;将多条SQL语句放在一起&#xff0c;并用分号;隔开。 1.查看数据库的名称 查看数据库名称 1;show databases; 发现有名称为ctftraining的数据库 2.对表进行查询 1;show tabl…

数据结构选择题及答案

一、选择题 1、下列查找方法中&#xff0c;&#xff08; &#xff09;适用于查找有序单链表。 A&#xff0e;分块查找; B&#xff0e;哈希查找; C&#xff0e;顺序查找; D&#xff0e;二分查找; 2、在有n个结点的二叉树的二叉链表表示中&#xff0c;空指针数为( )。 A&#xf…