Android深入講解WebView——下

摘要

本文原創,轉載請註明地址:http://kymjs.com/code/2015/05/04/01
作爲Android開發者,我們都知道在手機中內置了一款高性能 webkit 內核瀏覽器,在 SDK 中封裝爲一個叫做 WebView 組件。今天就爲大家講講Android中WebView的詳細使用方法

判斷 WebView 是否已經滾動到頁面底端

在View中有一個getScrollY()方法,可以返回當前可見區域的頂端距整個頁面頂端的距離,也就是當前內容滾動的距離。
還有getHeight()或者 getBottom()方法都返回當前 View 這個容器的高度
在ViewView中還有getContentHeight() 方法可以返回整個 html 頁面的高度,但並不等同於當前整個頁面的高度 ,因爲 WebView 有縮放功能。你可以通過如下代碼來啓動或關閉webview的縮放功能。

mWebView.getSettings().setSupportZoom(true);
mWebView.getSettings().setBuiltInZoomControls(true);

所以當前整個頁面的高度實際上應該是原始 html 的高度再乘上縮放比例. 因此,更正後的結果 ,準確的判斷方法應該是:

// 如果已經處於底端
if(WebView.getContentHeight*WebView.getScale() -(webvi ew.getHeight()+WebView.getScrollY())){ 
  //XXX
}

WebView獲取服務器中的 session 問題

接下來我們講如下兩個問題:
1、Android 中的 WebView 如何獲取服務器頁面的 jsessionid 的值
2、Android 的 WebView 又是如何把得到的 jsessionid 的值在 set 到服務器中,一致達到他們在同一個 jsessionid 的回話中.
其實非常非常簡單,只不過是幾個方法罷了:

CookieManager cm = CookieManager.getInstance(); 
cm.removeAllCookie();
cm.getCookie(url);
cm.setCookie(url, cookie);

另外還有個 CookieSyncManager,也許你會在一些舊的項目中看到它。從名字來理解,它實際上應該是一個異步緩存器。不過我們看到這個方法已經被標記爲過時了,查看源碼可以看到過時原因是現在WebView已經是自動的異步緩存了,所以這個類已經沒有存在的意義了。 CookieSyncManager

WebView清除本地cookies

首先,要清除肯定要會添加,這裏給大家提供一個工具方法:

/***
     * 如果用戶已經登錄,則同步本地的cookie到webview中
     */
    public void synCookies() {
        if (!CacheUtils.isLogin(this)) return;
        CookieSyncManager.createInstance(this);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        cookieManager.removeSessionCookie();//移除
        String cookies = PreferenceHelper.readString(this, AppConfig.COOKIE_KEY, AppConfig.COOKIE_KEY);
        KJLoger.debug(cookies);
        cookieManager.setCookie(url, cookies);
        CookieSyncManager.getInstance().sync();
    }

在使用網頁版淘寶或百度登錄時,WebView會自動登錄上次的帳號!(因爲WebView 記錄了帳號和密碼的cookies) 所以,需要清除 SessionCookie也是有必要的。
那麼CookieManager同樣也爲我們提供了清除cookie的方法 
CookieManager.getInstance().removeSessionCookie();

這裏順便說一下WebView本身也是會記錄html緩存的,上一篇博客中我講了一種通過文件操作去清理緩存的方法,後來我又發現,其實webview本身就提供了清理緩存的方法,其中參數true是指是否包括磁盤文件也一併清除,傳true就和我們昨天的講的效果是一樣的了:

webview.clearCache(true);
webview.clearHistory();

講一個案例

講了這麼多的理論知識,最後講一個使用案例。WebView在實際使用中可以分爲兩種使用方法,第一種就是類似於QQ微信那種,使用loadUrl直接去顯示一個鏈接,這種方式太簡單了,傳一個url就行,我就不多說了。
那麼需要詳細講的是第二種,類似的實現大家可以看看開源中國客戶端,網易新聞客戶端,愛看博客,等客戶端的實現方式,它們實際上也是通過webview來顯示的一個網頁內容,但是並不是單純的loadurl,而是以字符串的形式去加載一個已經獲取到了的html源代碼。這樣做的好處在於顯示的頁面可以完全的根據自己喜好來定義,比如我想在末尾添加一張圖片,那麼簡單,在這個html字符串的末尾插入一個img標籤就可了。至於使用方法,其實我們在上一篇博客的時候有提到過:

myWebView.loadData(htmlText,”text/html”, “utf-8”);

其中htmltext就是我們需要加載的html字符串,使用這個方法可以直接將這個字符串作爲網頁來顯示。
最後總結一下兩種方法的適用場景,前一種載入鏈接的方法適合一個界面(Activity或Fragment)只有一個WebView或者說WebView佔很大一塊的時候,同時我們要顯示的內容是未知的,那麼自然是使用loadurl方法更合適,例如QQ聊天的時候對方發送一條鏈接,當QQ解析出這個文本是一個網址時就通過webview去加載它。而後一種則適合於定製化內容,一般是那種你可以明確的制度網頁內容以及要顯示的內容時使用,至於好處就是上面說的,定製性要好很多。

相關解答

關於上一篇博客,有朋友問我如何實現web調用手機攝像頭。很遺憾我不是做web的,對這塊不是很懂。不過我建議你看一下開源中國的html5手機版的發佈動彈那裏,點擊選擇文件以後,會自動彈出相機選項,不知道可以可行。http://m.oschina.net/my/new-tweet
osc


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章