衆所周知、在頁面使用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;
}
});