这里的“模板”可以有两种理解:

- 一个完整的 Android 项目模板:让你能快速开始一个包含 WebView 功能的项目。
- 一个可复用的 WebView 初始化和配置代码片段:在你的现有项目中直接使用。
我会从这两种角度为你提供详细的指南和代码示例。
核心概念:Android WebView
要明确在 Android 中,我们使用的是 android.webkit.WebView 类,它基于 Google 的 Chromium 引擎,而不是苹果的 WebKit,虽然名字相似,但它们是不同项目,在 Android 10 (API 29) 及以上,WebView 甚至被独立出来,由 Google Play Store 进行更新,以确保所有设备上的浏览器体验一致。
完整的 Android 项目模板(使用 Android Studio)
Android Studio 提供了非常方便的项目模板,可以帮你快速搭建一个包含 WebView 的应用。
步骤 1:创建新项目
- 打开 Android Studio,选择 File > New > New Project...。
- 在模板选择窗口,选择 Empty Views Activity,然后点击 Next。
- 配置你的项目:
- Name: 你的应用名称,"MyWebViewApp"。
- Package name: 你的包名,
com.example.mywebviewapp。 - Save location: 项目保存路径。
- Language: 选择 Kotlin 或 Java。推荐使用 Kotlin,它是 Android 官方推荐的语言,更简洁安全。
- Minimum SDK: 选择一个最低支持的 Android 版本,API 21 (Android 5.0) 是一个比较广泛兼容的选择。
- 点击 Finish,等待 Android Studio 构建项目。
步骤 2:修改布局文件 activity_main.xml
打开 app/res/layout/activity_main.xml 文件,将默认的 TextView 替换为 WebView。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<WebView
android:id="@+id/my_webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
步骤 3:在 MainActivity 中加载网页
打开 app/src/main/java/com/example/mywebviewapp/MainActivity.kt (或 .java) 文件,编写代码来加载一个网页。
Kotlin 版本
package com.example.mywebviewapp
import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val webView: WebView = findViewById(R.id.my_webview)
// 1. 启用 JavaScript
webView.settings.javaScriptEnabled = true
// 2. 设置 WebViewClient,这样点击链接时不会跳转到外部浏览器
webView.webViewClient = WebViewClient()
// 3. 加载网页
// 可以是本地 HTML 文件 (file:///android_asset/...) 或网络 URL
webView.loadUrl("https://www.google.com")
}
}
Java 版本
package com.example.mywebviewapp;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = findViewById(R.id.my_webview);
// 1. 启用 JavaScript
webView.getSettings().setJavaScriptEnabled(true);
// 2. 设置 WebViewClient,这样点击链接时不会跳转到外部浏览器
webView.setWebViewClient(new WebViewClient());
// 3. 加载网页
webView.loadUrl("https://www.google.com");
}
}
步骤 4:添加网络权限
为了让 WebView 能够访问互联网,你必须在 AndroidManifest.xml 文件中添加 INTERNET 权限。
打开 app/src/main/AndroidManifest.xml 文件,在 <application> 标签之前添加以下行:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 添加这一行 -->
<uses-permission android:name="android.permission.INTERNET" />
<application
...>
...
</application>
</manifest>
运行你的项目,一个简单的 WebView 应用就完成了,这就是一个最基础的“模板”。

