1. 程式人生 > >Android WebView用法和WebView載入提升網頁速度

Android WebView用法和WebView載入提升網頁速度

前言

WebView是Android裡的元件,下面將全面介紹WebView的常用用法。


1.簡介

WebView是一個基於webkit引擎、展現web頁面的控制元件。Android的Webview在低版本和高版本採用了不同的webkit版本核心,4.4後直接使用了Chrome。
2.作用 ·顯示和渲染Web頁面
·直接使用html檔案(網路上或本地assets中)作佈局
·可和JavaScript互動呼叫
   WebView控制元件功能強大,除了具有一般View的屬性和設定外,還可以對url請求、頁面載入、渲染、頁面互動進行強大的處理。

3. 使用介紹

一般來說Webview可單獨使用,可聯合其子類一起使用:
·Webview自身的常見方法 ·Webview的最常用的子類(WebSettings類、WebViewClient類、WebChromeClient類) ·Android和Js的互動

3.1 Webview常用方法

3.1.1 載入url
載入方式根據資源分為三種
  //方式1. 載入一個網頁:
  webView.loadUrl("http://www.google.com/");

  //方式2:載入apk包中的html頁面
  webView.loadUrl("file:///android_asset/test.html");

  //方式3:載入手機本地的html頁面
  webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");

// 方式4: 載入 HTML 頁面的一小段內容
  WebView.loadData(String data, String mimeType, String encoding)
// 引數說明:
// 引數1:需要擷取展示的內容

// 內容裡不能出現 ’#’, ‘%’, ‘\’ , ‘?’這四個字元,若出現了需用 %23, %25, %27, %3f 對應來替代,否則會出現異常
// 引數2:展示內容的型別
// 引數3:位元組碼

3.1.1 WebView的狀態

//啟用WebView為活躍狀態,能正常執行網頁的響應
webView.onResume() ;

//當頁面被失去焦點被切換到後臺不可見狀態,需要執行onPause
//通過onPause動作通知核心暫停所有的動作,比如DOM的解析、plugin的執行、JavaScript執行。
webView.onPause();

//當應用程式(存在webview)被切換到後臺時,這個方法不僅僅針對當前的webview而是全域性的全應用程式的webview
//它會暫停所有webview的layout,parsing,javascripttimer。降低CPU功耗。
webView.pauseTimers()
//恢復pauseTimers狀態
webView.resumeTimers();

//銷燬Webview
//在關閉了Activity時,如果Webview的音樂或視訊,還在播放。就必須銷燬Webview
//但是注意:webview呼叫destory時,webview仍繫結在Activity上
//這是由於自定義webview構建時傳入了該Activity的context物件
//因此需要先從父容器中移除webview,然後再銷燬webview:
rootLayout.removeView(webView); 
webView.destroy();
3.1.2 關於前進 / 後退網頁

//是否可以後退
Webview.canGoBack() 
//後退網頁
Webview.goBack()

//是否可以前進                     
Webview.canGoForward()
//前進網頁
Webview.goForward()

//以當前的index為起始點前進或者後退到歷史記錄中指定的steps
//如果steps為負數則為後退,正數則為前進
Webview.goBackOrForward(intsteps)
常見用法:Back鍵控制網頁後退
問題:在不做任何處理前提下 ,瀏覽網頁時點選系統的“Back”鍵,整個 Browser 會呼叫 finish()而結束自身
目標:點選返回後,是網頁回退而不是推出瀏覽器
解決方案:在當前Activity中處理並消費掉該 Back 事件
public boolean onKeyDown(int keyCode, KeyEvent event) {
  if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) { 
      mWebView.goBack();
      return true;
  }
  return super.onKeyDown(keyCode, event);
}

3.1.3 清除快取資料

//清除網頁訪問留下的快取
//由於核心快取是全域性的因此這個方法不僅僅針對webview而是針對整個應用程式.Webview.clearCache(true);

//清除當前webview訪問的歷史記錄
//只會webview訪問歷史記錄裡的所有記錄除了當前訪問記錄Webview.clearHistory();

