一、 WebView的基本介紹
WebView是Android開發中的一個非常重要的控制項,它可以讓我們在應用程序中載入並顯示網頁、圖片等替代在瀏覽器中訪問。不僅如此,WebView也可以實現JavaScript與Java之間的相互調用、頁面內容的持久化、緩存和離線存儲等。
1、通過XML定義WebView
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
2、通過代碼定義WebView
WebView webView = new WebView(this);
setContentView(webView);
webView.loadUrl("http://www.example.com");
二、 WebView的設置與用法
1、設置WebViewClient和WebChromeClient
使用setWebViewClient()設置WebViewClient可以讓WebView在當前應用程序中載入網頁,而不是跳轉到系統瀏覽器中。
使用setWebChromeClient()設置WebChromeClient可以接收WebView的一些通知信息,如網頁標題改變、載入進度等。
webView.setWebViewClient(new WebViewClient() {
// 當頁面載入完畢後回調
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
});
2、WebView的基本設置
WebView提供了很多基本設置,包括載入緩存、JavaScript支持、縮放控制等。
// 啟用JavaScript支持
webView.getSettings().setJavaScriptEnabled(true);
// 設置允許訪問文件
webView.getSettings().setAllowFileAccess(true);
// 不縮放
webView.getSettings().setBuiltInZoomControls(false);
// 開啟DOM storage
webView.getSettings().setDomStorageEnabled(true);
// 緩存模式:不使用緩存
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
// 支持縮放
webView.getSettings().setSupportZoom(true);
webView.getSettings().setUseWideViewPort(true);
3、WebView的前進與後退
我們可以通過調用goBack()和goForward()方法讓WebView前進或後退頁面。
// 前進
if (webView.canGoForward()) {
webView.goForward();
}
// 後退
if (webView.canGoBack()) {
webView.goBack();
}
4、JavaScript與Java的交互
如果需要在WebView中執行一些JavaScript腳本並獲取它們的返回結果,我們可以通過調用evaluateJavascript()方法實現。
而在WebView中調用Java方法,則需要通過JSBridge注入JavaScript代碼實現。
(1)evaluateJavascript()方法
evaluateJavascript()方法有兩個參數:要執行的JavaScript代碼和返回結果的回調函數。下面是一個簡單的例子,它使用evaluateJavascript()方法獲取網頁中的標題信息。
// 載入完成監聽器
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
// 獲取標題
webView.evaluateJavascript("javascript:document.title", new ValueCallback() {
@Override
public void onReceiveValue(String value) {
Log.d(TAG, "onReceiveValue: " + value);
}
});
}
});
(2)JSBridge實現JavaScript與Java的互調
JSBridge是一種基於WebView的JavaScript與Java相互調用橋樑,它可以在WebView中inject一個JavaScript對象,在JavaScript中調用Java類的方法、獲取Java對象的屬性等。
下面是一個簡單的例子,它演示了如何在JavaScript中調用Android中的一個方法,方法接收一個字元串參數並返回一個字元串結果。
// 添加JSBridge
WebView.addJavascriptInterface(new Object() {
@JavascriptInterface
public String callAndroid(String arg) {
// 調用方法並返回結果
return "Hello, " + arg;
}
}, "jsBridge");
// 在JavaScript中調用Android方法
webView.loadUrl("javascript:alert(jsBridge.callAndroid('World!'));");
三、 WebView的優化
1、減少不必要的載入
WebView默認會載入所有資源,包括圖片、樣式、腳本等,這樣會導致載入速度變慢、消耗流量增加。因此,我們應該盡量減少不必要的載入。
可以通過以下兩種方式實現:
(1)使用WebViewClient中的shouldInterceptRequest()方法截取資源請求,返回null則表示不載入該資源;
(2)使用WebSettings中的setBlockNetworkImage()方法禁止載入圖片。
2、啟用緩存
可以通過WebSettings中的setAppCacheEnabled()、setCacheMode()等方法來啟用WebView緩存。例如,以下代碼啟用了應用緩存、開啟DOM storage和啟用LocalStorage:
// 啟用應用緩存
webView.getSettings().setAppCacheEnabled(true);
// 設置緩存模式
webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
// 啟用DOM storage
webView.getSettings().setDomStorageEnabled(true);
// 啟用LocalStorage
webView.getSettings().setDatabaseEnabled(true);
webView.getSettings().setDatabasePath(getApplicationContext().getCacheDir().getAbsolutePath() + "/database/");
3、WebView的復用
WebView的創建和銷毀是很耗費資源的操作,因此我們應該盡量避免創建和銷毀WebView。可以通過在Activity中創建一個單例的WebView對象,然後在需要使用WebView的地方調用該對象即可。
以下是一個簡單的例子,它在Activity中創建了一個單例的WebView對象,並提供了一個start方法用於載入指定的URL。
public class WebViewManager {
private static volatile WebViewManager instance;
private WebView webView;
private WebViewManager(Context context) {
webView = new WebView(context);
webView.setWebViewClient(new WebViewClient() {
// ...
});
}
public static WebViewManager getInstance(Context context) {
if (instance == null) {
synchronized (WebViewManager.class) {
if (instance == null) {
instance = new WebViewManager(context);
}
}
}
return instance;
}
public void start(String url) {
webView.loadUrl(url);
// ...
}
// ...
}
4、避免內存泄漏
由於WebView的使用場景很多,無論在哪個地方使用WebView,都有可能引發內存泄漏問題。
下面是一些WebView內存泄漏的常見情況:
(1)在Activity銷毀時未銷毀WebView;
(2)沒有調用WebView.destroy()方法來釋放WebView的資源;
(3)綁定了Activity的上下文,導致WebView在Activity銷毀後仍保持了對該Activity的引用。
原創文章,作者:KHMSJ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333900.html