WebView 是 Android 系统中用于展示网页内容的一个组件。
Android 4.4 之前, 使用 WebKit 渲染引擎,之后使用了 Chromium 的内核
url 加载流程
首先,通过loadUrl()
方法或者loadData()
等方法来触发加载。当调用这些方法后,WebView 会向服务器发送请求(如果是网络资源),服务器返回网页数据,包括 HTML 文档等或本地 js包数据。然后 WebView 对这些数据进行解析,依次处理 HTML 标签构建 DOM 树,加载和解析 CSS 样式,执行 JavaScript 代码,最终将网页内容渲染显示出来。
安全设置
JavaScript 注入攻击
- 可以对网页的请求进行拦截,通过
shouldOverrideUrlLoading
方法检查 URL 是否安全,避免恶意跳转。如果 URL 不符合要求,可以返回true
来阻止 WebView 进行默认的加载行为。 - 通过
WebSettings
的setJavaScriptEnabled()
谨慎开启 JavaScript 功能,只在必要的场景下启用
性能优化
提高加载速度
- 预加载 WebView,让 WebView 提前初始化并加载部分内容。
- 启用缓存,通过
WebSettings
的setCacheMode()
设置合适的缓存模式,例如LOAD_CACHE_ELSE_NETWORK
。 - 对 HTML、CSS 和 JavaScript 进行优化,比如压缩资源文件、减少重定向等。
内存泄漏
- 同时,对于长时间运行的 WebView,要合理管理其生命周期,避免不必要的资源占用。
- 当 Activity 销毁时,如果 WebView 没有被正确处理,它可能仍然占用内存。为避免内存泄漏,在 Activity 的
onDestroy
方法中,先移除 JavaScript 接口,再调用destroy()
方法来销毁 WebView。
与 JavaScript 交互相关
如何在 Android 的 WebView 中实现与 JavaScript 的交互?
答案首先在WebView
的WebSettings
中通过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);