//這個api僅僅清除自動完成填充的表單資料,並不會清除WebView儲存到本地的資料Webview.clearFormData();

3.2 常用類

3.2.1 WebSettings類

1、setAllowContentAccess (boolean allow) 是否允許在WebView中訪問內容URL(Content Url),預設允許。內容Url訪問允許WebView從安裝在系統中的內容提 供者載入內容。2、setAllowFileAccess (boolean allow) 是否允許訪問檔案,預設允許。注意,這裡只是允許或禁止對檔案系統的訪問,Assets 和 resources 檔案使用 file:///android_asset和 file:///android_res仍是可訪問的。 3、setAllowFileAccessFromFileURLs (boolean flag) 是否允許執行在一個URL環境(the context of a file scheme URL)中的JavaScript訪問來自其他URL環境的內容,為了保證 安全,應該不允 許。也請注意,這項設定隻影響對file schema 資源的JavaScript訪問,其他形式的訪問,例如來自圖片HTML 單元的訪問不受影響。為 了防止相同的域策 略(same domain policy)對ICE_CREAM_SANDWICH以及更老機型的侵害, 應該顯式地設定此值為false。4、setAllowUniversalAccessFromFileURLs (boolean flag) 是否允許執行在一個setAllowFileAccessFromFileURLs(boolean) file schema URL環境下的JavaScript訪問來自其他任何來源的內容,包括其 他file schema URLs. 參見 etAllowFileAccessFromFileURLs(boolean),為了確保安全,應該設定為不允許,注意這項設定隻影響對fileschema 資源的 JavaScript訪問,其他形式的訪問,例如來自圖片HTML單元的訪問不受影響。為了防止相同的域策略(same domain policy) 對ICE_CREAM_SANDWICH以及更老機型的侵害,應該顯式地設定此值為false。ICE_CREAM_SANDWICH_MR1 以及更老的版本此 預設值為 true,JELLY_BEAN以及更新版本此預設值為false 5、setAppCacheEnabled (boolean flag) 應用快取API是否可用,預設值false, 結合setAppCachePath(String)使用。6、setAppCachePath(String) 設定應用快取檔案的路徑。為了讓應用快取API可用,此方法必須傳入一個應用可寫的路徑。該方法只會執行一次,重複呼叫會被忽略。7、setAppCacheMaxSize (long appCacheMaxSize) 已廢棄。設定應用快取內容的最大值。所傳值會被近似為資料庫支援的最近似值,因此這是一個指示值,而不是一個固定值。所傳值若小於資料庫大小不會讓資料庫調整大小。預設值是MAX_VALUE,建議將預設值設定為最大值。8、setBlockNetworkImage (boolean flag) 是否禁止從網路(通過http和https URI schemes訪問的資源)下載圖片資源,預設值為false。注意,除非getLoadsImagesAutomatically()返回true,否則該方法無效。還請注意,即使此項設定為false,使用setBlockNetworkLoads(boolean)禁止所有網路載入也會阻止網路圖片的載入。當 此項設定的值從true變為false,WebView當前顯示的內容所引用的網路圖片資源會自動獲取。9、setBlockNetworkLoads (boolean flag) 是否禁止從網路下載資料,如果app有INTERNET許可權,預設值為false,否則預設為true。使用setBlockNetworkImage(boolean) 只會禁止圖片資源的載入。注意此值由true變為false,當前WebView展示的內容所引用的網路資源不會自動載入,直到呼叫了過載。如果APP沒有INTERNET許可權,設 置此值為false會丟擲SecurityException。10、setBuiltInZoomControls (boolean enabled) 是否使用內建的縮放機制。內建的縮放機制包括螢幕上的縮放控制元件(浮於WebView內容之上)和縮放手勢的運用。通過 setDisplayZoomControls(boolean)可以控制是否顯示這些控制元件,預設值為false。 11、setCacheMode (int mode) 重寫使用快取的方式,預設值LOAD_DEFAULT。快取的使用方式基於導航型別,正常的頁面載入,檢測快取,需要時快取內容復現。導航返回時,內容不會復現,只有內容會從快取盤中恢復。該方法允許客戶端通過指定LOAD_DEFAULT, LOAD_CACHE_ELSE_NETWORK, LOAD_NO_CACHE or LOAD_CACHE_ONLY的其中一項來重寫其行為。 12、setCursiveFontFamily (String font) 設定WebView字型庫字型,預設“cursive”13、setDatabaseEnabled (boolean flag) 資料庫儲存API是否可用,預設值false。如何正確設定資料儲存API參見setDatabasePath(String)。該設定對同一程序中的所有WebView例項均有效。注意,只能在當前程序的任意WebView載入頁面之前修改此項,因為此節點之後WebView的實現類可能會忽略該項設定的改變。 14、setDatabasePath (String databasePath) 已廢棄,資料庫路徑由實現(implementation)管理,呼叫此方法無效。 設定資料庫的儲存路徑,為了保證資料庫正確執行,該方法必須使用一個應用可寫的路徑。此方法只能執行一次,重複呼叫會被忽略。15、setDefaultFixedFontSize (int size) 設定預設固定的字型大小,預設為16,可取值1到7216、setDefaultFontSize (int size) 設定預設的字型大小,預設16,可取值1到7217、setDefaultTextEncodingName (String encoding) 設定預設的字元編碼集,預設”UTF-8”.18、setDefaultZoom (WebSettings.ZoomDensity zoom) 已廢棄。設定預設的縮放密度,必須在UI執行緒呼叫,預設值MEDIUM.該項設定在新應用中不推薦使用。如果WebView用於展示手機頁面,可以通過調整 頁面的’meta viewport’ 標記中的’width’ 和 ‘initial-scale’屬性實現預期效果,對於漏用標記的頁面,可以使用setInitialScale(int)和 setUseWideViewPort(boolean) . 19、setDisplayZoomControls (boolean enabled) 使用內建的縮放機制時是否展示縮放控制元件,預設值true。參見setBuiltInZoomControls(boolean).20、setDomStorageEnabled (boolean flag) DOM儲存API是否可用,預設false。21、setEnableSmoothTransition (boolean enable) 已廢棄,將來會成為空操作(no-op),設定當panning或者縮放或者持有當前WebView的window沒有焦點時是否允許其光滑過渡,若為true,WebView會選擇一個性能最大化的解決方案。例如過渡時WebView的內容可能不更新。若為false,WebView會保持精度(fidelity),預設值false。 22、setFantasyFontFamily (String font) 設定fantasy字型集(font family)的名字預設為“fantasy”23、setFixedFontFamily (String font) 設定固定的字型集的名字,預設為”monospace”。24、setGeolocationDatabasePath (String databasePath) 定位資料庫的儲存路徑,為了確保定位許可權和快取位置的持久化,該方法應該傳入一個應用可寫的路徑。25、setGeolocationEnabled (boolean flag) 定位是否可用,預設為true。請注意,為了確保定位API在WebView的頁面中可用,必須遵守如下約定: (1) app必須有定位的許可權,參見ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION; (2) app必須提供onGeolocationPermissionsShowPrompt(String, GeolocationPermissions.Callback)回撥方法的實現,在頁面通過JavaScript定位API請求定位時接收通知。  作為可選項,可以在資料庫中儲存歷史位置和Web初始許可權,參見setGeolocationDatabasePath(String).26、setJavaScriptCanOpenWindowsAutomatically (boolean flag) JavaScript自動開啟視窗,預設false。適用於JavaScript方法window.open()。27、setJavaScriptEnabled (boolean flag) 設定WebView是否允許執行JavaScript指令碼,預設false,不允許。28、setLayoutAlgorithm (WebSettings.LayoutAlgorithm l) 設定佈局,會引起WebView的重新佈局(relayout),預設值NARROW_COLUMNS29、setLightTouchEnabled (boolean enabled) 已廢棄。從 JELLY_BEAN 開始,該設定無效。允許使用輕觸控做出選擇和游標懸停。30、setLoadWithOverviewMode (boolean overview) 是否允許WebView度超出以概覽的方式載入頁面,預設false。即縮小內容以適應螢幕寬度。該項設定在內容寬度超出WebView控制元件的寬度時生效,例 如當getUseWideViewPort() 返回true時。31、setLoadsImagesAutomatically (boolean flag) WebView是否下載圖片資源,預設為true。注意,該方法控制所有圖片的下載,包括使用URI嵌入的圖片(使用setBlockNetworkImage(boolean) 只控制使用網路URI的圖片的下載)。如果該設定項的值由false變為true,WebView展示的內容所引用的所有的圖片資源將自動下載。32、setMediaPlaybackRequiresUserGesture (boolean require) WebView是否需要使用者的手勢進行媒體播放,預設值為true。33、setMinimumFontSize (int size) 設定最小的字號,預設為834、setMinimumLogicalFontSize (int size) 設定最小的本地字號,預設為8。35、setMixedContentMode (int mode) 當一個安全的來源(origin)試圖從一個不安全的來源載入資源時配置WebView的行為。預設情況下,KITKAT及更低版本預設

