webview使用的總結<一>

我們在native與網頁相結合開發的過程中,如何使用WebView是一個很重要的事,我們也經常會碰到一些通用的問題,下面從配置開始
1.WebSettings用於管理WebView狀態配置,當WebView第一次被創建時,WebView包含着一個默認的配置,這些默認的配置將通過get方法返回,通過WebView中的getSettings方法獲得一個WebSettings對象,如果一個WebView被銷燬,在WebSettings中所有回調方法將拋出IllegalStateException異常。
以下是我經常用到的一些配置
        WebSettings settings = mWebView.getSettings();
        settings.setDefaultTextEncodingName("UTF-8");
        settings.setJavaScriptEnabled(true);//啓用js
        settings.setDomStorageEnabled(true);//設置可以使用localStorage
        settings.setRenderPriority(WebSettings.RenderPriority.HIGH);//提高渲染的優先級
        // 判斷是否有網絡,有的話,使用LOAD_DEFAULT,無網絡時,使用LOAD_CACHE_ELSE_NETWORK
        if (NetUtils.checkNetworkAvailable(BaseWebViewActivity.this)) {
            settings.setCacheMode(WebSettings.LOAD_DEFAULT);
        }else {
            settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        }

        settings.setJavaScriptCanOpenWindowsAutomatically(true);//js和android交互
        String dir = BaseWebViewActivity.this.getDir("cache", Context.MODE_PRIVATE).getPath();
        settings.setAppCachePath(dir); //設置緩存的指定路徑
        settings.setAllowFileAccess(true); // 允許訪問文件
        settings.setAppCacheEnabled(true); //設置H5的緩存打開,默認關閉
        settings.setUseWideViewPort(true);//設置webview自適應屏幕大小
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);//設置,可能的話使所有列的寬度不超過屏幕寬度
        settings.setLoadWithOverviewMode(true);//設置webview自適應屏幕大小
        settings.setSupportZoom(false);//關閉zoom按鈕
        settings.setBuiltInZoomControls(false);//關閉zoom
        settings.setAppCacheMaxSize(1024 * 1024 * 8);
        // WebView是否保存表單數據,默認true,保存數據。
        settings.setSaveFormData(false);
        // 啓用數據庫
//        settings.setDatabaseEnabled(true);
//        String datadir = BaseWebViewActivity.this.getDir("database", Context.MODE_PRIVATE).getPath();
//        settings.setDatabasePath(datadir);

        //設置WebView代理字符串,如果String爲null或爲空,將使用系統默認值
        settings.setUserAgentString(settings.getUserAgentString() + " android_webview android_native_navbar version2");
        WebViewJavaScriptInterface webViewJavaScriptInterface = new WebViewJavaScriptInterface(BaseWebViewActivity.this,mWebView,mHandler);
        mWebView.addJavascriptInterface(webViewJavaScriptInterface, "JSInterface");

//設置debug模式
        if (Zlog.isDebug) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                WebView.setWebContentsDebuggingEnabled(true);
            }
        }

