众所周知、在页面使用webview后,当activity/fragment被finish后webview并不会被释放,所以需要在activity/fragment的onDestroy()/onDestroyView() 方法中手动释放:
通用方法(仅供参考):
//释放webview
public static void CleanWebview(WebView webView) {
if (webView != null) {
webView.clearHistory();
((ViewGroup) webView.getParent()).removeView(webView);
webView.loadUrl("about:blank");
webView.stopLoading();
webView.setWebChromeClient(null);
webView.setWebViewClient(null);
webView.destroy();
webView = null;
}
}
webview使用时,需要注意一些WebSettings的设置,比如是否支持js,显示图片等,这里提供部分常用熟悉:
WebSettings settings = webView.getSettings();
// 支持javascript
settings.setJavaScriptEnabled(true);
// 设置可以访问文件
settings.setAllowFileAccess(true);
// 设置可以支持缩放
settings.setSupportZoom(true);
// 设置出现缩放工具
settings.setBuiltInZoomControls(true);
// 缩放控制器按钮隐藏
settings.setDisplayZoomControls(false);
// 扩大比例的缩放
settings.setUseWideViewPort(true);
// 自适应屏幕
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING);
} else {
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
}
// settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
//显示图片
settings.setLoadsImagesAutomatically(true);
settings.setLoadWithOverviewMode(false);
//开启DOM
settings.setDomStorageEnabled(true);
//设定字体大小:
settings.setTextZoom(100);
settings.setSupportZoom(true);
//设置自适应屏幕,两者合用
settings.setUseWideViewPort(true); //将图片调整到适合webview的大小
settings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
有时候,需要在网页调起支付宝或者微信支付,咋办呢:
在webView的setWebViewClient()方法中监听shouldOverrideUrlLoading()网页的返回,然后截取,进行自己的操作:调起微信支付或者支付宝支付、
webView.setWebViewClient(new WebViewClient() {
/**
* 网页开始加载
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
/**
* 网页加载结束
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
//此方法是为了处理在5.0以上Htts的问题,必须加上
handler.proceed();
// super.onReceivedSslError(view, handler, error);
}
/**
* 所有跳转的链接都会在此方法中回调
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("weixin://wap/pay?")) {
// 如果return false 就会先提示找不到页面,然后跳转微信
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
// android 6.0 两种方式获取intent都可以跳转支付宝成功,7.1测试不成功
} else if (url.startsWith("alipays://") || url.startsWith("alipay://") ) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
} else {
//微信支付必须在打开网页前添加Referer
Map<String, String> extraHeaders = new HashMap<String, String>();
extraHeaders.put("Referer", "https://mobile.yangkeduo.com");
view.loadUrl(url, extraHeaders);
}
return true;
}
});