LOLLIPOP版本預設值MIXED_CONTENT_NEVER_ALLOW,WebView首選的最安全的操作模式為MIXED_CONTENT_NEVER_ALLOW ,不鼓勵使用 MIXED_CONTENT_ALWAYS_ALLOW。
36、setNeedInitialFocus (boolean flag) 呼叫requestFocus(int, Android.graphics.Rect)時是否需要設定節點獲取焦點,預設值為true。37、setOffscreenPreRaster (boolean enabled) WebView切換到後臺但仍然與視窗關聯時是否raster tiles,開啟它可以避免在WebView從後臺切換到前臺時重新繪製,預設值false。在這種模 式下後臺的WebView佔用更多的記憶體。請按如下準則顯示記憶體的使用: 38、WebView的尺寸不能比裝置的螢幕尺寸更大;限制在少數WebView上使用該模式;在可見的WebView和即將顯現的WebView上使用;setPluginState (WebSettings.PluginState state) API18以上已廢棄。未來將不支援外掛,不要使用。告訴WebView啟用、禁用或者有即用(on demand)的外掛,即用模式是指如果存在一個可以處理嵌入內容的外掛,會顯示一個佔位圖示,點選時開啟。預設值OFF。39、setRenderPriority (WebSettings.RenderPriority priority) API18以上已廢棄。不建議調整執行緒優先順序,未來版本不會支援這樣做。設定繪製(Render,很多書上翻譯成渲染,

貌似很專業,但是不易懂,不敢苟同)執行緒的優先順序。不像其他設定,同一程序中只需呼叫一次,預設值NORMAL。40、setSansSerifFontFamily (String font) 設定無襯線字型集(sans-serif font family)的名字。預設值”sans-serif”.41、setSaveFormData (boolean save) WebView是否儲存表單資料,預設值true。42、setSavePassword (boolean save) API18以上版本已廢棄。未來版本將不支援儲存WebView中的密碼。設定WebView是否儲存密碼,預設true。43、setSerifFontFamily (String font) 設定襯線字型集(serif font family)的名字,預設“sans-serif”。44、setStandardFontFamily (String font) 設定標準字型集的名字,預設值“sans-serif”。45、setSupportMultipleWindows (boolean support) 設定WebView是否支援多視窗。如果設定為true,主程式要實現onCreateWindow(WebView, boolean, boolean, Message),預設false。46、setSupportZoom (boolean support) WebView是否支援使用螢幕上的縮放控制元件和手勢進行縮放,預設值true。設定setBuiltInZoomControls(boolean)可以使用特殊的縮放機制。

