Android WebView小結

Android WebView小結

    基礎篇  
在Android手機中內置了一款高性能webkit內核瀏覽器,在SDK中封裝爲一個叫作WebView組件。 
什麼是webkit 
        WebKit是Mac OS X v10.3及以上版本所包含的軟件框架(對v10.2.7及以上版本也可經過軟件更新獲取)。 同時,WebKit也是Mac OS X的Safari網頁瀏覽器的基礎。WebKit是一個開源項目,主要由KDE的KHTML修改而來而且包含了一些來自蘋果公司的一些組件。 
     傳統上,WebKit包含一個網頁引擎WebCore和一個腳本引擎JavaScriptCore,它們分別對應的是KDE的KHTML和KJS。不過, 隨着JavaScript引擎的獨立性愈來愈強,如今WebKit和WebCore已經基本上混用不分(例如Google Chrome和Maxthon 3採用V8引擎,卻仍然宣稱本身是WebKit內核)。 
這裏咱們初步體驗一下在android是使用webview瀏覽網頁,在SDK的Dev Guide中有一個WebView的簡單例子。在看下面這些總結知識以前,你們請看示例代碼中MainActivtiy的代碼,運行整個程序後,第一個頁面顯示的就是MainActivity的運行效果。上面的Button按鈕是點擊到第二個Activity進行測試用的。 

在開發過程當中應該注意幾點: 
1.AndroidManifest.xml中必須使用許可"android.permission.INTERNET",不然會出Web page not available錯誤。 
2.若是訪問的頁面中有Javascript,則webview必須設置支持Javascript。webview.getSettings().setJavaScriptEnabled(true);  
3. 在要Activity中生成一個WebView組件:WebView webView = new WebView(this); 
4. 設置WebView基本信息: 
若是訪問的頁面中有Javascript,則webview必須設置支持Javascript。 
   webview.getSettings().setJavaScriptEnabled(true);  
   觸摸焦點起做用 requestFocus(); 
取消滾動條  this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY) 
5. 設置WevView要顯示的網頁: 
互聯網用:webView.loadUrl("http://www.google.com"); 
   本地文件用:webView.loadUrl(file:///android_asset/xx.html);固定格式 
    本地文件存放在:assets文件中 
6. 若是但願點擊連接由本身處理,而不是新開Android的系統browser中響應該連接。 
給WebView添加一個事件監聽對象(WebViewClient)      
   並重寫其中的一些方法 
    shouldOverrideUrlLoading:對網頁中超連接按鈕的響應。當按下某個鏈接時WebViewClient會調用這個方法,並傳遞參數:按下的url 
onLoadResource:加載資源時響應 
onPageStart:在加載頁面時響應 
onPageFinish:在加載頁面結束時響應 
onReceiveError:在加載出錯時響應 
onReceivedHttpAuthRequest: 
7.若是頁面中連接,若是但願點擊連接繼續在當前browser中響應,而不是新開Android的系統browser中響應該連接,必須覆蓋 webview的WebViewClient對象。 
1.        mWebView.setWebViewClient(new WebViewClient(){       
2.            public boolean shouldOverrideUrlLoading(WebView view, String url) { 
3.                                view.loadUrl(url);       
4.                                return true;       
5.                            }       
6.                }); 
8.若是不作任何處理,瀏覽網頁,點擊系統「Back」鍵,整個Browser會調用finish()而結束自身,若是但願瀏覽的網 頁回退而不是推出瀏覽器,須要在當前Activity中處理並消費掉該Back事件。 
1.        public boolean onKeyDown(int keyCode, KeyEvent event) {       
2.            if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { 
3.                    mWebView.goBack();       
4.                           return true;       
5.                }       
6.                return super.onKeyDown(keyCode, event);       
7.            }     
9.  @Override 
public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) { // 重寫此方法可讓webview處理https請求 
handler.proceed(); 


}); 


提升篇(一) 
    下一步讓咱們來了解一下android中webview是如何支持javascripte自定義對象的,在w3c標準中js有 window,history,document等標準對象,一樣咱們能夠在開發瀏覽器時本身定義咱們的對象調用手機系統功能來處理,這樣使用js就能夠隨心所欲了。 
看一個實例: 
public class WebViewDemo extends Activity {        
private WebView mWebView;       
private Handler mHandler = new Handler();       

public void onCreate(Bundle icicle) {       
super.onCreate(icicle);       
setContentView(R.layout.webviewdemo);       
mWebView = (WebView) findViewById(R.id.webview);       
WebSettings webSettings = mWebView.getSettings();       
  webSettings.setJavaScriptEnabled(true);       
mWebView.addJavascriptInterface(new Object() {       
public void clickOnAndroid() {       
mHandler.post(new Runnable() {       
                public void run() {       
                 mWebView.loadUrl("javascript:wave()");       
               }       
           });       
           }       
       }, "demo");       
       mWebView.loadUrl("file:///android_asset/demo.html");       
    }       


