Android WebView 開發教程

來源:互聯網
上載者:User

標籤:接收   linear   執行個體   sdn   rri   html5   過濾   started   enabled   

1.WebView的使用

(a). 建立WebView的執行個體加入到Activity中

WebView webview = new WebView(this);  setContentView(webview);  

或者在xml中配置WebView

<Webview      android:layout_width="match_parent"      android:layout_height="match_parent" >  </Webview>  

(b). 訪問網頁

webview.loadUrl("https://www.baidu.com/");  
2.WebView API使用詳解 (a). 請求載入網頁部分
public void loadData (String data, String mimeType, String encoding)  

載入指定的data資料

參數說明:

data  字串String形式的資料 可以通過base64編碼而來

mineType data資料的 MIME類型, e.g. ‘text/html‘

encoding data資料的編碼格式

注意:

1.Javascript有同源限制,同源策略限制了一個源中載入文本或者指令碼與來自其他源中的資料互動方式。避免這種限制可以使用loadDataWithBaseURL()方法。

2.encoding參數制定data參數是否為base64或者 URL 編碼,如果data是base64編碼那麼 encoding必須填寫 "base64“。

 

public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)  

使用baseUrl載入base URL的網頁內容,baseUrl解決相關url使用Javascript相同源問題。

 

public void loadUrl (String url)  

載入制定url的網頁內容

 

public void loadUrl (String url, Map<String, String> additionalHttpHeaders)  

載入制定url並攜帶http header資料。


public void reload ()  

重新載入頁面  注意:頁面所有資源會重新載入

 
public void stopLoading ()  

停止載入頁面 

(b). 網頁的前進後退
public void goBack ()  // 頁面後退public void goForward ()  // 頁面前進 public void goBackOrForward (int steps) // 以當前的index為起始點前進或者後退到記錄中指定的steps,  如果steps為負數則為後退,正數則為前進public boolean canGoForward ()  // 判斷頁面是否能夠前進public boolean canGoBack ()  // 判斷頁面是否能夠後退
(c). JavaScript操作
public void addJavascriptInterface (Object object, String name)  

當網頁需要和App進行互動時,可以注入Java對象提供給JavaScritp調用.  Java對象提供相應的方法供js使用.

注意:在Android 4.2以下使用這個api會涉及到JavaScript安全問題, javascript可以通過反射這個Java對象的相關類進行攻擊。

連結:Android WebView 總結 —— Java和JavaScript互動 

連結:Android 4.2版本以下使用WebView組件addJavascriptInterface方法存在JS漏洞

 

public void evaluateJavascript (String script, ValueCallback<String> resultCallback)  

這個方法在Android 4.4系統引入,因此只能在Android4.4系統中才能使用,提供在當前頁面顯示上下文中非同步執行javascript代碼

注意: 這個方法必須在UI線程調用,這個函數的回調也會在UI線程執行。那麼在Android4.4一下如何執行javascrit代碼呢?可以通過 WebView提供的loadUrl方法:具體格式如下:

webView.loadUrl("javascript:alert(injectedObject.toString())");  

其中javascript: 是執行javascript代碼的標識 , 後面是javascript語句。

 
public void removeJavascriptInterface (String name)  

刪除addJavascripInterface時對webview注入的java對象. 此方法在不同的Android系統WebView會有問題,會存在失效情況。

(d). 網頁尋找功能
public void findAllAsync (String find)  

非同步執行尋找網頁內包含的字元並設定高亮,尋找結果會回調.

 

public void findNext (boolean forward)  

尋找下一個匹配的字元

 

(e). WebView 事件回調監聽
public void setWebChromeClient (WebChromeClient client)  

主要通知用戶端app載入當前網頁的 title,Favicon,progress,javascript dialog等事件,通知用戶端處理這些相應的事件。

 
public void setWebViewClient (WebViewClient client)  

主要通知用戶端app載入當前網頁時的各種時機狀態,onPageStart,onPageFinish,onReceiveError等事件。

3.WebViewClient,WebChromeClient

