前言#
這篇主要講的是WebSettings,api講的不多,但是講了一下新舊版本的WebSettings的架構變化,圖片我轉不過來,所以就不貼圖了。完整的博客大家去看原文,我把使用過的api添加到最下面。
正文#
轉載請注明出處 http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao
概覽
Android WebView提供展示網(wǎng)頁,也提供我們應用程序對網(wǎng)頁加載的一些定制,比如我們?yōu)榱藴p少網(wǎng)絡數(shù)據(jù)可以設置當前加載的頁面不能顯示圖片,如果是pc網(wǎng)址在pad上訪問我們可以提供用戶一種概覽模式的瀏覽方式,可以提供放大網(wǎng)頁字體等定制功能。Android 提供管理WebView的一些setting的類WebSettings,在WebView對象被創(chuàng)建時WebSettings對象也會被同時創(chuàng)建,并附有默認的settings值. WebSettings對象可以通過WebView.getSettings()獲得。WebSettings的生命周期同WebView生命周期相同,如果WebView被destroy 則WebSettings應該被釋放,否則如果使用WebSettings繼續(xù)再操作的話, 會拋出異常IllegalStateException。
1.WebSettings API詳解
調用WebSettings設置的所有函數(shù)是異步制定的,因此我們設置某個狀態(tài)并不能馬上生效。
public synchronized void setLoadsImagesAutomatically(boolean flag)
設置當前webview是否需要加載圖片,這個標記控制整個webview的狀態(tài),并且對所有的資源都采取這種策略。如果設置為false 那么訪問的當前網(wǎng)址中的所以圖片資源將不會被加載。默認值是true;
public synchronized void setBlockNetworkImage (boolean flag)
當getLoadsImagesAutomatically返回true這個方法才有效, 默認值為:false;
public void setCacheMode(int mode)
一個普通網(wǎng)頁的加載cache會被檢查,內容也會被重新校驗,第一次訪問網(wǎng)頁時,會存儲cache到本地,設置策略可以讓網(wǎng)頁加載方式發(fā)生變化,cache模式有如下幾種:
LOAD_DEFAULT: 如果我們應用程序沒有設置任何cachemode, 這個是默認的cache方式。 加載一張網(wǎng)頁會檢查是否有cache,如果有并且沒有過期則使用本地cache,否則 從網(wǎng)絡上獲取。
LOAD_CACHE_ELSE_NETWORK: 使用cache資源,即使過期了也使用,如果沒有cache才從網(wǎng)絡上獲取。
LOAD_NO_CACHE: 不使用cache 全部從網(wǎng)絡上獲取
LOAD_CACHE_ONLY: 只使用cache上的內容。
public void setLoadWithOverviewMode(boolean overview)
概覽模式的設置,默認指是false。
public synchronized void setJavaScriptEnabled (boolean flag)
默認值是false. 如果我們網(wǎng)頁需要javascript時,需要開啟這個設置,否則網(wǎng)頁加載不全。
2.WebSettings Webkit中的實現(xiàn)
WebSeetings 的API在Android 系統(tǒng)各個版本變化不大只是增加API或者deprecate一些API,但其內部是實現(xiàn)在不同版本中確有些差異,目前主流android系統(tǒng)版本主要為Android 4.0以上,分析4.0以上各系統(tǒng)版本得出webseetings的實現(xiàn)分為三塊Android 4.0, Android 4.1---4.3,Android 4.4。下面分析下Android 以上各版本間的實現(xiàn):
1)Android 4.0系統(tǒng) 主要分為兩部分,一部分是API層,另一部分Settings的存儲位置。
Settings存儲位置大部分的setting最終設置到WebCore當中的Settings.cpp, 比如javaScriptEnable等
還有一部分根據(jù)模塊相關存儲在模塊內部,比如CacheMode存儲在FrameLoader當中。
2)Android 4.1--4.3系統(tǒng)對WebView的 framework進行重構,WebSettings相應也跟著變化。
中間引入了橋階層WebSettingsClassc。
Settings存儲位置大部分的setting最終設置到WebCore當中的Settings.cpp, 比如javaScriptEnable等
還有一部分跟平臺相關的存儲在WebCoreSupport層相應模塊中,比如在4.1---4.3上CacheMode存儲在WebRequestContext
在Android 4.4上WebView底層實現(xiàn)換成了chromium,為了兼容老的WebSettings的接口,Android 4.4做了chromium 的橋階層,主要涉及的WebSettings相關代碼在
ContentSettingsAdapter,AwSettings中。
和前面的一些版本相同的是大部分settings還是存儲在Webkit的Settings.cpp中,這邊簡單介紹下chromium 使用的blink渲染引擎,而blink是從webkit當中剝離出來的,還保留了webkit的parsing等。因此和我們之前看到的Settings.cpp存儲在WebCore目錄,目錄結構會有所不同。
還有一部分settings在Android 4.4上存儲方式也是存儲在platform porting層。 下面是一個關于cachemode這個設置的分析:
參考資料:
http://developer.android.com/reference/packages.html#q=websettings
https://source.android.com/ Android 4.0---4.4
補充內容#
webSettings.setBuiltInZoomControls(false);// 是否支持縮放
webSettings.setRenderPriority(RenderPriority.LOW);// 設置渲染級別
// 設置js可以直接打開窗口,如window.open(),默認為false
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
// 設置webView最大的緩存空間
webSettings.setAppCacheMaxSize(1024 * 1024 * 50);
// 是否啟用緩存
webSettings.setAppCacheEnabled(true);
// 是否開啟本地DOM存儲
webSettings.setDomStorageEnabled(true);
總結#
還有其他的api沒有介紹,不過從命名上來看,理解上應該都是不難,不懂得話就去看看api的英文注解,都不會有太大問題。
感謝原博主的分享,講解的真是非常的詳細,看完這個三篇真是受益匪淺,必須收藏。