該項設定不會影響zoomIn() and zoomOut()的縮放操作。 47、setTextSize (WebSettings.TextSize t) API14版本以上已廢棄。請取代使用setTextZoom(int)。設定頁面文字的尺寸,預設NORMAL。48、setTextZoom (int textZoom) 設定頁面上的文字縮放百分比,預設100。49、setUseWideViewPort (boolean use) WebView是否支援HTML的“viewport”標籤或者使用wide viewport。設定值為true時,佈局的寬度總是與WebView控制元件上的裝置無關畫素(device-dependent pixels)寬度一致。當值為true且頁面包含viewport標記,將使用標籤指定的寬度。

如果頁面不包含標籤或者標籤沒有提供寬度,那就使用wideviewport。50、setUserAgentString (String ua) 設定WebView的使用者代理字串。如果字串為null或者empty,將使用系統預設值。注意從KITKAT版本開始,載入網頁時改變使用者代理會讓WebView再次初始化載入。 51、supportMultipleWindows () 獲取WebView是否支援多視窗的值。52、supportZoom () 獲取WebView是否支援縮放的值 1、setAllowContentAccess (boolean allow) 是否允許在WebView中訪問內容URL(Content Url),預設允許。內容Url訪問允許WebView從安裝在系統中的內容提 供者載入內容。