WebView 做為承載網頁的載體控制項,他在網頁顯示的過程中會產生一些事件,並回調給我們的應用程式,以便我們在網頁載入過程中做應用程式想處理的事情。比如說用戶端需要顯示網頁載入的進度、網頁載入發生錯誤等等事件。 WebView提供兩個事件回調類給應用程式層,分別為WebViewClient,WebChromeClient開發人員可以繼承這兩個類,接手相應事件處理。WebViewClient 主要提供網頁載入各個階段的通知,比如網頁開始載入onPageStarted,網頁結束載入onPageFinished等;WebChromeClient主要提供網頁載入過程中提供的資料內容,比如返回網頁的title。

(a).WebViewClient

--WebViewClient使用

建立WebViewClient執行個體並設定到WebView對象中,具體代碼參考如下:
webview.setWebViewClient(new WebViewClient () {  @Override      public void onPageStarted(WebView view, String url, Bitmap favicon) {         // TODO      }        @Override      public void onPageFinished(WebView view, String url) {        // TODO      }  });  

 

--WebViewClient API詳解

public boolean shouldOverrideUrlLoading(WebView view, String url)  
當載入的網頁需要重新導向的時候就會回調這個函數告知我們應用程式是否需要接管控制網頁載入,如果應用程式接管,並且return true意味著程式接管網頁載入,如果返回false讓webview自己處理。 注意:(1) 當請求的方式是"POST"方式時這個回調是不會通知的。(2) 當我們訪問的地址需要我們應用程式自己處理的時候,可以在這裡截獲,比如我們發現跳轉到的是一個market的連結,那麼我們可以直接跳轉到應用市場,或者其他app。 
public void onPageStarted(WebView view, String url, Bitmap favicon)  
當開始載入訪問的url時,會通知應用程式,對每個main frame這個函數只會被調用一次,頁麵包含iframe 或者framesets 不會另外調用一次onPageStarted,當網頁內內嵌的frame 發生改變時也不會調用onPageStarted。注意: 當我們通過loadUrl的方式重新載入一個網址時候,這時候會先調用onPageStarted再調用shouldOverrideUrlLoading,當我們在開啟的這個網址點擊一個link,這時候會先調用shouldOverrideUrlLoading 再調用onPageStarted。不過shouldOverrideUrlLoading不一定每次都被調用,只有需要的時候才會被調用。 
public void onPageFinished(WebView view, String url)  
當載入完當前頁面時會通知我們的應用程式,這個函數只有在main frame情況下才會被調用。
public void onLoadResource(WebView view, String url)  

 

通知應用程式WebView即將載入url 制定的資源 
public WebResourceResponse shouldInterceptRequest(WebView view, String url)  

 通知應用程式核心即將載入url制定的資源,應用程式可以返回本地的資源提供給核心,若本地處理返回資料,核心不從網路上擷取資料。

注意:這個回調並不一定在UI線程執行,所以我們需要注意在這裡操作View或者私人資料相關的動作。如果我們需要改變網頁的背景,或者需要實現網頁頁面顏色定製化的需求,可以在這個回調時機處理。 
public void onReceivedError(WebView view, int errorCode,  String description, String failingUrl)  
當瀏覽器訪問制定的網址發生錯誤時會通知我們應用程式,比如網路錯誤。
參數說明:@param view 接收WebViewClient的那個執行個體,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是這個webview。@param errorCode 錯誤號碼可以在WebViewClient.ERROR_* 裡面找到對應的錯誤名稱。@param description 描述錯誤的資訊@param failingUrl  當前訪問失敗的url,注意並不一定是我們主url 注意:在onReceiveError我們可以自訂網頁的錯誤頁面。 
public void onFormResubmission(WebView view, Message dontResend, Message resend)  

 

如果瀏覽器需要重新發送POST請求,可以通過這個時機來處理。預設是不重新發送資料。 
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload)  
通知應用程式可以將當前的url儲存在資料庫中,意味著當前的訪問url已經生效並被記錄在核心當中。這個函數在網頁載入過程中只會被調用一次。注意網頁前進後退並不會回調這個函數。 
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)  
通知應用程式WebView接收到了一個Http auth的請求,應用程式可以使用supplied 設定webview的響應請求。預設行為是cancel 本次請求。 
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event)   

