Android WebView開發 – Android移動開發技術文章_手機開發 Android移動開發教學課程

 

在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的簡單例子 。

 

在開發過程中應該註意幾點:

    1.AndroidManifest.xml中必須使用許可"android.permission.INTERNET",否則會出Web page not available錯誤。

    2.如果訪問的頁面中有Javascript,則webview必須設置支持Javascript。

        webview.getSettings().setJavaScriptEnabled(true); 

    3.如果頁面中鏈接,如果希望點擊鏈接繼續在當前browser中響應,而不是新開Android的系統browser中響應該鏈接,必須覆蓋webview的WebViewClient對象。

mWebView.setWebViewClient(new WebViewClient(){      

                     public boolean shouldOverrideUrlLoading(WebView view, String url) {      

                         view.loadUrl(url);      

                         return true;      

                     }      

         });  

     

/**

     * 4、如果用webview點鏈接看瞭很多頁以後,如果不做任何處理,點擊系統“Back”鍵,整個瀏覽器會調用finish()而結束自身,

     * 如果希望瀏覽的網頁回退而不是退出瀏覽器,需要在當前Activity中處理並消費掉該Back事件。

     * 覆蓋Activity類的onKeyDown(int keyCoder,KeyEvent event)方法。

     */

    public boolean onKeyDown(int keyCoder, KeyEvent event) {

        if (webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK) {

            webView.goBack(); // goBack()表示返回webView的上一頁面

            return true;

        }

        return false;

    }

 

 

代碼如下:

 

1、添加權限:AndroidManifest.xml中必須使用許可"android.permission.INTERNET",否則會出Web page not available錯誤。

 

 

2、AboutUSActivity.java

package com.cn.view;

import com.cn.mr.http.util.Configuration;

import android.app.Activity;

import android.app.ProgressDialog;

import android.os.Bundle;

import android.view.KeyEvent;

import android.webkit.WebChromeClient;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.webkit.SslErrorHandler;

 

//關於我們

public class AboutUSActivity extends Activity {

    final String mimeType = "text/html";

    final String encoding = "utf-8";

    ProgressDialog progresDialog=null;

    WebView webView;

    public static final String ABOUTUS="https://phone.tomome.net/aboutus.html";

 

 

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.aboutus);

        progresDialog = new ProgressDialog(this);

        progresDialog.setMessage("頁面請求…….");

        progresDialog.show();

       

        webView = (WebView) findViewById(R.id.webviewaboutus);

        webView.getSettings().setJavaScriptEnabled(true);

        webView.loadUrl(ABOUTUS);

        webView.setWebChromeClient(new WebChromeClient() {

            @Override

            public void onProgressChanged(WebView view, int newProgress) {

                if (newProgress == 100) { // 這裡是設置activity的標題,

                                        // 也可以根據自己的需求做一些其他的操作

                    progresDialog.setMessage("加載完成");

                    progresDialog.cancel();

                } else {

                    progresDialog.setMessage("加載中…….");

                }

            }

        });

//        webView.setWebViewClient(new WebViewClient() {

//            @Override

//            public boolean shouldOverrideUrlLoading(WebView view, String url) { // 重寫此方法表明點擊網頁裡面的鏈接還是在當前的webview裡跳轉,不跳到瀏覽器那邊

//                view.loadUrl(url);

//                return true;

//            }

//

//            @Override

//            public void onReceivedSslError(WebView view,

//                    SslErrorHandler handler, android.net.http.SslError error) { // 重寫此方法可以讓webview處理https請求

//                handler.proceed();

//            }

//

//        });

    } www.aiwalls.com

 

    /**

     * 如果用webview點鏈接看瞭很多頁以後,如果不做任何處理,點擊系統“Back”鍵,整個瀏覽器會調用finish()而結束自身,

     * 如果希望瀏覽的網頁回退而不是退出瀏覽器,需要在當前Activity中處理並消費掉該Back事件。

     * 覆蓋Activity類的onKeyDown(int keyCoder,KeyEvent event)方法。

     */

    public boolean onKeyDown(int keyCoder, KeyEvent event) {

        if (webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK) {

            webView.goBack(); // goBack()表示返回webView的上一頁面

            return true;

        }

        return false;

    }

}

 

3、XML佈局文件:

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical"

              android:layout_width="fill_parent" android:layout_height="fill_parent">

    <WebView android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/webviewaboutus"></WebView>

</LinearLayout>

 

作者 陳諫輝

發佈留言