3.3 WebView載入提升網頁開啟的速度

1.載入時先載入文字,後加載圖片呼叫方式如下 WebSettings settings = wView.getSettings();  
        settings.setJavaScriptEnabled(true);  
        settings.setBuiltInZoomControls(true);  
        settings.setBlockNetworkImage(true);  
wView.setWebChromeClient(new WebChromeClient() {  
            @Override  
            public void onProgressChanged(WebView view, int newProgress) {  
                if (newProgress == 100) {  
                    // 網頁載入完成  
                    loadDialog.dismiss();  
                    wView.getSettings().setBlockNetworkImage(false);  
                } else {  
                    // 網頁載入中  
                    loadDialog.show();  
                }  
            }  
        });  
2.加入執行緒 runOnUiThread(new Runnable() {
    @Override
   public void run() {
       WebSettings wSet = web_view.getSettings();
        wSet.setJavaScriptEnabled(true);
        web_url = “http://www.baidu.com";
        web_view.loadUrl(web_url);
    }
});

相關推薦

Android WebView用法WebView載入提升網頁速度

前言 WebView是Android裡的元件,下面將全面介紹WebView的常用用法。 1.簡介 WebView是一個基於webkit引擎、展現web頁面的控制元件。Android的Webview

Android IntentService用法原始碼分析

關於IntentService的介紹,我個人覺得還是先看官方描述比較好: IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) o

從Instant run談Android替換Application動態載入機制

轉自http://www.tuicool.com/articles/ZFbaaub Android studio 2.0 Stable版本中集成了Install run即時編譯技術,官方描述可以大幅加速編譯速度,我們團隊在第一時間更新並使用,總體用下來感覺,恩…也就那樣吧

如何運用最新的技術提升網頁速度效能

最近更新了我們的網站,它是經過了設計上的全面驗收的。但實際上,作為軟體開發者,我們會注重很多技術相關的零碎的東西。我們的目標是控制性能,注重效能,未來可伸展,為網站增添內容是一種樂趣。接著就來告訴你,為什麼我們的網站速度比你們的快吧(抱歉,確實是這樣的)。 效能設計 在我們的專

android的PicassoGlide載入本地圖片的區別

最近專案中有用到Picasso和Glide來載入本地圖片,發現有些區別 圖片路徑: String framePicPath="/storage/sdcard1/Android/data/com.example.lshapp.shortvideodemo /c

Android Studio中使用build scan 提升構建速度

前言 Gradle 的 build scans是能夠將我們構建應用的時間清晰統計出來的外掛,幫助我們更好的優化構建專案的時間。 下面是官方連線,點選快速開始: 快速開始 電腦Mac pro 版本10.14 Android studio 版本 3.1.4 Gradle版本4

android:webview載入網頁速度很慢的的究極解決方案

 Android客戶端中混搭HTML頁面,會出現雖然HTML內容載入完成,標題也正常顯示,但是整個網頁需要等到近5秒(甚至更多)時間才會顯示出來。研究了很久,搜遍了國外很多網站,也看過PhoneGap的程式碼,一直無解。        一般人堆WebView的加速,都是建

Android WebView載入https網頁(親測)

只需加兩處設定: 1 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { settings.

Android:WebView載入url網頁顯示不完整解決辦法

WebView基本用法 如果想要在APP裡面載入url網頁,或者html程式碼,首先我們會想到WebView,它的基本用法如下: webview_layout.xml <?xml version="1.0" encoding="utf-8"?&g

Android webview 載入https網頁顯示空白

設定webview支援https的方法: webView.setWebViewClient(new WebViewClient(){ @Override

Android WebView載入H5網頁通過WebChromeClient選擇裝置檔案

Android WebView載入H5網頁通過WebChromeClient選擇裝置檔案 先寫一個web.html作為測試網頁檔案放到res/assets目錄下: <html> <body> <input type="file" value="選擇檔案"&g

android webview 載入顯示網頁載入進度條的例子

1 增加許可權 <uses-permission android:name="android.permission.INTERNET"/> 2 主Activity package com.example.webview; import android.app.A

畢業設計之android混合模式開發第一天--具有下拉重新整理頁面載入等待的WebView搭建

第一次真正接觸android的混合模式開發,之前瞭解過如何進行混合模式的開發,常見的是通過WebView元件載入url,使用HTML5和CSS3構建手機端響應式佈局。 今天主要是搭建出一個可載入url,具有下拉重新整理和頁面等待的WebView。 2.頁面等待的實現主要是

android------引導頁兩種實現方式(原生WebView網頁實現)

有的App當你第一次開啟的是和常常會有引導頁來描述一些App資訊(功能,特點),當然也要做驗證,驗證第二次進入不進入引導頁,直接進入App,此部落格藉助ViewPager來實現引導頁, ViewPager類提供了多介面切換的新效果,是谷歌在3.0之後加入的新特性,所以需要引

WebView載入網頁中touch事件處理

        一直有接觸webview,也用到了很多關於webview的各種特性,一直沒找到時機吧所有的webview的用法總結起來,這次也暫時先記錄一下webview載入網頁,我們在網頁中的點選,滑動等動作的事件處理機制。當時的需求大概是我在fragmen

Android 8.0上webView載入url,不回撥onPageFinished

背景 維護一個老的專案,突然上報了很多webView載入不出來的bug。但是借了很多手機都不復現。後面有注意到google 更新過 Android system webview 的應用,從那以後bug就接踵而至。我就去更新了一個該應用到最新版,果然復現了。發現沒有回撥onPageFi

Android WebView 無法播放視訊 載入不出來等問題

參考 http://blog.csdn.net/qq_16472137/article/details/54346078 程式碼設定 mWebView.setWebChromeClient(new MyWebChromeClient()); //

Android控制元件-ScrollView WebView之見滑動衝突解決

   需求:               最近在做一個webView載入網頁的頁面,最外層是一個scrollView,因為還有標題等其他資料是需要單獨獲取載入,所以scrollview中是包含一個其他資訊的頭部佈局和一個載入網頁資訊的WebView,當滑動的時候,頭部和We

深坑之Webview,解決H5呼叫android相機拍照錄影

最近在開發過程中遇到一個問題,主要是呼叫第三方的實名認證,需要拍照和錄影; 辦過支付寶大寶卡和騰訊的大王卡的都知道這玩意,辦卡的時候就需要進行實名認證,人臉識別; 本來第三方平臺(xxx流量公司)說的是直接用WebView載入這個H5介面就完事了,我心想這麼簡單

使用Webview載入html網頁

WebView設定 //加上下面這段程式碼可以使網頁中的連結不以瀏覽器的方式開啟 webView.setWebViewClient(new WebViewC