提供應用程式同步一個處理按鍵事件的機會,菜單快速鍵需要被過濾掉。如果返回true,webview不處理該事件,如果返回false, webview會一直處理這個事件,因此在view 鏈上沒有一個父類可以響應到這個事件。預設行為是return false;

 

public void onScaleChanged(WebView view, float oldScale, float newScale)  
通知應用程式webview 要被scale。應用程式可以處理改事件,比如調整適配螢幕。  (b).WebChromeClient 

--webChromeClient使用

webView.setWebChromeClient(new WebChromeClient() {});
--webChromeCilent API詳解建立WebChromeClient執行個體並設定到WebView對象中,具體代碼參考如下: 
public void onProgressChanged(WebView view, int newProgress)  
通知應用程式當前網頁載入的進度。 
public void onReceivedTitle(WebView view, String title)  
當document 的title變化時,會通知應用程式。注意:這個函數調用時機不確定,有可能很早,有可能很晚,取決於網頁把title設定在什麼位置,大多數網頁一般把title設定到頁面的前面,因此很多情況會比較早回調到這個函數。 
public void onReceivedIcon(WebView view, Bitmap icon)  
當前頁面有個新的favicon時候,會回調這個函數。 
public void onShowCustomView(View view, CustomViewCallback callback)  

 通知應用程式webview需要顯示一個custom view,主要是用在視頻全屏HTML5Video support。

參數說明:@param view 即將要顯示的view@param callback  當view 需要dismiss 則使用這個對象進行回調通知。 
public void onHideCustomView()  
退出視頻通知
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)  
請求建立一個新的視窗,如果我們應用程式接管這個請求,必須返回true,並且建立一個新的webview來承載主視窗。如果應用程式不處理,則需要返回false,預設行為和返回false表現一樣。參數說明:@param view 請求建立新視窗的webview@param isUserGesture 如果是true,則說明是來自使用者收拾操作行為,比如使用者點選連結@param isDialog true 請求建立的新視窗必須是個dialog,而不是全屏的視窗。@param resultMsg 當webview建立時需要發送一個訊息。WebView.WebViewTransport.setWebView(WebView) 
public void onRequestFocus(WebView view)  
webview請求得到focus,發生這個主要是當前webview不是前台狀態,是後台webview。 
public void onCloseWindow(WebView window)  
通知應用程式從關閉傳遞過來的webview並從view tree中remove。 
public boolean onJsAlert(WebView view, String url, String message, JsResult result)  

通知應用程式顯示javascript alert對話方塊,如果應用程式返回true核心認為應用程式處理這個訊息,返回false,核心自己處理。

注意: 如果我們應用接管處理, 則必須給出result的結果,result.cancel,result.comfirm必須調用其中之後,否則核心會hang住。 
public boolean onJsConfirm(WebView view, String url, String message,  JsResult result)  
通知應用程式提供confirm 對話方塊。參數說明同上onJsAlert 
public boolean onJsBeforeUnload(WebView view, String url, String message,  JsResult result)  
通知應用程式顯示一個對話方塊,讓使用者選擇是否離開當前頁面,這個回調是javascript中的onbeforeunload事件,如果用戶端返回true,核心會認為用戶端提供對話方塊。預設行為是return false。參數說明和之前介紹的onJsAlert()相同。 
public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)  
這個回調是私人回調, 當頁面需要請求開啟系統的檔案選取器,則會回調這個方法,比如我們需要上傳圖片,請求拍照,郵件的附件上傳等等操作。如果不實現這個私人API,則上面的請求都將不會執行。 4.WebSettingsAndroid WebView提供展示網頁,也提供我們應用程式對網頁載入的一些定製,比如我們為了減少網路資料可以設定當前載入的頁面不能顯示圖片。Android 提供管理WebView的一些setting的類WebSettings,在WebView對象被建立時WebSettings對象也會被同時建立,並附有預設的settings值. WebSettings對象可以通過WebView.getSettings()獲得。WebSettings的生命週期同WebView生命週期相同,如果WebView被destroy 則WebSettings應該被釋放,否則如果使用WebSettings繼續再操作的話, 會拋出異常IllegalStateException。  注意:調用WebSettings設定的所有函數是非同步制定的,因此我們設定某個狀態並不能馬上生效。  (a).WebSettings API詳解
public synchronized void setLoadsImagesAutomatically(boolean flag)  

