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

webkit 网页模板 android
(图片来源网络,侵删)
  1. 一个完整的 Android 项目模板:让你能快速开始一个包含 WebView 功能的项目。
  2. 一个可复用的 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:创建新项目

  1. 打开 Android Studio,选择 File > New > New Project...
  2. 在模板选择窗口,选择 Empty Views Activity,然后点击 Next
  3. 配置你的项目:
    • Name: 你的应用名称,"MyWebViewApp"。
    • Package name: 你的包名,com.example.mywebviewapp
    • Save location: 项目保存路径。
    • Language: 选择 KotlinJava推荐使用 Kotlin,它是 Android 官方推荐的语言,更简洁安全。
    • Minimum SDK: 选择一个最低支持的 Android 版本,API 21 (Android 5.0) 是一个比较广泛兼容的选择。
  4. 点击 Finish,等待 Android Studio 构建项目。

步骤 2:修改布局文件 activity_main.xml

打开 app/res/layout/activity_main.xml 文件,将默认的 TextView 替换为 WebView

webkit 网页模板 android
(图片来源网络,侵删)
<?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 应用就完成了,这就是一个最基础的“模板”。

webkit 网页模板 android
(图片来源网络,侵删)

可复用的 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:

    1. 在 Android 代码中添加一个 @JavascriptInterface 注解的接口。
      class WebAppInterface(private val context: Context) {
      @JavascriptInterface
      fun showToast(toast: String) {
          Toast.makeText(context, toast, Toast.LENGTH_SHORT).show()
      }
      }
    2. 将这个接口暴露给 JavaScript。
      webView.addJavascriptInterface(WebAppInterface(this), "Android")
    3. 在 HTML/JS 中调用:
      <button onclick="Android.showToast('Button clicked!')">Click Me</button>

加载本地资源

如果你想加载应用内置的 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 应用!