前言
-
WebView
作為控件,除了繼承了View
的特性外,其自身功能也十分強大奋救,還提供了網(wǎng)頁加載、前進后退到千、網(wǎng)頁縮放、搜索等功能赴穗。 - 本節(jié)整理了
WebView
控件提供的常用API使用憔四,主要劃分為以下幾部分內(nèi)容。
一般眉、 常用配置
?? WebView
常用配置API主要包含對 WebSettings
了赵、 WebViewClient
、 WebChromeClient
配置操作甸赃。
1.1 獲取WebSettings對象
WebSettings
是專門 對WebView
控件配置和管理的類柿汛。通過 getSettings()
方法獲取該對象。
public WebSettings getSettings()
1.2 配置和獲取WebViewClient對象
-
WebViewClient
是輔助WebView處理各種通知,請求等事件的一個類埠对,按需求配置自定義的WebViewClient
對象络断。
public void setWebChromeClient(@Nullable WebChromeClient client)
@NonNull
public WebViewClient getWebViewClient()
1.3 配置和獲取WebChromeClient對象
-
WebChromeClient
是輔助WebView
處理Javascript
的對話框裁替、網(wǎng)站圖標、網(wǎng)站title貌笨、加載進度等的類胯究,按需求配置自定義的WebChromeClient
對象。
public void setWebChromeClient(@Nullable WebChromeClient client)
@Nullable
public WebChromeClient getWebChromeClient()
二 躁绸、資源加載
??WebView
資源加載主要提供了loadUrl()
、loadData()
臣嚣、loadDataWithBaseURL()
個方法净刮。
2.1 loadUrl()
?? 該方法用于加載指定的url,是日常開發(fā)中硅则,最常用的資源加載API淹父。
loadUrl(String url)
1.1.1 示例
- 頁面加載
webview.loadUrl("https://www.baidu.com");
- 加載asset資源文件
webview.loadUrl("file://android_assets/demo.html");
- 加載設備本地資源文件
webview.loadUrl("/storage/emulated/0/demo/demo.html");
1.1.2 其他補充
此外官方還提供了重載方法,新增additionalHttpHeaders
參數(shù)怎虫,支持在請求URL同時暑认,帶上Http請求頭。
loadUrl(String url , Map<String,String> additionalHttpHeaders)
2.2 loadData()
loadData(String data,String mimeType,String encoding)
官方解釋:
Loads the given data into this WebView using a 'data' scheme URL.
翻譯過來就是:
加載Data URL scheme
格式的數(shù)據(jù)到WebView中大审。
該方法提供了三個參數(shù):
-
data
表示要加載的內(nèi)容蘸际。 -
mimeType
表示數(shù)據(jù)類型,如:text/html
,image/jpeg
徒扶。 -
encoding
表示字符編碼格式粮彤,如:UTF-8
。
值得注意的點:
- 該方法來主要用于裝載
Data URL scheme
格式的數(shù)據(jù)(RFC2397協(xié)議
)姜骡,且不支持加載網(wǎng)絡數(shù)據(jù)导坟。 - 該方法不能加載圖片,如果需要可以改用
loadDataWithBaseURL()
圈澈。
2.3 loadDataWithBaseURL()
loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
官方解釋:
Loads the given data into this WebView, using baseUrl as the base URL for the content.
翻譯過來:
?? 將給定的數(shù)據(jù)加載到此WebView中惫周,使用baseUrl
作為內(nèi)容的基本URL。
與loadData()
方法比較康栈,該方法新增了兩個參數(shù):
-
baseUrl
表示基礎的網(wǎng)頁递递,既用于解析相對URL,又用于應用JavaScript的同源策略谅将。 -
historyUrl
表示可用歷史記錄漾狼,可以為null值。
loadDataWithBaseURL()
比loadData()
更加強大饥臂,類似它的plus版逊躁,且支持圖片加載。
三隅熙、 頁面操作
?? WebView
中關于頁面操作的API主要包含以下幾塊稽煤。
3.1 頁面前進后退操作
?? 首先核芽,頁面之所以能夠前進后退,是因為WebView中緩存了一個前進后退請求歷史記錄列表酵熙,對應的類為WebBackForwardList
轧简。
?? 而為了便于存取,該列表中存放的元素為請求歷史記錄項的快照匾二,對應的類為WebHistoryItem
哮独,其中包含歷史頁面url、原始url察藐、網(wǎng)頁標題皮璧、網(wǎng)頁圖標等信息。
?? WebBackForwardList
作為列表用于存放WebHistoryItem
對象分飞, 也相應提供了獲取當前頁面快照悴务、當前頁面快照下標、指定下標快照和列表長度方法譬猫。
??通過歷史列表的設計讯檐,頁面前進后退操作就轉(zhuǎn)化成對應快照的切換,判斷能否前進后退則轉(zhuǎn)化為是否有前進或者后臺的歷史記錄染服。效果如下圖:
3.1.1 判斷頁面能否前進
- 返回值為布爾型别洪,
true
表示存在可前進的歷史界面。
public boolean canGoForward()
3.1.2 頁面前進
public void goForward()
3.1.3 判斷頁面能否后退
- 返回值為布爾型柳刮,
true
表示存在可后退的歷史界面蕉拢。
public boolean canGoBack()
3.1.4 頁面后退
public void goBack()
3.1.5 判斷頁面能否前進或后退
- 參數(shù)
steps
表示前進或后退的步進,正數(shù)則為前進诚亚,負數(shù)為后退晕换。 - 返回值為布爾型,
true
表示存在可前進或后退的歷史界面站宗。
public boolean canGoBackOrForward(int steps)
3.1.6 頁面前進或后退
- 參數(shù)
steps
表示前進或后退的步進闸准,正數(shù)則為前進,負數(shù)為后退梢灭。
public void goBackOrForward(int steps)
3.1.7 獲取頁面前進后退列表(即歷史記錄列表)
public WebBackForwardList copyBackForwardList()
3.2 頁面縮放操作
- 在操作頁面縮放前夷家,需要設置WebView控件支持縮放。
webView.getSettings().setSupportZoom(true);
3.2.1 頁面放大
- 返回值為布爾型敏释,
true
表示界面放大成功库快。
public boolean zoomIn()
3.2.2 頁面縮小
- 返回值為布爾型,
true
表示界面縮小成功钥顽。
public boolean zoomOut()
3.2.3 頁面按指定比例縮放
- 參數(shù)
zoomFactor
表示界面需要縮放比例义屏,范圍為0.01
到100.0
。
public void zoomBy(float zoomFactor)
3.3 頁面加載操作
3.3.1 重新加載頁面
- 注意:當前頁面的所有資源都會重新加載。
public void reload()
3.3.2 停止加載頁面
public void stopLoading()
3.4 文件下載操作
Registers the interface to be used when content can not be handled by the rendering engine, and should be downloaded instead. This will replace the current handler.
-
當需要通過下載內(nèi)容實現(xiàn)操作闽铐,而非渲染引擎渲染內(nèi)容時蝶怔,官方提供了一個
DownloadListener
接口供開發(fā)者配置實現(xiàn)。
public void setDownloadListener(@Nullable DownloadListener listener)
public interface DownloadListener {
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype, long contentLength);
}
3.5 文本匹配查找操作
3.5.1 查找匹配文本并高亮顯示
Finds all instances of find on the page and highlights them, asynchronously. Notifies any registered WebView.FindListener. Successive calls to this will cancel any pending searches.
public void findAllAsync(@NonNull String find)
- 異步查找頁面上匹配數(shù)據(jù)并高亮顯示兄墅。
- 連續(xù)調(diào)用該方法踢星,將取消之前任何掛起的搜索。
3.5.2 清除查找匹配的高亮文本
public void clearMatches()
3.5.3 上下查找匹配文本
Highlights and scrolls to the next match found by findAllAsync, wrapping around page boundaries as necessary. Notifies any registered FindListener. If findAllAsync has not been called yet, or if clearMatches has been called since the last find operation, this function does nothing.
public void findNext(boolean forward)
- 該方法使用需要在調(diào)用
findAllAsync
之后隙咸。 - 調(diào)用后將高亮顯示并滾動到下一匹配項沐悦,并通知任何已注冊的
FindListener
五督。 - 在
clearMatches
之后調(diào)用,將不執(zhí)行任何操作概荷。
3.5.4 配置查找匹配監(jiān)聽器
Registers the listener to be notified as find-on-page operations progress. This will replace the current listener.
- 監(jiān)聽接口提供了頁面查找進度回調(diào),將替換原有查找匹配監(jiān)聽器碌燕。
public void setFindListener(@Nullable FindListener listener)
public interface FindListener {
public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches,
boolean isDoneCounting);
}
四误证、 生命周期
4.1 onPause()
Does a best-effort attempt to pause any processing that can be paused safely, such as animations and geolocation. Note that this call does not pause JavaScript. To pause JavaScript globally, use pauseTimers. To resume WebView, call onResume.
public void onPause()
-
頁面被失去焦點或者被切換到后臺,處于不可見狀態(tài)時修壕,則會執(zhí)行
onPause()
愈捅。 - 該方法盡可能暫停任何可以安全暫停的處理,例如動畫和地理定位慈鸠。
- 注意蓝谨,這個調(diào)用不會暫停
JavaScript
。要全局暫停JavaScript
青团,請使用pauseTimers()
譬巫。 - 調(diào)用
onResume()
, 即可恢復WebView
督笆,芦昔。
4.2 onResume()
- 從
onPause()
狀態(tài)中恢復。
public void onResume()
4.3 pauseTimers()
Pauses all layout, parsing, and JavaScript timers for all WebViews. This is a global requests, not restricted to just this WebView. This can be useful if the application has been paused.
public void pauseTimers()
-
pauseTimers()
會暫停所有WebView
的布局顯示娃肿、解析咕缎、延時,降低CPU功耗料扰。 - 當應用程序被切換到后臺時凭豪,該方法不僅僅影響當前界面的
WebView
,而是全局應用的WebView
晒杈。
4.4 resumeTimers()
Resumes all layout, parsing, and JavaScript timers for all WebViews.This will resume dispatching all timers.
public void resumeTimers()
- 從
pauseTimers()
狀態(tài)中恢復嫂伞。 - 調(diào)用該方法將恢復所有
Webview
的布局、解析和JavaScript
定時器。
4.5 destroy()
Destroys the internal state of this WebView. This method should be called
after this WebView has been removed from the view system. No other methods may be called on this WebView after destroy.
public void destroy()
- 無論是官網(wǎng)還是代碼注釋末早,對該方法的解釋均為銷毀
WebView
的內(nèi)部狀態(tài)烟馅。 - 若在關閉了
Activity
時,WebView
的音樂或視頻然磷,還在播放郑趁,則必須銷毀WebView
的內(nèi)部狀態(tài)。 - 調(diào)用
destroy()
方法前姿搜,需要先從父容器中移除WebView
寡润。
rootLayout.removeView(webView);
webView.destroy();
- 調(diào)用
destroy()
方法后梭纹,該WebView
的其他方法均不能調(diào)用致份。
五氮块、緩存清理
??WebView
關于緩存清理的API主要包括網(wǎng)頁訪問滔蝉、歷史記錄及表單數(shù)據(jù)緩存清理幾塊。
5.1 清除網(wǎng)頁訪問的緩存
- 由于內(nèi)核緩存是全局的阳谍,因此這個方法清除的是整個應用程序頁面訪問緩存矫夯。
- 參數(shù)
includeDiskFiles
表示是否包含磁盤文件的緩存茧痒,如果為false
旺订,則不包含区拳,只清除RAM緩存意乓。
public void clearCache(boolean includeDiskFiles)
5.2 清除歷史記錄
- 只清除當前
WebView
訪問的歷史記錄。
public void clearHistory()
5.3 表單數(shù)據(jù)清除
- 該方法僅清除自動完成填充的表單數(shù)據(jù)圣猎,并不會清除WebView存儲到本地的數(shù)據(jù)送悔。
public void clearFormData()
六欠啤、 獲取頁面信息
??WebView
中獲取頁面信息的API主要包含以下幾塊洁段。
6.1 獲取當前頁URL
Gets the URL for the current page. This is not always the same as the URL passed to WebViewClient.onPageStarted because although the load for that URL has begun, the current page may not have changed.
public String getUrl()
- 值得注意的祠丝,通過
WebViewClient
的onPagStarted()
獲取的URL写半,與getUrl()
獲取到的不一定相同。因為盡管該URL已經(jīng)開始加載龙考,但當前頁面可能還未改變晦款。
6.2 獲取當前頁原始URL
Gets the original URL for the current page. Also, there may have been redirects resulting in a different URL to that originally requested.
public String getOriginalUrl()
- 考慮到頁面重定向缓溅,該方法返回原始請求的URL坛怪。
6.3 獲取當前網(wǎng)頁標題
public String getTitle()
6.4 獲取當前網(wǎng)頁圖標
public Bitmap getFavicon()
6.5 獲取當前頁SSL證書
public SslCertificate getCertificate()
6.6 獲取HTML的高度
- 獲取的是HTML原始高度袜匿,不包括縮放后的高度居灯。
public int getContentHeight()
6.7 獲取HTML的寬度
- 獲取的是HTML原始寬度怪嫌,不包括縮放后的寬度岩灭。
public int getContentWidth()