圖解WebView -- (2) WebView 常用API詳解

前言

  • WebView作為控件,除了繼承了View的特性外,其自身功能也十分強大奋救,還提供了網(wǎng)頁加載、前進后退到千、網(wǎng)頁縮放、搜索等功能赴穗。
  • 本節(jié)整理了WebView控件提供的常用API使用憔四,主要劃分為以下幾部分內(nèi)容。
    WebView 常用API詳解.png


一般眉、 常用配置

?? WebView常用配置API主要包含對 WebSettings了赵、 WebViewClientWebChromeClient配置操作甸赃。

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中大审。

loadData.png

該方法提供了三個參數(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。

loadDataWithBaseUrl.png

loadData()方法比較康栈,該方法新增了兩個參數(shù):

  • baseUrl表示基礎的網(wǎng)頁递递,既用于解析相對URL,又用于應用JavaScript的同源策略谅将。
  • historyUrl表示可用歷史記錄漾狼,可以為null值。

loadDataWithBaseURL()loadData()更加強大饥臂,類似它的plus版逊躁,且支持圖片加載。



三隅熙、 頁面操作

?? WebView中關于頁面操作的API主要包含以下幾塊稽煤。

WebView頁面操作.png

3.1 頁面前進后退操作

歷史記錄列表.png

?? 首先核芽,頁面之所以能夠前進后退,是因為WebView中緩存了一個前進后退請求歷史記錄列表酵熙,對應的類為WebBackForwardList轧简。

?? 而為了便于存取,該列表中存放的元素為請求歷史記錄項的快照匾二,對應的類為WebHistoryItem哮独,其中包含歷史頁面url、原始url察藐、網(wǎng)頁標題皮璧、網(wǎng)頁圖標等信息。

?? WebBackForwardList作為列表用于存放WebHistoryItem對象分飞, 也相應提供了獲取當前頁面快照悴务、當前頁面快照下標、指定下標快照和列表長度方法譬猫。

??通過歷史列表的設計讯檐,頁面前進后退操作就轉(zhuǎn)化成對應快照的切換,判斷能否前進后退則轉(zhuǎn)化為是否有前進或者后臺的歷史記錄染服。效果如下圖:

頁面前進后退操作.png
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.01100.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);
    }




四误证、 生命周期

生命周期.png

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主要包含以下幾塊洁段。

獲取頁面信息.png

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() 
  • 值得注意的祠丝,通過WebViewClientonPagStarted()獲取的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()


參考資料

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市膨更,隨后出現(xiàn)的幾起案子缴允,更是在濱河造成了極大的恐慌练般,老刑警劉巖薄料,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件誊役,死亡現(xiàn)場離奇詭異蛔垢,居然都是意外死亡鹏漆,警方通過查閱死者的電腦和手機艺玲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門板驳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來若治,“玉大人礼烈,你說我怎么就攤上這事〈税荆” “怎么了滑进?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵阴汇,是天一觀的道長搀庶。 經(jīng)常有香客問我铜异,道長揍庄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任沃测,我火速辦了婚禮芽突,結果婚禮上董瞻,老公的妹妹穿的比我還像新娘田巴。我一直安慰自己钠糊,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布壹哺。 她就那樣靜靜地躺著抄伍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪管宵。 梳的紋絲不亂的頭發(fā)上截珍,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天攀甚,我揣著相機與錄音,去河邊找鬼岗喉。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼浊洞,長吁一口氣:“原來是場噩夢啊……” “哼苫亦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤璃饱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年昨凡,在試婚紗的時候發(fā)現(xiàn)自己被綠了哪痰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡哼鬓,死狀恐怖绒瘦,靈堂內(nèi)的尸體忽然破棺而出该酗,到底是詐尸還是另有隱情爵嗅,我是刑警寧澤戚啥,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站江兢,受9級特大地震影響席里,放射性物質(zhì)發(fā)生泄漏改基。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一稠腊、第九天 我趴在偏房一處隱蔽的房頂上張望架忌。 院中可真熱鬧,春花似錦速那、人聲如沸鹤竭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春谋币,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背症概。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工蕾额, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彼城。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓诅蝶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親募壕。 傳聞我的和親對象是個殘疾皇子调炬,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容