android.webkit.WebView 基础 API 速查
最小代码
WebView webView = new WebView(this);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("https://example.com");
setContentView(webView);
四行,完成嵌入。逐行解释:
- 构造函数 —— 创建一个 WebView View 对象,和 TextView / Button 同级
- setWebViewClient —— 让 URL 在当前 WebView 里打开,否则默认跳系统浏览器
- loadUrl —— 加载远程网页(也可以 loadData 加载本地 HTML)
- setContentView —— 把它显示出来(如果用 XML 布局,就在布局里放
<WebView android:id="@+id/webview" />)
WebSettings:最常改的几项
WebSettings s = webView.getSettings();
s.setJavaScriptEnabled(true); // 默认关闭!记得开
s.setDomStorageEnabled(true); // LocalStorage / SessionStorage
s.setLoadWithOverviewMode(true); // 按 WebView 宽度缩放
s.setUseWideViewPort(true); // 尊重 HTML viewport meta
s.setMediaPlaybackRequiresUserGesture(false); // 自动播放视频
s.setAllowFileAccess(false); // 安全:禁止 file:// 访问
s.setMixedContentMode(WebSettings.MIXED_CONTENT_NEVER_ALLOW); // HTTPS 不加载 HTTP
WebViewClient vs WebChromeClient
这两个经常被搞混:
| WebViewClient | WebChromeClient | |
|---|---|---|
| 职责 | URL 加载、导航拦截、资源请求 | 弹窗、JS 对话框、权限请求、媒体播放 |
| 继承 | 默认是空实现 | 默认是空实现 |
| 必须实现吗 | 要让 URL 不跳浏览器 → 必须 | 要支持 alert / camera / file upload → 必须 |
典型用法:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView v, WebResourceRequest r) {
return false; // 不拦截,在当前 WebView 打开
}
});
生命周期
别忘了处理 Activity 生命周期,否则渲染进程会出问题:
@Override
protected void onPause() {
super.onPause();
webView.onPause(); // 暂停 JS / 视频
}
@Override
protected void onResume() {
super.onResume();
webView.onResume(); // 恢复
}
@Override
protected void onDestroy() {
webView.destroy(); // 释放 WebView 进程
super.onDestroy();
}
返回键处理
@Override
public void onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
} else {
super.onBackPressed(); // 退出 Activity
}
}
→ 下一页:JS 和 App 的双向调用(addJavascriptInterface / evaluateJavascript)