設定當前webview是否需要載入圖片,這個標記控制整個webview的狀態,並且對所有的資源都採取這種策略。如果設定為false 那麼訪問的當前網址中的所以圖片資源將不會被載入。預設值是true;通過配置這個方法的標誌,可以實現瀏覽器的無圖模式和有圖模式的控制。

 
public synchronized void setBlockNetworkImage (boolean flag)  
當getLoadsImagesAutomatically返回true這個方法才有效, 預設值為:false; 
public void setCacheMode(int mode)  
一個普通網頁的載入cache會被檢查,內容也會被重新校正,第一次訪問網頁時,會儲存cache到本地,設定策略可以讓網頁載入方式發生變化,cache模式有如下幾種:LOAD_DEFAULT: 如果我們應用程式沒有設定任何cachemode, 這個是預設的cache方式。 載入一張網頁會檢查是否有cache,如果有並且沒有到期則使用本地cache,否則從網路上擷取。LOAD_CACHE_ELSE_NETWORK: 使用cache資源,即使到期了也使用,如果沒有cache才從網路上擷取。LOAD_NO_CACHE: 不使用cache 全部從網路上擷取LOAD_CACHE_ONLY:  只使用cache上的內容。 
public synchronized void setLayoutAlgorithm(LayoutAlgorithm l) 

NORMAL:正常顯示,沒有渲染變化。 
SINGLE_COLUMN:把所有內容放到WebView組件等寬的一列中。   //這個是強制的,把網頁都擠變形了(基本不推薦使用) 
NARROW_COLUMNS:可能的話,使所有列的寬度不超過螢幕寬度。 //預設的
TEXT_AUTOSIZING: 這個在API 19及之後才能使用,目前不需要瞭解和使用.

 
public void setLoadWithOverviewMode(boolean overview)  
概覽模式的設定,預設指是false。 
public synchronized void setJavaScriptEnabled (boolean flag)  
預設值是false.  如果我們網頁需要javascript時,需要開啟這個設定,否則網頁載入不全。  5. WebView 使用 TIPS (a).為WebView自訂錯誤顯示介面:

覆寫WebViewClient中的onReceivedError()方法:

 
/**  * 顯示自訂錯誤提示頁面,用一個View覆蓋在WebView  */  protected void showErrorPage() {      LinearLayout webParentView = (LinearLayout)mWebView.getParent();            initErrorPage();      while (webParentView.getChildCount() > 1) {          webParentView.removeViewAt(0);      }      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);      webParentView.addView(mErrorView, 0, lp);      mIsErrorPage = true;  }  protected void hideErrorPage() {      LinearLayout webParentView = (LinearLayout)mWebView.getParent();            mIsErrorPage = false;      while (webParentView.getChildCount() > 1) {          webParentView.removeViewAt(0);      }  }         protected void initErrorPage() {      if (mErrorView == null) {          mErrorView = View.inflate(this, R.layout.online_error, null);          Button button = (Button)mErrorView.findViewById(R.id.online_error_btn_retry);          button.setOnClickListener(new OnClickListener() {              public void onClick(View v) {                  mWebView.reload();              }          });          mErrorView.setOnClickListener(null);      }  }  @Override  public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {     mErrorView.setVisibility(View.VISIBLE);    super.onReceivedError(view, errorCode, description, failingUrl);  }          =
(b).WebView cookies 清理
CookieSyncManager.createInstance(this);   CookieSyncManager.getInstance().startSync();   CookieManager.getInstance().removeSessionCookie();   
(c).清理cache和記錄
webView.clearCache(true);   webView.clearHistory();  
(d).屏蔽長按事件
mWebView.setOnLongClickListener(new OnLongClickListener() {                        @Override            public boolean onLongClick(View v) {                return true;            }  });  
(e).Webview保留縮放功能,但是隱藏縮放控價
mWebView.getSettings().setSupportZoom(true);  mWebView.getSettings().setBuiltInZoomControls(true);  if (DeviceUtils.hasHoneycomb()) {     mWebView.getSettings().setDisplayZoomControls(false);  
}
注意:setDisplayZoomControls是在Android 3.0中新增的API. 

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.