webview 中文文档 下载 App

android.webkit.WebView 基础 API 速查

最小代码

WebView webView = new WebView(this);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("https://example.com");
setContentView(webView);

四行,完成嵌入。逐行解释:

  1. 构造函数 —— 创建一个 WebView View 对象,和 TextView / Button 同级
  2. setWebViewClient —— 让 URL 在当前 WebView 里打开,否则默认跳系统浏览器
  3. loadUrl —— 加载远程网页(也可以 loadData 加载本地 HTML)
  4. 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

这两个经常被搞混:

WebViewClientWebChromeClient
职责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)