(轉(zhuǎn)載)Android WebView 開發(fā)詳解(三)

前言#

這篇主要講的是WebSettings,api講的不多,但是講了一下新舊版本的WebSettings的架構(gòu)變化,圖片我轉(zhuǎn)不過(guò)來(lái),所以就不貼圖了。完整的博客大家去看原文,我把使用過(guò)的api添加到最下面。

正文#

轉(zhuǎn)載請(qǐng)注明出處 http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao

概覽
Android WebView提供展示網(wǎng)頁(yè),也提供我們應(yīng)用程序?qū)W(wǎng)頁(yè)加載的一些定制,比如我們?yōu)榱藴p少網(wǎng)絡(luò)數(shù)據(jù)可以設(shè)置當(dāng)前加載的頁(yè)面不能顯示圖片,如果是pc網(wǎng)址在pad上訪問(wèn)我們可以提供用戶一種概覽模式的瀏覽方式,可以提供放大網(wǎng)頁(yè)字體等定制功能。Android 提供管理WebView的一些setting的類WebSettings,在WebView對(duì)象被創(chuàng)建時(shí)WebSettings對(duì)象也會(huì)被同時(shí)創(chuàng)建,并附有默認(rèn)的settings值. WebSettings對(duì)象可以通過(guò)WebView.getSettings()獲得。WebSettings的生命周期同WebView生命周期相同,如果WebView被destroy 則WebSettings應(yīng)該被釋放,否則如果使用WebSettings繼續(xù)再操作的話, 會(huì)拋出異常IllegalStateException。

1.WebSettings API詳解
調(diào)用WebSettings設(shè)置的所有函數(shù)是異步制定的,因此我們?cè)O(shè)置某個(gè)狀態(tài)并不能馬上生效。

public synchronized void setLoadsImagesAutomatically(boolean flag)  

設(shè)置當(dāng)前webview是否需要加載圖片,這個(gè)標(biāo)記控制整個(gè)webview的狀態(tài),并且對(duì)所有的資源都采取這種策略。如果設(shè)置為false 那么訪問(wèn)的當(dāng)前網(wǎng)址中的所以圖片資源將不會(huì)被加載。默認(rèn)值是true;

public synchronized void setBlockNetworkImage (boolean flag)  

當(dāng)getLoadsImagesAutomatically返回true這個(gè)方法才有效, 默認(rèn)值為:false;

public void setCacheMode(int mode)  

一個(gè)普通網(wǎng)頁(yè)的加載cache會(huì)被檢查,內(nèi)容也會(huì)被重新校驗(yàn),第一次訪問(wèn)網(wǎng)頁(yè)時(shí),會(huì)存儲(chǔ)cache到本地,設(shè)置策略可以讓網(wǎng)頁(yè)加載方式發(fā)生變化,cache模式有如下幾種:
LOAD_DEFAULT: 如果我們應(yīng)用程序沒(méi)有設(shè)置任何cachemode, 這個(gè)是默認(rèn)的cache方式。 加載一張網(wǎng)頁(yè)會(huì)檢查是否有cache,如果有并且沒(méi)有過(guò)期則使用本地cache,否則 從網(wǎng)絡(luò)上獲取。
LOAD_CACHE_ELSE_NETWORK: 使用cache資源,即使過(guò)期了也使用,如果沒(méi)有cache才從網(wǎng)絡(luò)上獲取。
LOAD_NO_CACHE: 不使用cache 全部從網(wǎng)絡(luò)上獲取
LOAD_CACHE_ONLY: 只使用cache上的內(nèi)容。

public void setLoadWithOverviewMode(boolean overview)  

概覽模式的設(shè)置,默認(rèn)指是false。

public synchronized void setJavaScriptEnabled (boolean flag)  

默認(rèn)值是false. 如果我們網(wǎng)頁(yè)需要javascript時(shí),需要開啟這個(gè)設(shè)置,否則網(wǎng)頁(yè)加載不全。

2.WebSettings Webkit中的實(shí)現(xiàn)
WebSeetings 的API在Android 系統(tǒng)各個(gè)版本變化不大只是增加API或者deprecate一些API,但其內(nèi)部是實(shí)現(xiàn)在不同版本中確有些差異,目前主流android系統(tǒng)版本主要為Android 4.0以上,分析4.0以上各系統(tǒng)版本得出webseetings的實(shí)現(xiàn)分為三塊Android 4.0, Android 4.1---4.3,Android 4.4。下面分析下Android 以上各版本間的實(shí)現(xiàn):

1)Android 4.0系統(tǒng) 主要分為兩部分,一部分是API層,另一部分Settings的存儲(chǔ)位置。
Settings存儲(chǔ)位置大部分的setting最終設(shè)置到WebCore當(dāng)中的Settings.cpp, 比如javaScriptEnable等
還有一部分根據(jù)模塊相關(guān)存儲(chǔ)在模塊內(nèi)部,比如CacheMode存儲(chǔ)在FrameLoader當(dāng)中。
2)Android 4.1--4.3系統(tǒng)對(duì)WebView的 framework進(jìn)行重構(gòu),WebSettings相應(yīng)也跟著變化。
中間引入了橋階層WebSettingsClassc。
Settings存儲(chǔ)位置大部分的setting最終設(shè)置到WebCore當(dāng)中的Settings.cpp, 比如javaScriptEnable等
還有一部分跟平臺(tái)相關(guān)的存儲(chǔ)在WebCoreSupport層相應(yīng)模塊中,比如在4.1---4.3上CacheMode存儲(chǔ)在WebRequestContext

在Android 4.4上WebView底層實(shí)現(xiàn)換成了chromium,為了兼容老的WebSettings的接口,Android 4.4做了chromium 的橋階層,主要涉及的WebSettings相關(guān)代碼在
ContentSettingsAdapter,AwSettings中。
和前面的一些版本相同的是大部分settings還是存儲(chǔ)在Webkit的Settings.cpp中,這邊簡(jiǎn)單介紹下chromium 使用的blink渲染引擎,而blink是從webkit當(dāng)中剝離出來(lái)的,還保留了webkit的parsing等。因此和我們之前看到的Settings.cpp存儲(chǔ)在WebCore目錄,目錄結(jié)構(gòu)會(huì)有所不同。
還有一部分settings在Android 4.4上存儲(chǔ)方式也是存儲(chǔ)在platform porting層。 下面是一個(gè)關(guān)于cachemode這個(gè)設(shè)置的分析:

參考資料:
http://developer.android.com/reference/packages.html#q=websettings
https://source.android.com/ Android 4.0---4.4

補(bǔ)充內(nèi)容#

webSettings.setBuiltInZoomControls(false);// 是否支持縮放

webSettings.setRenderPriority(RenderPriority.LOW);// 設(shè)置渲染級(jí)別

// 設(shè)置js可以直接打開窗口,如window.open(),默認(rèn)為false
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

// 設(shè)置webView最大的緩存空間
webSettings.setAppCacheMaxSize(1024 * 1024 * 50);

// 是否啟用緩存
webSettings.setAppCacheEnabled(true);

// 是否開啟本地DOM存儲(chǔ)
webSettings.setDomStorageEnabled(true);

總結(jié)#

還有其他的api沒(méi)有介紹,不過(guò)從命名上來(lái)看,理解上應(yīng)該都是不難,不懂得話就去看看api的英文注解,都不會(huì)有太大問(wèn)題。

感謝原博主的分享,講解的真是非常的詳細(xì),看完這個(gè)三篇真是受益匪淺,必須收藏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容