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);