       咱們看addJavascriptInterface(Object obj,String interfaceName)這個方法,該方法將一個java對象綁定到一個javascript對象中,javascript對象名就是 interfaceName(demo),做用域是Global。這樣初始化webview後,在webview加載的頁面中就能夠直接經過 javascript:window.demo訪問到綁定的java對象了。來看看在html中是怎樣調用的。 

<html>       
<mce:script language="javascript"><!--     

   function wave() {       
               document.getElementById("droid").src="android_waving.png";       
      }       
         
// --></mce:script>       
   <body>       
        <a onClick="window.demo.clickOnAndroid()">       
                             <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br>       
                            Click me!       
         </a>       
      </body>       
</html>      

        這樣在javascript中就能夠調用java對象的clickOnAndroid()方法了,一樣咱們能夠在此對象中定義不少方法(比 如發短信,調用聯繫人列表等手機系統功能。),這裏wave()方法是java中調用javascript的例子。 
這裏還有幾個知識點: 
1)爲了讓WebView從apk文件中加載assets,Android SDK提供了一個schema,前綴爲"file:///android_asset/"。WebView遇到這樣的schema,就去當前包中的 assets目錄中找內容。如上面的"file:///android_asset/demo.html" 
2)addJavascriptInterface方法中要綁定的Java對象及方法要運行另外的線程中,不能運行在構造他的線程中,這也是使用 Handler的目的。 



提升篇(二) 

Android中使用WebView, WebChromeClient和WebViewClient加載網頁 

     在android應用中,有時要加載一個網頁,若是能配上一個進度條就更好了,而android中提供了其很好的支持,運行示例程序後點擊Button,跳轉到WebPageLoader中,就能夠看到進度條的效果了。 
要注意的是,其中的webView的一系列用法,好比 webView.getSettings().setJavaScriptEnabled(true);設置可使用javscript; 
webView.getSettings().setJavaScriptEnabled(true);    
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);    
webView.setHorizontalScrollBarEnabled(false);    
webView.getSettings().setSupportZoom(true);    
webView.getSettings().setBuiltInZoomControls(true);    
webView.setInitialScale(70);    
webView.setHorizontalScrollbarOverlay(true); 


等等,具體參考API 
而進度條的使用是在new出一個setWebChromeClient後,能夠在內部類中寫 
onProgressChanged事件 
在WebView的設計中,不是什麼事都要WebView類乾的,有些瑣事是分給其餘人的,這樣WebView專心幹好本身的解析、渲染工做就好了。WebViewClient就是幫助WebView處理各類通知、請求事件的,具體來講包括: 
onLoadResource 
onPageStart 
onPageFinish 
onReceiveError 
onReceivedHttpAuthRequest 
WebChromeClient是輔助WebView處理Javascript的對話框,網站圖標,網站title,加載進度等 
onCloseWindow(關閉WebView) 
onCreateWindow() 
onJsAlert (WebView上alert是彈不出來東西的,須要定製你的WebChromeClient處理彈出) 
onJsPrompt 
onJsConfirm 
onProgressChanged 
onReceivedIcon 
onReceivedTitle 


[img] 
 
[/img] 

[img] 
 
[/img] 

[img] 
 
[/img] 

MainActivity.java
package com.parabola.main;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;

public class MainActivity extends Activity {
	/** Called when the activity is first created. */
	private WebView webview;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button button = (Button) this.findViewById(R.id.button1);
		webview = (WebView) findViewById(R.id.webview);
		// 設置WebView屬性,可以執行JavaScript腳本
		webview.getSettings().setJavaScriptEnabled(true);
		// 加載URL內容
		webview.loadUrl("http://www.baidu.com");
		// 設置web視圖客戶端
		webview.setWebViewClient(new MyWebViewClient());
		
		button.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				
				Intent intent = new Intent(MainActivity.this, WebPageLoader.class);
				startActivity(intent);
				
			}
		});
	}

	// 設置回退
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
			webview.goBack();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

	// web視圖客戶端
	public class MyWebViewClient extends WebViewClient {
		public boolean shouldOverviewUrlLoading(WebView view, String url) {
			view.loadUrl(url);
			return true;
		}
	}
}

WebPageLoader.java 
package com.parabola.main;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class WebPageLoader extends Activity {
	final Activity activity = this;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
		setContentView(R.layout.webview);
		
		WebView webView = (WebView) findViewById(R.id.webView);
		webView.getSettings().setJavaScriptEnabled(true);
		webView.getSettings().setSupportZoom(true);
		webView.setWebChromeClient(new WebChromeClient() {
			public void onProgressChanged(WebView view, int progress) {
				activity.setTitle("Loading...");
				activity.setProgress(progress * 100);
				if (progress == 100)
					activity.setTitle(R.string.app_name);
			}
		});
		webView.setWebViewClient(new WebViewClient() {

			public void onReceivedError(WebView view, int errorCode,
					String description, String failingUrl) { // Handle the error

			}

			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				view.loadUrl(url);
				return true;
			}
		});
		webView.loadUrl("http://www.sohu.com");
	}
}
相關文章
相關標籤/搜索