一、基本介紹 WebView是一個顯示頁面的組件。 二、基本使用 訪問網頁需要網路,所以在AndroidManifest.xml文件中添加網路許可權。 可以使用Intent跳轉網頁,使用如下: 使用Intent跳轉網頁,會調用本地的瀏覽器來查看網頁信息。 在onCreate()方法中將contentV ...
一、基本介紹
WebView是一個顯示頁面的組件。
二、基本使用
訪問網頁需要網路,所以在AndroidManifest.xml文件中添加網路許可權。
<uses-permission android:name="android.permission.INTERNET" />
可以使用Intent跳轉網頁,使用如下:
Uri uri = Uri.parse("http://www.baidu.com"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);
使用Intent跳轉網頁,會調用本地的瀏覽器來查看網頁信息。
在onCreate()方法中將contentView設置為webView,方法如下:
WebView webView = new WebView(this); setContentView(webView); loadUrl("http://www.baidu.com");
這種方法,整個界面都是網頁內容。
還有一種就是將webView作為整個界面的一個組件,在activity_main中添加WebView組件,如下:
<WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent" />
在MainActivity.java中使用WebView,代碼如下:
webView = (WebView) findViewById(R.id.web_view);
webView.loadUrl("http://www.baidu.com");
三、設置支持JavaScript
如果網頁中使用了JavaScript,不設置支持JavaScript的話,網頁不能正常的顯示,如果當網頁中使用了JavaScript,需要設置支持JavaScript。
//啟動支持javascript webView.getSettings().setJavaScriptEnabled(true);
四、點擊返回鍵時希望瀏覽的網頁後退而不是退出瀏覽器
當希望點擊返回鍵之後瀏覽的網頁回退一頁,而不是直接退出瀏覽器,就需要重寫onKeyDown函數,調用WebView的geBack()方法來回退一頁。
//改寫返回鍵的邏輯 //希望點擊回退鍵網頁回退也不是退出瀏覽器 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (webView.canGoBack()) { webView.goBack();//返回上一個頁面 return true; } else { System.exit(0);//退出程式 } } return super.onKeyDown(keyCode, event); }
五、判斷頁面載入過程
設置WebView的WebChromeClient()方法來判斷頁面的載入情況。當瀏覽器的UI發生改變時,比如,進度更新和JavaScript警報都會發送到WebChromeClient類中。也可以攔截URL載入在這個(使用shouldoverrideurlloading()方法)。
//網頁載入過程 webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { Toast.makeText(MainActivity.this, "newProgress = " + newProgress, Toast.LENGTH_SHORT).show(); if (newProgress == 100) { //網頁載入成功 //Toast.makeText(MainActivity.this,"網頁載入成功",Toast.LENGTH_SHORT).show(); } else { //Toast.makeText(MainActivity.this,"網頁載入失敗",Toast.LENGTH_SHORT).show(); } } });
但是當進入時,newProgress等於10的時候,網頁已經顯示出來,使用這個方法來判斷載入情況,個人感覺不是很可靠。
六、頁面緩存
WebView的緩存類型有兩種:
第一種:瀏覽器自帶的網頁數據緩存。
瀏覽器緩存機制是通過HTTP協議Header里的Cache-Control(或Expires)和Last-Modified(或 Etag)等欄位來控制文件緩存的機制。
接收響應時,根據Cache-Control(或Expires)瀏覽器決定文件是否需要被緩存,或者需要載入文件時,瀏覽器決定是否需要發出請求的欄位。
發起請求時,根據Last-Modified(或 Etag)伺服器決定文件是否需要更新的欄位。
通過設置WebView的Cache Mode,從而使得協議生效或者無效。
WebView的Cache Mode:
LOAD_CACHE_ONLY:不使用網路,只讀取本地緩存數據。
LOAD_DEFAULT:根據cache-control決定是否從網路上取數據。
LOAD_CACHE_NORMAL:API level 17中已經廢棄,從API level 11開始作用同LOAD_DEFAULT模式。
LOAD_NO_CACHE: 不使用緩存,只從網路獲取數據。
LOAD_CACHE_ELSE_NETWORK,只要本地有,無論是否過期,或者no-cache,都使用緩存中的數據。本地沒有緩存時才從網路上獲取。
WebView緩存使用:
//設置webView的緩存模式為:根據cache-control決定是否從網路上取數據 webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
第二種:H5的緩存
寫Web頁面代碼是,指定manifest屬性即可讓頁面使用App Cache。
AppCache工作的原理:當一個設置了manifest文件的html頁面被載入時,CACHE MANIFEST指定的文件就會被緩存到瀏覽器的App Cache目錄下麵。當下次載入這個頁面時,會首先通過manifest已經緩存過的文件,然後發起一個載入xxx.appcache文件的請求到伺服器,如果xxx.appcache文件沒有被修改過,那麼伺服器會返回304 Not Modified
給到瀏覽器,如果xxx.appcache文件被修改過,那麼伺服器會返回200 OK
,並返回新的xxx.appcache文件的內容給瀏覽器,瀏覽器收到之後,再把新的xxx.appcache文件中指定的內容載入過來進行緩存。
WebView支持AppCache:
//支持AppCache WebSettings webSettings = webView.getSettings(); webSettings.setAppCacheEnabled(true); String cachePath = getApplicationContext().getCacheDir().getPath(); webSettings.setAppCachePath(cachePath);
兩種方法的差異:
相同點
WebView自帶的緩存和AppCache都是可以用來做文件級別的緩存的,基本上比較好地滿足對於非覆蓋式的js、css等文件更新。
不同點
WebView自帶的緩存是是協議層實現的(瀏覽器內核標準實現,開發者無法改變);而AppCache是應用層實現的。
WebView的緩存目錄在不同系統上可能是不同的;而對於AppCache而言,AppCache的存儲路徑雖然有方法設置,但是最終都存儲到了一個固定的內部私有目錄下。
WebView自帶的緩存可以在緩存生效的時候不用再發HTTP請求;而AppCache一定會發出一個manifest文件的請求。
WebView自帶的緩存可以通過設置CacheMode來改變WebView的緩存機制;而AppCache的緩存策略是由manifest文件控制的,也就是說是由web頁面開發者控制的。
很多時候,這兩類緩存是共同在工作的,當manifest文件沒有控制某些資源載入時,這些資源就會走到WebView自帶的緩存機制去,結合WebView的CacheMode。
完整代碼地址:https://github.com/ZhangMiao147/WebViewCacheDemo
參考文章:http://cs.szpt.edu.cn/android/reference/android/webkit/WebView.html
http://unclechen.github.io/2017/05/13/WebView%E7%BC%93%E5%AD%98%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90%E5%92%8C%E5%BA%94%E7%94%A8/