当前位置: 首页 > article >正文

android webview常见内容

WebView 是 Android 系统中用于展示网页内容的一个组件。

Android 4.4 之前, 使用 WebKit 渲染引擎,之后使用了 Chromium 的内核

url 加载流程

首先,通过loadUrl()方法或者loadData()等方法来触发加载。当调用这些方法后,WebView 会向服务器发送请求(如果是网络资源),服务器返回网页数据,包括 HTML 文档等或本地 js包数据。然后 WebView 对这些数据进行解析,依次处理 HTML 标签构建 DOM 树,加载和解析 CSS 样式,执行 JavaScript 代码,最终将网页内容渲染显示出来。

安全设置

JavaScript 注入攻击

  • 可以对网页的请求进行拦截,通过shouldOverrideUrlLoading方法检查 URL 是否安全,避免恶意跳转。如果 URL 不符合要求,可以返回true来阻止 WebView 进行默认的加载行为。
  • 通过WebSettingssetJavaScriptEnabled()谨慎开启 JavaScript 功能,只在必要的场景下启用

性能优化

提高加载速度

  • 预加载 WebView,让 WebView 提前初始化并加载部分内容。
  • 启用缓存,通过WebSettingssetCacheMode()设置合适的缓存模式,例如LOAD_CACHE_ELSE_NETWORK
  • 对 HTML、CSS 和 JavaScript 进行优化,比如压缩资源文件、减少重定向等。

内存泄漏

  • 同时,对于长时间运行的 WebView,要合理管理其生命周期,避免不必要的资源占用。
  • 当 Activity 销毁时,如果 WebView 没有被正确处理,它可能仍然占用内存。为避免内存泄漏,在 Activity 的onDestroy方法中,先移除 JavaScript 接口,再调用destroy()方法来销毁 WebView。

与 JavaScript 交互相关

如何在 Android 的 WebView 中实现与 JavaScript 的交互?

答案首先在WebViewWebSettings中通过setJavaScriptEnabled(true)开启 JavaScript 支持。然后可以通过addJavascriptInterface()方法将一个 Java 对象暴露给 JavaScript,使得 JavaScript 可以调用 Java 方法。同时,也可以从 Java 代码中通过loadUrl()(执行 JavaScript 语句)或者evaluateJavascript(在 Android 4.4+,返回结果更方便)方法来调用 JavaScript 函数。

在 WebView 与 JavaScript 交互过程中,有哪些注意事项?

答案:一是要注意安全问题,因为将 Java 对象暴露给 JavaScript 可能会导致安全漏洞,如前面提到的 JavaScript 注入攻击,所以暴露的方法要谨慎设计,避免包含敏感信息或危险操作。二是要注意线程问题,因为 JavaScript 在 WebView 的 UI 线程中执行,所以在 Java 方法与 JavaScript 交互时,要确保不会阻塞 UI 线程,否则会导致应用卡顿。

常用API

启用 JavaScript:

WebView webView = findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);

通过设置viewport来调整网页的缩放和布局

WebView webView = findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
String metaViewport = "<meta name=\"viewport\" content=\"width=device - width, initial - scale=1.0\">";
webView.loadDataWithBaseURL(null, metaViewport + "你的网页内容", "text/html", "UTF - 8", null);

 设置文本缩放比例

webSettings.setTextZoom(100); 

http://www.kler.cn/a/399163.html

相关文章:

  • 【Android】EventBus事件总线用法浅析
  • Javascript——设计模式(一)
  • 平台整合是网络安全成功的关键
  • 三十九、Python(pytest框架-中)
  • ES6标准-Promise对象
  • 孙赢利_11月17日_超分周报
  • Unity安装后点击登录没反应
  • 抽象java入门1.5.3.1——类的进阶
  • 生信技能62 - 常用机器学习算法的R语言实现
  • 【HAProxy10】企业级反向代理HAProxy高级功能之四层负载与Https 实现
  • Unity3D 完整直升机控制器(虚拟仿真级别)
  • 日常ctf
  • Python自动检测requests所获得html文档的编码
  • 代码学习——进制转换
  • Vue中template模板报错
  • 51单片机应用开发---LCD1602显示应用
  • Qt对话框与界面设计——常见的对话框
  • 设计模式的基本概述
  • 04 - Clickhouse-21.7.3.14-2单机版安装
  • zabbix监控端界面时间与服务器时间不对应
  • redis集群:redis集群中的某个节点怎么单独重启(非docker安装)
  • C语言导航 4.1语法基础
  • LeetCode --- 143周赛
  • STM32 HAL 矩阵按键(轮询方式)
  • Android 项目依赖库无法找到的解决方案
  • 活着就好20241118