Android 提供 WebView 控件,可直接加載 HTTP/HTTPS URL、本地 HTML/JS/CSS、Data URLs,**實現 App 內嵌網頁**。
// 布局
<WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" />
// Activity
WebView webView = findViewById(R.id.webview);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true); // 必須開啟 JS 支持
settings.setDomStorageEnabled(true); // LocalStorage/SessionStorage
settings.setAllowFileAccess(true); // 文件訪問
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // HTTPS 頁面加載 HTTP 資源
webView.setWebViewClient(new WebViewClient() {
@Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
});
webView.loadUrl("https://example.com/page.jsp"); // 或 file:///android_asset/local.html
webView.evaluateJavascript("javascript:updateUI('" + msg + "')", value -> { /* callback */ });
// API 19+ 推薦,異步帶回調
// Android 暴露接口
class JsBridge {
@JavascriptInterface
public void onAction(String param) { /* 業務邏輯 */ }
}
webView.addJavascriptInterface(new JsBridge(), "AndroidBridge"); // JS 端 window.AndroidBridge.onAction(...)
⚠️ 安全警告:addJavascriptInterface 在 API 17 以下存在遠程代碼執行漏洞,**僅在可信內容/自有域名頁面使用**,生產環境建議配合 WebViewClient.onReceivedError、CSP、域名白名單防護。| 場景 | 方案 |
|---|---|
| 頻繁變動的業務頁面(活動、公告、表單) | 嵌入 H5,服務端更新無需發版 |
| 複雜圖表/編輯器/地圖 | 嵌入成熟 Web 庫,避免原生重造輪子 |
| 支付/登錄/分享等需原生能力 | JS Bridge 調用原生 SDK,完成後回調 H5 |
| 離線包/熱更新 | 資源放 assets/下載至沙箱,loadUrl("file:///data/data/.../index.html") |
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null)(API 11+)。settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK)。WebChromeClient.onProgressChanged、WebViewClient.onReceivedError 友好提示。onDestroy() 中 webView.destroy()、移除回調、清理緩存。WebView 是 Android 混合開發基石,**「業務變動快 → H5、體驗關鍵 → 原生、能力互補 → JS Bridge」** 是成熟架構選型邏輯。