Android 之 控件 - WebView

一、基础使用​

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 + 内部链接处理

setJavaScriptEnabled(true)WebViewClient

​JS与Java交互​

evaluateJavascript+ 安全接口绑定

evaluateJavascript()@JavascriptInterface

​离线缓存​

启用缓存 + 缓存策略

setCacheMode(LOAD_CACHE_ELSE_NETWORK)

​安全防护​

URL过滤 + HTTPS强制

shouldOverrideUrlLoading校验逻辑

​避坑指南​​:

  • ​安全风险​​:避免通过 addJavascriptInterface暴露敏感方法,仅加载可信来源网页。

  • ​内存泄漏​​:在 onDestroy()中调用 webView.destroy()释放资源。

  • ​兼容性​​:低版本 Android 使用 androidx.webkit库提供统一 API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值