Android之WebView使用總結

來源:互聯網
上載者:User

標籤:

前言:

     今天修改項目中一個有關WebView使用的bug,激起了我總結WebView的動機,今天抽空做個總結。

使用情境: 1.)添加許可權
<uses-permission android:name="android.permission.INTERNET" />  
 2.)布局檔案
 <WebView   android:id="@+id/webView"   android:layout_width="match_parent"   android:layout_height="match_parent" />
 3.)資料載入

 載入本地資源

webView.loadUrl("file:///android_asset/example.html");

 載入網路資源

webView.loadUrl("www.xxx.com/index.html");

 添加要求標頭資訊

Map<String,String> map=new HashMap<String,String>();
map.put("User-Agent","Android");webView.loadUrl("www.xxx.com/index.html",map);

也可以載入html片段

 String data = " Html 資料"; webView.loadData(data, "text/html", "utf-8");

實測會發現loadData會導致中文亂碼,所以一般情況使用如下代碼

String data = " Html 資料";webView.loadDataWithBaseURL(null,data, "text/html", "utf-8",null);
4.)支援JavaScript

     比如項目總js觸發一個native函數關閉Activity

    設定支援JavaScript

 WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true);//設定支援javascript webView.addJavascriptInterface(new JavaScriptInterface(), "xueleapp");
 JavaScriptInterface 介面定義
    public class JavaScriptInterface {        @android.webkit.JavascriptInterface        public void doTrainFinish() {           finish();        }    }
5.)設定WebViewClient 主要輔助WebView處理各種通知、請求事件

比如要實現WebView中連結在WebView內部跳轉 

   webView.setWebViewClient(new WebViewClient() {            public boolean shouldOverrideUrlLoading(WebView view, String url) {                view.loadUrl(url);                return true;            }        });

除此之外WebViewClient更多的處理網頁的地址的解析和渲染,例如

      onLoadResource//載入資源時響應
  onPageStart//在載入頁面時響應
  onPageFinish//在載入頁面結束時響應
  onReceiveError//在載入出錯時響應
  onReceivedHttpAuthRequest//擷取返回資訊授權請求

  6.)設定WebChromeClient主要輔助WebView處理Javascript的對話方塊,網站表徵圖,網站title,載入進度等

   比如載入進度擷取title

        webView.setWebChromeClient(new WebChromeClient() {            @Override            public void onProgressChanged(WebView view, int newProgress) {                if (newProgress == 100) {                    //網頁載入完成                } else {                    //網頁載入中                }            }        });

除了上面檢測進度之外還有

  onCloseWindow//關閉WebView
  onCreateWindow() //觸發建立一個新的視窗
  onJsAlert //觸發彈出一個對話方塊
  onJsPrompt //觸發彈出一個提示
  onJsConfirm//觸發彈出確認提示
  onProgressChanged //載入進度
  onReceivedIcon //擷取網頁icon
  onReceivedTitle//擷取網頁title

 7.)設定網頁棧返回

    webview會預設把瀏覽過去的網頁進行壓棧儲存,所以我們有時需要實現回退到上一目錄

    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_BACK) {            if (webView.canGoBack()) {                webView.goBack();//返回上一瀏覽頁面                return true;            } else {                finish();//關閉Activity            }        }        return super.onKeyDown(keyCode, event);    }
8.)WebView 緩衝控制
  • 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,都使用緩衝中的資料。
WebSettings webSettings = webView.getSettings();webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  
9.)WebView螢幕自適應
 WebSettings webSettings = webView.getSettings(); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true);
 10.)其他不常用設定
  WebSettings webSettings = webView.getSettings();  webSettings.setSupportZoom(true);  //支援縮放  webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支援內容重新布局  webSettings.supportMultipleWindows();  //多視窗  webSettings.setAllowFileAccess(true);  //設定可以訪問檔案  webSettings.setNeedInitialFocus(true); //當webview調用requestFocus時為webview設定節點  webSettings.setBuiltInZoomControls(true); //設定支援縮放  webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支援通過JS開啟新視窗  webSettings.setLoadsImagesAutomatically(true);  //支援自動載入圖片
11.)知識擴充WebViewJSBridge

雖然Google也提供了js與native函數互相調用的方式,但是通過addjavascriptInterface這種方式在Android 4.2以下版本存在一定的安全隱患,在Android 4.2以上也需要加@JavascriptInterface註解,否則無法調用。基於上面的原因建議學習一下

WebViewJSBridge這個比較不錯的開源架構,地址:https://github.com/firewolf-ljw/WebViewJSBridge

12.)硬體加速

 開啟硬體加速強制使用GPU渲染,確實給app流暢度帶來不小的提升,但是在使用過程中遇見webview閃爍,也有導致載入webView黑屏或者白屏

解決辦法:關閉硬體加速

 webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

 這是把webview 中的硬體加速關閉。設定LAYER_TYPE_SOFTWARE後會把當前view轉為bitmap儲存。這樣就不能開多個webview,否則會報out of memory。

需要在在webview中加入如下代碼

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        invalidate();        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }

  

Android之WebView使用總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.