应用内浏览器可为用户提供完整的网络体验,而无需让用户离开 您的应用。Android 提供了两个主要 API 来实现应用内浏览器: 自定义标签页和 WebView。当您有指向网页的链接或广告时,请使用应用内浏览器。您可以直接在应用内打开该网页,如图 1 所示。
在自定义标签页和 WebView 之间进行选择是一项重大的架构决策,会影响您的开发速度、用户体验以及您对界面的控制程度。
快速对比
使用下表可帮助您确定哪种工具适合您的需求:
| 功能 | WebView | 自定义标签页 |
|---|---|---|
| 主要用途 | 构建以网络为主要内容或支持内容的混合应用,展示广告、应用内宣传活动或服务条款页面。 | 显示来自外部网站的内容(例如新闻报道或产品页面)。 |
| 界面控件 | 完全控制。这是一个 View 组件,您可以将其放置在任何位置。您可以控制所有周围的界面。 |
有限控制。您可以为工具栏设置主题颜色,并添加一些自定义操作。 |
| 数据和会话 | 沙盒化。它不会与用户的主浏览器共享 Cookie 或登录信息。 | 共享。它使用用户的默认浏览器会话,包括 Cookie 和已保存的密码。 |
| 原生 <-> 网络桥 | 是。您可以使用 JavaScript 桥在网络内容和原生应用代码之间进行深入的双向通信。 | 有限。您可以使用 window.postMessage() 方法进行基本的字符串传递。 |
| 开发者工作量 | 高。您需要自行管理生命周期、导航和性能。 | 低。您只需编写几行代码即可实现。 |
WebView
WebView 是一种视图,可让网页成为应用布局的组成部分。 它功能强大,但与自定义标签页相比,处理起来稍微复杂一些。
WebView 可以加载远程或本地网络内容、执行 JavaScript,并支持在网络内容和原生应用代码之间进行双向通信。如需详细了解其功能,请参阅 WebView 的功能。
您还可以使用 WebView 来提供 Web 应用或显示在线网页作为应用的一部分。例如,您需要定期更新的最终用户协议。如需了解详情,请参阅在 WebView 中构建 Web 应用。
为何应选择 WebView
以下是一些适合使用 WebView 的场景:
- 混合应用 :您正在构建一个应用,其中网络内容和原生组件(例如导航栏或浮动操作按钮)并存。
- 第一方内容 :您的网络内容是应用体验的核心互动部分,例如文档编辑器或设计画布。
- 完全界面控件 :您需要修改网页本身的内容,或在其上叠加原生界面元素。
- 深入分析 :您需要详细了解用户在 WebView 中的互动和活动。
关键权衡因素
以下是使用 WebView 时需要考虑的一些关键权衡因素:
- 性能 :WebView 可能会占用大量内存。如果您不仔细管理,可能会遇到性能问题或 ANR(应用无响应错误)。
- 安全性和维护 :您负责加强安全性并管理生命周期。这包括 管理状态保留
跨进程重新创建使用
WebViewCompat.saveState()以及遵守 Android 的 1MB 已保存状态事务限制。不过,WebView 更新通过 Google Play 在全球范围内发布,因此您无需担心底层引擎过时。
自定义标签页
自定义标签页非常适合将用户引导至外部网址,因为它们提供了一个快速、安全且用户友好的浏览器窗口,该窗口会滑过您的应用。
为何应选择自定义标签页
以下是一些适合使用自定义标签页的场景:
- 外部链接 :当用户点按指向您不拥有的网站的链接时,自定义标签页会让他们留在您的应用上下文中,同时提供全功能浏览器体验。
- 易于集成 :这是最简单的方法,可让嵌入式网络体验快速运行。
- 共享状态 :由于它与用户的默认浏览器共享 Cookie,因此用户无需再次登录他们已访问过的网站。
- 第三方登录 :它们非常适合第三方登录流程(例如“使用 Google 账号登录”或“使用 Facebook 账号登录”),因为浏览器会安全地处理凭据。
虽然大多数浏览器都支持自定义标签页,但有些浏览器提供的自定义功能比其他浏览器更多。如需了解详情,请参阅浏览器支持。
在 Jetpack Compose 中使用网络内容
使用 Jetpack Compose 进行构建时,您可以同时使用自定义标签页和 WebView:
- 自定义标签页:由于自定义标签页使用
Intent,因此您可以从 Compose 函数中的任何Context启动它们,从而实现无缝集成。 - WebView:Compose 还没有原生 WebView 可组合项,因此您
需要使用
AndroidView将标准 WebView 嵌入到布局中。
其他资源
如需使用 WebView 或自定义标签页 API 为 Android 设备开发网页,请参阅以下文档: