1. 程式人生 > >WebView使用詳解(一)——Native與JS相互呼叫(附JadX反編譯)

WebView使用詳解(一)——Native與JS相互呼叫(附JadX反編譯)

前言:念念不忘,必有迴響,永遠堅持你所堅持的!


一直在用WebView,還沒有系統的總結過它的用法,下面就係統的總結下,分享給大家

一、基本用法

1、載入線上URL

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. void loadUrl(String url)  
void loadUrl(String url)
這個函式主要載入url所對應的網頁地址,或者用於呼叫網頁中的指定的JS方法(呼叫js方法的用法,後面會講),但有一點必須注意的是:loadUrl()必須在主執行緒中執行!!!否則就會報錯!!!。
注意:載入線上網頁地址是會用到聯網permission許可權的,所以需要在AndroidManifest.xml中寫入下面程式碼申請許可權:

[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <uses-permissionandroid:name=“android.permission.INTERNET”/>
<uses-permission android:name="android.permission.INTERNET" />
本示例效果為:

從效果圖中可以明顯看出本示例的佈局:
main.xml
[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <?xmlversion=“1.0”encoding=“utf-8”?>
  2. <LinearLayoutxmlns:android=“http://schemas.android.com/apk/res/android”
  3.               android:orientation=“vertical”
  4.               android:layout_width=“fill_parent”
  5.               android:layout_height=“fill_parent”
  6.         >
  7.     <Button
  8.             android:id=“@+id/btn”
  9.             android:layout_width=“match_parent”
  10.             android:layout_height=“wrap_content”
  11.             android:text
    =“載入URL”/>
  12.     <WebView
  13.             android:id=“@+id/webview”
  14.             android:layout_width=“match_parent”
  15.             android:layout_height=“match_parent”/>
  16. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="載入URL"/>

    <WebView
            android:id="@+id/webview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
</LinearLayout>
對應的處理程式碼如下
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. publicclass MyActivity extends Activity {  
  2.     private WebView mWebView;  
  3.     private Button mBtn;  
  4.     @Override
  5.     publicvoid onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.         mWebView = (WebView)findViewById(R.id.webview);  
  9.         mBtn = (Button)findViewById(R.id.btn);  
  10.         mBtn.setOnClickListener(new View.OnClickListener() {  
  11.             @Override
  12.             publicvoid onClick(View v) {  
  13.                 mWebView.loadUrl(”http://www.baidu.com”);  
  14.             }  
  15.         });  
  16.     }  
  17. }  
public class MyActivity extends Activity {

    private WebView mWebView;
    private Button mBtn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mWebView = (WebView)findViewById(R.id.webview);
        mBtn = (Button)findViewById(R.id.btn);

        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWebView.loadUrl("http://www.baidu.com");
            }
        });
    }
}
程式碼很簡單,就是在點選按鈕的時候載入網址,但需要注意的是:網址必須完整即以http://或者ftp://等協議開頭,不能省略!不然將載入不出來,這是因為webview是沒有自動補全協議功能的,所以如果我們不加,它將識別不出來網址型別,也就載入不出來了。
但如果我們執行上面的程式碼,效果卻是利用瀏覽器來開啟網址,卻不是使用webview開啟網址:

如果我們想實現像示例一樣在webview中開啟網址需要怎麼做呢?
我們需要設定WebViewClient:
修改後的程式碼為:
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. publicclass MyActivity extends Activity {  
  2.     private WebView mWebView;  
  3.     private Button mBtn;  
  4.     @Override
  5.     publicvoid onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.         mWebView = (WebView)findViewById(R.id.webview);  
  9.         mBtn = (Button)findViewById(R.id.btn);  
  10.         mWebView.setWebViewClient(new WebViewClient());  
  11.         mBtn.setOnClickListener(new View.OnClickListener() {  
  12.             @Override
  13.             publicvoid onClick(View v) {  
  14.                 mWebView.loadUrl(”http://www.baidu.com”);  
  15.             }  
  16.         });  
  17.     }  
  18. }  
public class MyActivity extends Activity {

    private WebView mWebView;
    private Button mBtn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mWebView = (WebView)findViewById(R.id.webview);
        mBtn = (Button)findViewById(R.id.btn);

        mWebView.setWebViewClient(new WebViewClient());

        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWebView.loadUrl("http://www.baidu.com");
            }
        });
    }
}
在上面的基礎上,我們添加了下面一段程式碼:
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. mWebView.setWebViewClient(new WebViewClient());  
mWebView.setWebViewClient(new WebViewClient());
在這裡我們利用mWebView.setWebViewClient()函式僅僅設定了一個WebViewClient例項,就可以實現在WebView中開啟連結了,至於原因我們下篇會講到,這裡就先忽略了,大家只需要知道要在WebView中開啟連結,就必須要設定WebViewClient;
最終的效果圖就與開篇時一樣的了,這裡就不再帖效果圖了,下面我們來看看如何載入本地html網頁
原始碼在文章底部給出

2、載入本地URL

一般而言,我們會將本地html檔案放在assets資料夾下,比如:


web.html的內容為:

[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <!DOCTYPE html>
  2. <htmllang=“en”>
  3. <head>
  4.     <metacharset=“UTF-8”>
  5.     <title>Title</title>
  6.     <h1>歡迎光臨啟艦的blog</h1>
  7. </head>
  8. <body>
  9. </body>
  10. </html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <h1>歡迎光臨啟艦的blog</h1>
</head>
<body>
</body>
</html>
即大標題顯示一段文字
我們同樣在上面的示例的基礎上加以改造,在點選按鈕的時候載入本地web.html檔案
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. publicclass MyActivity extends Activity {  
  2.     private WebView mWebView;  
  3.     private Button mBtn;  
  4.     @Override
  5.     publicvoid onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.         mWebView = (WebView)findViewById(R.id.webview);  
  9.         mBtn = (Button)findViewById(R.id.btn);  
  10.         mBtn.setOnClickListener(new View.OnClickListener() {  
  11.             @Override
  12.             publicvoid onClick(View v) {  
  13.                 mWebView.loadUrl(”file:///android_asset/web.html”);  
  14.             }  
  15.         });  
  16.     }  
  17. }      
public class MyActivity extends Activity {

    private WebView mWebView;
    private Button mBtn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mWebView = (WebView)findViewById(R.id.webview);
        mBtn = (Button)findViewById(R.id.btn);

        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWebView.loadUrl("file:///android_asset/web.html");
            }
        });
    }
}    
從這裡可以看到與載入線上URL有兩點不同:
1、URL型別不一樣
在載入本地URL時,是以“file:///”開頭的,而assets目錄所對應的路徑名為anroid_asset,寫成其它的將識別不了,這是assets目錄的以file開頭的url形式的固定訪問形式。
2、不需要設定WebViewClient
這裡很明顯沒有設定WebViewClient函式,但仍然是在webview中開啟的本地檔案。具體原因下篇文章講到WebViewClient時我們會具體解釋。
本例效果圖如下:

所以對於載入URL的總結就是:
1、如果是線上網址記得新增網路訪問許可權
2、線上網址中,如果要使用webview開啟,記得設定WebViewClient
3、開啟本地html檔案時,是不需要設定WebViewClient,對應的asstes目錄的url為:file:///android_asset/xxxxx

原始碼在文章底部給出

3、WebView基本設定

如果我們需要設定WebView的屬性,是通過WebView.getSettings()獲取設定WebView的WebSettings物件,然後呼叫WebSettings中的方法來實現的。
WebSettings的方法及說明如下:(這裡先列出來所有的方法及解釋,大家可以先忽略,看後面的舉例中所使用的幾個常用方法即可,用到哪個函式的時候再回來查查就可以了)
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. /** 
  2.  * 是否支援縮放,配合方法setBuiltInZoomControls使用,預設true 
  3.  */
  4. setSupportZoom(boolean support)  
  5. /** 
  6.  * 是否需要使用者手勢來播放Media,預設true 
  7.  */
  8. setMediaPlaybackRequiresUserGesture(boolean require)  
  9. /** 
  10.  * 是否使用WebView內建的縮放元件,由浮動在視窗上的縮放控制和手勢縮放控制組成,預設false 
  11.  */
  12. setBuiltInZoomControls(boolean enabled)  
  13. /** 
  14.  * 是否顯示視窗懸浮的縮放控制,預設true 
  15.  */
  16. setDisplayZoomControls(boolean enabled)  
  17. /** 
  18.  * 是否允許訪問WebView內部檔案,預設true 
  19.  */
  20. setAllowFileAccess(boolean allow)  
  21. /** 
  22.  * 是否允許獲取WebView的內容URL ,可以讓WebView訪問ContentPrivider儲存的內容。 預設true 
  23.  */
  24. setAllowContentAccess(boolean allow)  
  25. /** 
  26.  * 是否啟動概述模式瀏覽介面,當頁面寬度超過WebView顯示寬度時,縮小頁面適應WebView。預設false 
  27.  */
  28. setLoadWithOverviewMode(boolean overview)  
  29. /** 
  30.  * 是否儲存表單資料,預設false 
  31.  */
  32. setSaveFormData(boolean save)  
  33. /** 
  34.  * 設定頁面文字縮放百分比,預設100% 
  35.  */
  36. setTextZoom(int textZoom)  
  37. /** 
  38.  * 是否支援ViewPort的meta tag屬性,如果頁面有ViewPort meta tag 指定的寬度,則使用meta tag指定的值,否則預設使用寬屏的檢視視窗 
  39.  */
  40. setUseWideViewPort(boolean use)  
  41. /** 
  42.  * 是否支援多視窗,如果設定為true ,WebChromeClient#onCreateWindow方法必須被主程式實現,預設false 
  43.  */
  44. setSupportMultipleWindows(boolean support)  
  45. /** 
  46.  * 指定WebView的頁面佈局顯示形式,呼叫該方法會引起頁面重繪。預設LayoutAlgorithm#NARROW_COLUMNS 
  47.  */
  48. setLayoutAlgorithm(LayoutAlgorithm l)  
  49. /** 
  50.  * 設定標準的字型族,預設”sans-serif”。font-family 規定元素的字體系列。 
  51.  * font-family 可以把多個字型名稱作為一個“回退”系統來儲存。如果瀏覽器不支援第一個字型, 
  52.  * 則會嘗試下一個。也就是說,font-family 屬性的值是用於某個元素的字型族名稱或/及類族名稱的一個 
  53.  * 優先表。瀏覽器會使用它可識別的第一個值。 
  54.  */
  55. setStandardFontFamily(String font)  
  56. /** 
  57.  * 設定混合字型族。預設”monospace” 
  58.  */
  59. setFixedFontFamily(String font)  
  60. /** 
  61.  * 設定SansSerif字型族。預設”sans-serif” 
  62.  */
  63. setSansSerifFontFamily(String font)  
  64. /** 
  65.  * 設定SerifFont字型族,預設”sans-serif” 
  66.  */
  67. setSerifFontFamily(String font)  
  68. /** 
  69.  * 設定CursiveFont字型族,預設”cursive” 
  70.  */
  71. setCursiveFontFamily(String font)  
  72. /** 
  73.  * 設定FantasyFont字型族,預設”fantasy” 
  74.  */
  75. setFantasyFontFamily(String font)  
  76. /** 
  77.  * 設定最小字型,預設8. 取值區間[1-72],超過範圍,使用其上限值。 
  78.  */
  79. setMinimumFontSize(int size)  
  80. /** 
  81.  * 設定最小邏輯字型,預設8. 取值區間[1-72],超過範圍,使用其上限值。 
  82.  */
  83. setMinimumLogicalFontSize(int size)  
  84. /** 
  85.  * 設定預設字型大小,預設16,取值區間[1-72],超過範圍,使用其上限值。 
  86.  */
  87. setDefaultFontSize(int size)  
  88. /** 
  89.  * 設定預設填充字型大小,預設16,取值區間[1-72],超過範圍,使用其上限值。 
  90.  */
  91. setDefaultFixedFontSize(int size)  
  92. /** 
  93.  * 設定是否載入圖片資源,注意:方法控制所有的資源圖片顯示,包括嵌入的本地圖片資源。 
  94.  * 使用方法setBlockNetworkImage則只限制網路資源圖片的顯示。值設定為true後, 
  95.  * webview會自動載入網路圖片。預設true 
  96.  */
  97. setLoadsImagesAutomatically(boolean flag)  
  98. /** 
  99.  * 是否載入網路圖片資源。注意如果getLoadsImagesAutomatically返回false,則該方法沒有效果。 
  100.  * 如果使用setBlockNetworkLoads設定為false,該方法設定為false,也不會顯示網路圖片。 
  101.  * 當值從true改為false時。WebView會自動載入網路圖片。 
  102.  */
  103. setBlockNetworkImage(boolean flag)  
  104. /** 
  105.  * 設定是否載入網路資源。注意如果值從true切換為false後,WebView不會自動載入, 
  106.  * 除非呼叫WebView#reload().如果沒有android.Manifest.permission#INTERNET許可權, 
  107.  * 值設為false,則會丟擲java.lang.SecurityException異常。 
  108.  * 預設值:有android.Manifest.permission#INTERNET許可權時為false,其他為true。 
  109.  */
  110. setBlockNetworkLoads(boolean flag)  
  111. /** 
  112.  * 設定是否允許執行JS。 
  113.  */
  114. setJavaScriptEnabled(boolean flag)  
  115. /** 
  116.  * 是否允許Js訪問任何來源的內容。包括訪問file scheme的URLs。考慮到安全性, 
  117.  * 限制Js訪問範圍預設禁用。注意:該方法隻影響file scheme型別的資源,其他型別資源如圖片型別的, 
  118.  * 不會受到影響。ICE_CREAM_SANDWICH_MR1版本以及以下預設為true,JELLY_BEAN版本 
  119.  * 以上預設為false 
  120.  */
  121. setAllowUniversalAccessFromFileURLs(boolean flag)  
  122. /** 
  123.  * 是否允許Js訪問其他file scheme的URLs。包括訪問file scheme的資源。考慮到安全性, 
  124.  * 限制Js訪問範圍預設禁用。注意:該方法隻影響file scheme型別的資源,其他型別資源如圖片型別的, 
  125.  * 不會受到影響。如果getAllowUniversalAccessFromFileURLs為true,則該方法被忽略。 
  126.  * ICE_CREAM_SANDWICH_MR1版本以及以下預設為true,JELLY_BEAN版本以上預設為false 
  127.  */
  128. setAllowFileAccessFromFileURLs(boolean flag)  
  129. /** 
  130.  * 設定儲存定位資料庫的位置,考慮到位置許可權和持久化Cache快取,Application需要擁有指定路徑的 
  131.  * write許可權 
  132.  */
  133. setGeolocationDatabasePath(String databasePath)  
  134. /** 
  135.  * 是否允許Cache,預設false。考慮需要儲存快取,應該為快取指定儲存路徑setAppCachePath 
  136.  */
  137. setAppCacheEnabled(boolean flag)  
  138. /** 
  139.  * 設定Cache API快取路徑。為了保證可以訪問Cache,Application需要擁有指定路徑的write許可權。 
  140.  * 該方法應該只調用一次,多次呼叫自動忽略。 
  141.  */
  142. setAppCachePath(String appCachePath)  
  143. /** 
  144.  * 是否允許資料庫儲存。預設false。檢視setDatabasePath API 如何正確設定資料庫儲存。 
  145.  * 該設定擁有全域性特性,同一程序所有WebView例項共用同一配置。注意:保證在同一程序的任一WebView 
  146.  * 載入頁面之前修改該屬性,因為在這之後設定WebView可能會忽略該配置 
  147.  */
  148. setDatabaseEnabled(boolean flag)  
  149. /** 
  150.  * 是否儲存頁面DOM結構,預設false。 
  151.  */
  152. setDomStorageEnabled(boolean flag)  
  153. /** 
  154.  * 是否允許定位,預設true。注意:為了保證定位可以使用,要保證以下幾點: 
  155.  * Application 需要有android.Manifest.permission#ACCESS_COARSE_LOCATION的許可權 
  156.  * Application 需要實現WebChromeClient#onGeolocationPermissionsShowPrompt的回撥, 
  157.  * 接收Js定位請求訪問地理位置的通知 
  158.  */
  159. setGeolocationEnabled(boolean flag)  
  160. /** 
  161.  * 是否允許JS自動開啟視窗。預設false 
  162.  */
  163. setJavaScriptCanOpenWindowsAutomatically(boolean flag)  
  164. /** 
  165.  * 設定頁面的編碼格式,預設UTF-8 
  166.  */
  167. setDefaultTextEncodingName(String encoding)  
  168. /** 
  169.  * 設定WebView代理,預設使用預設值 
  170.  */
  171. setUserAgentString(String ua)  
  172. /** 
  173.  * 通知WebView是否需要設定一個節點獲取焦點當 
  174.  * WebView#requestFocus(int,android.graphics.Rect)被呼叫的時候,預設true 
  175.  */
  176. setNeedInitialFocus(boolean flag)  
  177. /** 
  178.  * 基於WebView導航的型別使用快取:正常頁面載入會載入快取並按需判斷內容是否需要重新驗證。 
  179.  * 如果是頁面返回,頁面內容不會重新載入,直接從快取中恢復。setCacheMode允許客戶端根據指定的模式來 
  180.  * 使用快取。 
  181.  * LOAD_DEFAULT 預設載入方式 
  182.  * LOAD_CACHE_ELSE_NETWORK 按網路情況使用快取 
  183.  * LOAD_NO_CACHE 不使用快取 
  184.  * LOAD_CACHE_ONLY 只使用快取 
  185.  */
  186. setCacheMode(int mode)  
  187. /** 
  188.  * 設定載入不安全資源的WebView載入行為。KITKAT版本以及以下預設為MIXED_CONTENT_ALWAYS_ALLOW方 
  189.  * 式,LOLLIPOP預設MIXED_CONTENT_NEVER_ALLOW。強烈建議:使用MIXED_CONTENT_NEVER_ALLOW 
  190.  */
  191. setMixedContentMode(int mode)  
/**
 * 是否支援縮放,配合方法setBuiltInZoomControls使用,預設true
 */
setSupportZoom(boolean support)

/**
 * 是否需要使用者手勢來播放Media,預設true
 */
setMediaPlaybackRequiresUserGesture(boolean require)

/**
 * 是否使用WebView內建的縮放元件,由浮動在視窗上的縮放控制和手勢縮放控制組成,預設false
 */
setBuiltInZoomControls(boolean enabled)

/**
 * 是否顯示視窗懸浮的縮放控制,預設true
 */
setDisplayZoomControls(boolean enabled)

/**
 * 是否允許訪問WebView內部檔案,預設true
 */
setAllowFileAccess(boolean allow)

/**
 * 是否允許獲取WebView的內容URL ,可以讓WebView訪問ContentPrivider儲存的內容。 預設true
 */
setAllowContentAccess(boolean allow)

/**
 * 是否啟動概述模式瀏覽介面,當頁面寬度超過WebView顯示寬度時,縮小頁面適應WebView。預設false
 */
setLoadWithOverviewMode(boolean overview)

/**
 * 是否儲存表單資料,預設false
 */
setSaveFormData(boolean save)

/**
 * 設定頁面文字縮放百分比,預設100%
 */
setTextZoom(int textZoom)

/**
 * 是否支援ViewPort的meta tag屬性,如果頁面有ViewPort meta tag 指定的寬度,則使用meta tag指定的值,否則預設使用寬屏的檢視視窗
 */
setUseWideViewPort(boolean use)


/**
 * 是否支援多視窗,如果設定為true ,WebChromeClient#onCreateWindow方法必須被主程式實現,預設false
 */
setSupportMultipleWindows(boolean support)

/**
 * 指定WebView的頁面佈局顯示形式,呼叫該方法會引起頁面重繪。預設LayoutAlgorithm#NARROW_COLUMNS
 */
setLayoutAlgorithm(LayoutAlgorithm l)

/**
 * 設定標準的字型族,預設”sans-serif”。font-family 規定元素的字體系列。
 * font-family 可以把多個字型名稱作為一個“回退”系統來儲存。如果瀏覽器不支援第一個字型,
 * 則會嘗試下一個。也就是說,font-family 屬性的值是用於某個元素的字型族名稱或/及類族名稱的一個
 * 優先表。瀏覽器會使用它可識別的第一個值。
 */
setStandardFontFamily(String font)

/**
 * 設定混合字型族。預設”monospace”
 */
setFixedFontFamily(String font)

/**
 * 設定SansSerif字型族。預設”sans-serif”
 */
setSansSerifFontFamily(String font)

/**
 * 設定SerifFont字型族,預設”sans-serif”
 */
setSerifFontFamily(String font)

/**
 * 設定CursiveFont字型族,預設”cursive”
 */
setCursiveFontFamily(String font)

/**
 * 設定FantasyFont字型族,預設”fantasy”
 */
setFantasyFontFamily(String font)

/**
 * 設定最小字型,預設8. 取值區間[1-72],超過範圍,使用其上限值。
 */
setMinimumFontSize(int size)

/**
 * 設定最小邏輯字型,預設8. 取值區間[1-72],超過範圍,使用其上限值。
 */
setMinimumLogicalFontSize(int size)

/**
 * 設定預設字型大小,預設16,取值區間[1-72],超過範圍,使用其上限值。
 */
setDefaultFontSize(int size)

/**
 * 設定預設填充字型大小,預設16,取值區間[1-72],超過範圍,使用其上限值。
 */
setDefaultFixedFontSize(int size)

/**
 * 設定是否載入圖片資源,注意:方法控制所有的資源圖片顯示,包括嵌入的本地圖片資源。
 * 使用方法setBlockNetworkImage則只限制網路資源圖片的顯示。值設定為true後,
 * webview會自動載入網路圖片。預設true
 */
setLoadsImagesAutomatically(boolean flag)

/**
 * 是否載入網路圖片資源。注意如果getLoadsImagesAutomatically返回false,則該方法沒有效果。
 * 如果使用setBlockNetworkLoads設定為false,該方法設定為false,也不會顯示網路圖片。
 * 當值從true改為false時。WebView會自動載入網路圖片。
 */
setBlockNetworkImage(boolean flag)

/**
 * 設定是否載入網路資源。注意如果值從true切換為false後,WebView不會自動載入,
 * 除非呼叫WebView#reload().如果沒有android.Manifest.permission#INTERNET許可權,
 * 值設為false,則會丟擲java.lang.SecurityException異常。
 * 預設值:有android.Manifest.permission#INTERNET許可權時為false,其他為true。
 */
setBlockNetworkLoads(boolean flag)

/**
 * 設定是否允許執行JS。
 */
setJavaScriptEnabled(boolean flag)

/**
 * 是否允許Js訪問任何來源的內容。包括訪問file scheme的URLs。考慮到安全性,
 * 限制Js訪問範圍預設禁用。注意:該方法隻影響file scheme型別的資源,其他型別資源如圖片型別的,
 * 不會受到影響。ICE_CREAM_SANDWICH_MR1版本以及以下預設為true,JELLY_BEAN版本
 * 以上預設為false
 */
setAllowUniversalAccessFromFileURLs(boolean flag)


/**
 * 是否允許Js訪問其他file scheme的URLs。包括訪問file scheme的資源。考慮到安全性,
 * 限制Js訪問範圍預設禁用。注意:該方法隻影響file scheme型別的資源,其他型別資源如圖片型別的,
 * 不會受到影響。如果getAllowUniversalAccessFromFileURLs為true,則該方法被忽略。
 * ICE_CREAM_SANDWICH_MR1版本以及以下預設為true,JELLY_BEAN版本以上預設為false
 */
setAllowFileAccessFromFileURLs(boolean flag)

/**
 * 設定儲存定位資料庫的位置,考慮到位置許可權和持久化Cache快取,Application需要擁有指定路徑的
 * write許可權
 */
setGeolocationDatabasePath(String databasePath)

/**
 * 是否允許Cache,預設false。考慮需要儲存快取,應該為快取指定儲存路徑setAppCachePath
 */
setAppCacheEnabled(boolean flag)

/**
 * 設定Cache API快取路徑。為了保證可以訪問Cache,Application需要擁有指定路徑的write許可權。
 * 該方法應該只調用一次,多次呼叫自動忽略。
 */
setAppCachePath(String appCachePath)

/**
 * 是否允許資料庫儲存。預設false。檢視setDatabasePath API 如何正確設定資料庫儲存。
 * 該設定擁有全域性特性,同一程序所有WebView例項共用同一配置。注意:保證在同一程序的任一WebView
 * 載入頁面之前修改該屬性,因為在這之後設定WebView可能會忽略該配置
 */
setDatabaseEnabled(boolean flag)

/**
 * 是否儲存頁面DOM結構,預設false。
 */
setDomStorageEnabled(boolean flag)

/**
 * 是否允許定位,預設true。注意:為了保證定位可以使用,要保證以下幾點:
 * Application 需要有android.Manifest.permission#ACCESS_COARSE_LOCATION的許可權
 * Application 需要實現WebChromeClient#onGeolocationPermissionsShowPrompt的回撥,
 * 接收Js定位請求訪問地理位置的通知
 */
setGeolocationEnabled(boolean flag)

/**
 * 是否允許JS自動開啟視窗。預設false
 */
setJavaScriptCanOpenWindowsAutomatically(boolean flag)

/**
 * 設定頁面的編碼格式,預設UTF-8
 */
setDefaultTextEncodingName(String encoding)

/**
 * 設定WebView代理,預設使用預設值
 */
setUserAgentString(String ua)

/**
 * 通知WebView是否需要設定一個節點獲取焦點當
 * WebView#requestFocus(int,android.graphics.Rect)被呼叫的時候,預設true
 */
setNeedInitialFocus(boolean flag)

/**
 * 基於WebView導航的型別使用快取:正常頁面載入會載入快取並按需判斷內容是否需要重新驗證。
 * 如果是頁面返回,頁面內容不會重新載入,直接從快取中恢復。setCacheMode允許客戶端根據指定的模式來
 * 使用快取。
 * LOAD_DEFAULT 預設載入方式
 * LOAD_CACHE_ELSE_NETWORK 按網路情況使用快取
 * LOAD_NO_CACHE 不使用快取
 * LOAD_CACHE_ONLY 只使用快取
 */
setCacheMode(int mode)

/**
 * 設定載入不安全資源的WebView載入行為。KITKAT版本以及以下預設為MIXED_CONTENT_ALWAYS_ALLOW方
 * 式,LOLLIPOP預設MIXED_CONTENT_NEVER_ALLOW。強烈建議:使用MIXED_CONTENT_NEVER_ALLOW
 */
setMixedContentMode(int mode)
下面我們就舉個例子來看下用法

示例1:在WebView中啟用JavaScript:

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. publicclass MyActivity extends Activity {  
  2.     private WebView mWebView;  
  3.     private Button mBtn;  
  4.     @Override
  5.     publicvoid onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.         mWebView = (WebView) findViewById(R.id.webview);  
  9.         mBtn = (Button) findViewById(R.id.btn);  
  10.         WebSettings webSettings = mWebView.getSettings();  
  11.         webSettings.setJavaScriptEnabled(true);  
  12.     }  
  13. }  
public class MyActivity extends Activity {

    private WebView mWebView;
    private Button mBtn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mWebView = (WebView) findViewById(R.id.webview);
        mBtn = (Button) findViewById(R.id.btn);

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
    }
}

示例2:設定快取

優先使用快取
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  
webView.getSettings().se