[詳細請參考http://teachcourse.cn/android-webview-websettings] (http://teachcourse.cn/android-webview-websettings)
2.設置WebViewClient和WebChromeClient
(1)shouldOverrideUrlLoading 返回true和false的區別
默認返回:return super.shouldOverrideUrlLoading(view, url); 這個返回的方法會調用父類方法,也就是跳轉至手機瀏覽器,平時寫webview一般都在方法裏面寫 webView.loadUrl(url); 然後把這個返回值改成下面的false。
返回: return true; webview處理url是根據程序來執行的。
返回: return false; webview處理url是在webview內部執行。
(2)如果我們要支持Alert彈窗,需要實現WebChromeClient當中的一些方法,WebChromeClient中的一些重要方法如下:

onCloseWindow(關閉WebView)
onCreateWindow()
onJsAlert (WebView上alert是彈不出來東西的,需要定製你的WebChromeClient處理彈出)
onJsPrompt()
onJsConfirm()
onProgressChanged(進度顯示)
onReceivedIcon(網站圖標)
onReceivedTitle(網站標題)

支持Alert彈窗,主要是重寫onJsAlert()方法

(3)錯誤頁面的監控主要在WebViewClient這個類完成,它主要是幫助WebView處理各種通知、請求事件的,具體來說包括:

onLoadResource
onPageStart
onPageFinish
onReceiveError 
onReceivedHttpAuthRequest
shouldInterceptRequest

應用程序WebView即將加載url 制定的資源

 @Override
  public void onLoadResource(WebView view, String url) {
            super.onLoadResource(view, url);
            int i = url.indexOf( ".jpg" );
            Zlog.ii("lxm ss webview onLoadResource:" + i);
//            mEventListener.onWebViewEvent(CustomWebView. this , OnWebViewEventListener.EVENT_ON_LOAD_RESOURCE, url);
            if (url.indexOf( ".jpg" ) > 0 ) {
                if (progressDialog != null && progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }//請求圖片時即顯示頁面
//                mEventListener.onWebViewEvent(CustomWebView. this , OnWebViewEventListener.EVENT_ON_HIDE_PROGRESS, view.getUrl());
            }
        }

自定義404界面等信息,就可以通過重寫onReceiveError()完成
自定義錯誤頁面:可以加載本地的靜態網頁

@Override
public void onReceivedError (WebView view, int errorCode, String description, String failingUrl) {
    super.onReceivedError(view, errorCode, description, failingUrl);
     //loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
     //mErrorFrame.setVisibility(View.VISIBLE);
     view.loadUrl("javascript:document.body.innerHTML=\"" + data + "\"");
     view.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
     view.loadUrl(NetUtils.NETWORK_ERROR_PAGE_URL);
}

用程序內核即將加載url制定的資源,應用程序可以返回本地的資源提供給內核,若本地處理返回數據,內核不從網絡上獲取數據

  @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            WebResourceResponse response = null;
            // 檢查該資源是否已經提前下載完成。我採用的策略是在應用啓動時,用戶在 wifi 的網絡環境下                // 提前下載 H5 頁面需要的資源。
            boolean resDown = JSHelper.isURLDownValid(url);
            if (resDown) {
                jsStr = JsjjJSHelper.getResInputStream(url);
                if (url.endsWith(".png")) {
                    response = getWebResourceResponse(url, "image/png", ".png");
                } else if (url.endsWith(".gif")) {
                    response = getWebResourceResponse(url, "image/gif", ".gif");
                } else if (url.endsWith(".jpg")) {
                    response = getWebResourceResponse(url, "image/jepg", ".jpg");
                } else if (url.endsWith(".jepg")) {
                    response = getWebResourceResponse(url, "image/jepg", ".jepg");
                } else if (url.endsWith(".js") && jsStr != null) {
                    response = getWebResourceResponse("text/javascript", "UTF-8", ".js");
                } else if (url.endsWith(".css") && jsStr != null) {
                    response = getWebResourceResponse("text/css", "UTF-8", ".css");
                } else if (url.endsWith(".html") && jsStr != null) {
                    response = getWebResourceResponse("text/html", "UTF-8", ".html");
                }
            }
            // 若 response 返回爲 null , WebView 會自行請求網絡加載資源。
            return response;
//            return super.shouldInterceptRequest(view, request);
        }

3.WebView的常用方法

方法 描述
void goBack() 後退。
void goForward() 前進。
void loadUrl(String url) 加載指定URL對應的網頁。
void loadUrl(String url, Map additionalHttpHeaders) 用額外的HTTP頭加載指定的URL對應的網頁。
boolean zoomIn() 放大網頁。
boolean zoomOut() 縮小網頁。
void addJavascriptInterface(Object object, String name) 將Java對象置入WebView中。
void clearCache(boolean includeDiskFiles) 清空緩存。
void clearHistory() 清空訪問歷史。
Bitmap getFavicon() 獲取當前網頁的favicon圖標。
String getOriginalUrl() 獲得當前網頁的URL。
String getUrl() 獲得當前網頁的URL。
int getProgress() 獲得當前網頁的顯示進度。
String getTitle() 獲得當前網頁的Title。
boolean pageDown(boolean bottom) 向下滾動視圖大小的一半。
boolean pageUp(boolean top) 向上滾動視圖大小的一半。
void reload() 重新加載當前網頁。
void zoomBy(float zoomFactor) 指定網頁縮放大小。
void requestFocus() 是頁面獲得焦點。

更詳細的WebView API可查看官方文檔:http://developer.android.com/reference/android/webkit/WebView.html

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