可复用的 WebView 配置代码片段(最佳实践)
在实际开发中,我们通常不会在每个 Activity/Fragment 中都写一遍 WebView 的初始化代码,更好的做法是创建一个可复用的工具类或基类。
这里我为你提供一个封装了 WebView 常用功能的 Kotlin 扩展函数,这是一种非常优雅和现代的方式。
创建 WebView 扩展函数
在你的项目中创建一个新的 Kotlin 文件,WebViewExtensions.kt。
// WebViewExtensions.kt
import android.content.Context
import android.webkit.WebChromeClient
import android.webkit.WebView
import android.webkit.WebViewClient
/**
* 一个用于快速配置和加载 URL 的 WebView 扩展函数。
*
* @param url 要加载的 URL (可以是网络地址或本地文件路径)
* @param isJavaScriptEnabled 是否启用 JavaScript,默认为 true
* @param webViewClient 自定义的 WebViewClient,默认为 null (使用默认行为)
* @param webChromeClient 自定义的 WebChromeClient,默认为 null (使用默认行为)
*/
fun WebView.setup(
url: String,
isJavaScriptEnabled: Boolean = true,
webViewClient: WebViewClient? = null,
webChromeClient: WebChromeClient? = null
) {
// 启用 JavaScript
settings.javaScriptEnabled = isJavaScriptEnabled
// 设置 WebViewClient 和 WebChromeClient
this.webViewClient = webViewClient ?: WebViewClient()
this.webChromeClient = webChromeClient ?: WebChromeClient()
// 加载 URL
loadUrl(url)
}
在 Activity/Fragment 中使用
你的 MainActivity 代码可以变得非常简洁。
// MainActivity.kt
import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val webView: WebView = findViewById(R.id.my_webview)
// 使用我们创建的扩展函数,一行代码搞定!
webView.setup(
url = "https://developer.android.com/",
isJavaScriptEnabled = true,
// 你可以在这里传入自定义的 WebViewClient 来处理特定逻辑
webViewClient = object : WebViewClient() {
// 可以在这里覆盖 shouldOverrideUrlLoading 来处理页面跳转
}
)
}
}
处理返回键(重要!)
当用户在 WebView 中点击返回时,默认行为是退出 Activity,我们期望的是,WebView 有历史记录(可以后退),则应该后退而不是退出应用。
你可以在 MainActivity 中重写 onBackPressed() 方法。
// 在 MainActivity.kt 中添加
override fun onBackPressed() {
val webView: WebView = findViewById(R.id.my_webview)
if (webView.canGoBack()) {
webView.goBack()
} else {
super.onBackPressed() // 如果不能后退,则正常退出 Activity
}
}
高级功能和最佳实践
一个“生产级”的 WebView 模板还需要考虑更多因素。
安全性
- 禁用缩放:防止页面被恶意放大导致布局错乱。
webView.settings.setSupportZoom(false) webView.settings.displayZoomControls = false
- 设置允许的域名白名单:防止应用被钓鱼网站攻击。
class SafeWebViewClient : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { // 检查 URL 是否在白名单内 return if (url != null && url.startsWith("https://trusted-domain.com")) { false // 允许加载 } else { true // 阻止加载,可以跳转到错误页或提示用户 } } } // 使用时: webView.setup(url = "...", webViewClient = SafeWebViewClient())
性能优化
- 启用硬件加速:在
AndroidManifest.xml中为 Activity 添加android:hardwareAccelerated="true"。 - 缓存策略:合理设置缓存,减少网络请求。
webView.settings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK // 优先使用缓存
- 预加载:如果可能,在后台线程预加载下一个可能访问的页面。
与 JavaScript 交互
这是 WebView 的强大功能,Android 代码可以调用网页中的 JavaScript 函数,反之亦然。
-
Android 调用 JS:
// 执行一段简单的 JS 代码 webView.evaluateJavascript("1 + 1", null) // 调用 JS 中定义的函数 webView.loadUrl("javascript:showAndroidToast('Hello from Android!')") -
JS 调用 Android:
- 在 Android 代码中添加一个
@JavascriptInterface注解的接口。class WebAppInterface(private val context: Context) { @JavascriptInterface fun showToast(toast: String) { Toast.makeText(context, toast, Toast.LENGTH_SHORT).show() } } - 将这个接口暴露给 JavaScript。
webView.addJavascriptInterface(WebAppInterface(this), "Android")
- 在 HTML/JS 中调用:
<button onclick="Android.showToast('Button clicked!')">Click Me</button>
- 在 Android 代码中添加一个
加载本地资源
如果你想加载应用内置的 HTML、CSS、JS 文件,将它们放在 app/src/main/assets/ 目录下。
// 加载 assets 目录下的 index.html
webView.loadUrl("file:///android_asset/index.html")
| 特性 | 实现方式 | 说明 |
|---|---|---|
| 基础加载 | webView.loadUrl(url) |
最核心的功能。 |
| 项目模板 | Android Studio "Empty Views Activity" | 快速启动项目的官方方式。 |
| 代码复用 | Kotlin 扩展函数 | 推荐!让代码更简洁、可读性更强。 |
| 处理返回 | onBackPressed() + canGoBack() |
提升用户体验的关键。 |
| 启用 JS | settings.javaScriptEnabled = true |
加载现代网页的必要条件。 |
| 安全 | @JavascriptInterface, 域名白名单 |
防止 XSS 等安全漏洞。 |
| 交互 | evaluateJavascript, addJavascriptInterface |
实现混合应用的核心。 |
希望这份详细的指南能帮助你构建一个强大、安全且高效的 Android WebView 应用!
