一、基础使用
1. 添加依赖与权限
<uses-permission android:name="android.permission.INTERNET" />
若需加载本地 HTML 文件,还需声明文件访问权限(Android 10+ 需适配作用域存储)。
2. 布局声明
在 XML 布局中添加 WebView:
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
3. 初始化与加载网页
WebView webView = findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
// 启用基础功能
webSettings.setJavaScriptEnabled(true); // 启用JS
webSettings.setDomStorageEnabled(true); // 启用DOM存储
// 加载网页
webView.loadUrl("https://www.example.com"); // 网络URL
// 或加载本地HTML:webView.loadUrl("file:///android_asset/page.html");
4. 处理页面导航
设置 WebViewClient确保链接在 WebView 内打开:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url); // 内部处理链接
return true;
}
});
二、高级功能实现
1. JavaScript 与 Java 交互
Java 调用 JS 方法:
// 执行JS函数(Android 4.4+推荐)
webView.evaluateJavascript("javascript:showToast('Hello')", null);
// 兼容低版本
webView.loadUrl("javascript:showToast('Hello')");
JS 调用 Java 方法:
public class JsInterface {
@JavascriptInterface
public void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}
// 绑定接口(注意安全风险!)
webView.addJavascriptInterface(new JsInterface(), "AndroidBridge");
2. 页面加载监控
// 进度监控
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int progress) {
if (progress == 100) {
// 隐藏进度条
}
}
});
// 错误处理
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
webView.loadUrl("file:///android_asset/error.html"); // 加载错误页
}
});
3. 缓存管理
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); // 优先缓存
webSettings.setAppCacheEnabled(true); // 启用应用缓存
// 清除缓存(可选)
webView.clearCache(true);
三、安全与优化
1. 安全策略
-
禁用危险接口:避免在
addJavascriptInterface中暴露敏感方法。 -
过滤恶意链接:在
shouldOverrideUrlLoading中校验 URL:if (url.contains("malicious.site")) { return false; // 阻止加载 } -
启用 HTTPS:强制使用安全连接。
2. 性能优化
webSettings.setMediaPlaybackRequiresUserGesture(false); // 自动播放媒体
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING); // 自适应布局
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); // 启用硬件加速
3. 内存管理
在 Activity销毁时释放资源:
@Override
protected void onDestroy() {
webView.stopLoading();
webView.destroy();
super.onDestroy();
}
四、常见问题处理
1. 页面导航控制
// 返回键后退
@Override
public void onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
} else {
super.onBackPressed();
}
}
// 前进/刷新
webView.goForward();
webView.reload();
2. 混合内容加载(HTTP/HTTPS)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // 允许混合内容
}
3. 文件上传支持
重写 WebChromeClient处理文件选择:
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onShowFileChooser(WebView view, ValueCallback<Uri[]> filePathCallback, FileChooserParams params) {
// 启动文件选择Intent
return true;
}
});
五、完整示例代码
public class WebActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
webView = findViewById(R.id.webView);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
webView.setWebViewClient(new CustomWebViewClient());
webView.setWebChromeClient(new CustomWebChromeClient());
webView.loadUrl("https://www.example.com");
}
private static class CustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
private static class CustomWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int progress) {
// 更新进度条
}
}
@Override
public void onBackPressed() {
if (webView.canGoBack()) webView.goBack();
else super.onBackPressed();
}
@Override
protected void onDestroy() {
webView.destroy();
super.onDestroy();
}
}
六、最佳实践总结
|
场景 |
推荐方案 |
关键代码 |
|---|---|---|
|
基础网页加载 |
启用JS + 内部链接处理 |
|
|
JS与Java交互 |
|
|
|
离线缓存 |
启用缓存 + 缓存策略 |
|
|
安全防护 |
URL过滤 + HTTPS强制 |
|
避坑指南:
安全风险:避免通过
addJavascriptInterface暴露敏感方法,仅加载可信来源网页。内存泄漏:在
onDestroy()中调用webView.destroy()释放资源。兼容性:低版本 Android 使用
androidx.webkit库提供统一 API
1万+

被折叠的 条评论
为什么被折叠?



