Android開發(fā)實驗報告-網(wǎng)絡(luò)與通信_第1頁
Android開發(fā)實驗報告-網(wǎng)絡(luò)與通信_第2頁
Android開發(fā)實驗報告-網(wǎng)絡(luò)與通信_第3頁
Android開發(fā)實驗報告-網(wǎng)絡(luò)與通信_第4頁
Android開發(fā)實驗報告-網(wǎng)絡(luò)與通信_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、實驗七 網(wǎng)絡(luò)與通信一 實驗?zāi)康恼莆諢o線網(wǎng)絡(luò)通信原理,熟練Android平臺網(wǎng)絡(luò)應(yīng)用開發(fā)二 實驗內(nèi)容1) 熟悉Android平臺上網(wǎng)絡(luò)與通信的開發(fā)技術(shù),包括WiFi開發(fā)基礎(chǔ)、藍(lán)牙開發(fā);2) 編程實現(xiàn)簡易瀏覽器、WiFi管理器、藍(lán)牙服務(wù)器和客戶端。三 儀器設(shè)備1) PC機(jī)最低配置:2G Hz以上雙核CPU,2G以上內(nèi)存,1G自由硬盤空間;2) WindowsXP(32位)或Vista(32或64位)或Windows7(32或64位);3) Eclipse 3.7以上;4) Eclipse JDT 插件;5) JDK 5或JDK 6;6) Android Development Tools插件;7)

2、 Android SDK。四 實驗要求1) 了解網(wǎng)絡(luò)通信技術(shù)基本原理;2) 學(xué)習(xí)實現(xiàn)HTTP通信、Socket通信;3) 用WebKit實現(xiàn)一個瀏覽器;4) 熟練WiFi、藍(lán)牙相關(guān)的類和接口。五 實驗主要步驟 1. 無線網(wǎng)絡(luò)技術(shù)、Android網(wǎng)絡(luò)基礎(chǔ) 所謂無線網(wǎng)絡(luò),既采用無線傳輸媒介(如無線電波、紅外線等)的網(wǎng)絡(luò)。既包括允許用戶建立遠(yuǎn)距離無線連接的全球語音和數(shù)據(jù)網(wǎng)絡(luò),也包括為近距離無線連接進(jìn)行優(yōu)化和紅外線技術(shù)及射頻技術(shù)。無線網(wǎng)絡(luò)與有線網(wǎng)絡(luò)的用途十分類似,最大的不同在于傳輸媒介的不同,利用無線電技術(shù)取代網(wǎng)線。無線網(wǎng)絡(luò)可以和有線網(wǎng)絡(luò)互為備份。無線技術(shù)的分類如下:1.無線網(wǎng)絡(luò)通信標(biāo)準(zhǔn)2無線網(wǎng)絡(luò)類型

3、3無線局域網(wǎng)(WLAN)4無線個域網(wǎng)(WPAN) Android基于Linux內(nèi)核,它包含一組優(yōu)秀的聯(lián)網(wǎng)功能,當(dāng)然這些只是Android自帶的一些功能,它們是開源軟件,大家可以拿來學(xué)習(xí)研究。目前,Android平臺有3種網(wǎng)絡(luò)接口可以使用,它們分別是:.*(標(biāo)準(zhǔn)java接口)、org.apache(Apache接口)、.*(android網(wǎng)絡(luò)接口)。下面我們分別來簡單介紹一下這些接口的功能及其作用。標(biāo)準(zhǔn)java接口.*(標(biāo)準(zhǔn)java接口)提供與聯(lián)網(wǎng)有關(guān)的類,包括流和數(shù)據(jù)包套接字、Internet協(xié)議、常見HTTP處理。比如:追尋URL以及URLConnection/Http URLConnect

4、ion對象、設(shè)置連接參數(shù)、連接到服務(wù)器、向服務(wù)器寫數(shù)據(jù)、從服務(wù)器讀取數(shù)據(jù)等通信。下面是常見的使用包的HTTP例子,如代碼清單8-1所示。Apache接口HTTP協(xié)議可能是現(xiàn)在Internet上使用得最多、最重要的通信協(xié)議了,二元越來越多的java應(yīng)用程序需要通過HTTP協(xié)議來訪問網(wǎng)絡(luò)資源。雖然在JDK的包中已經(jīng)提供了訪問HTTP協(xié)議的基本功能,但是對于大部分應(yīng)用程序來說,JDK庫本身提供的功能遠(yuǎn)遠(yuǎn)不夠。這里就需要Android提供的Apache HttpClient了。它是一個開源項目,功能更加完善,為客戶端的HTTP編程提供高效、最新、功能豐富的工具包支持。Android平臺引入了Apach

5、e HttpClient的同時不提供了對它的一些封裝和擴(kuò)展,例如設(shè)置缺省的HTTP超時和緩存大小等。Android使用的是目前最新的HttpClient 4.0(org.apache.http.*),可以將Apache視為目前流行的開源Web服務(wù)器,主要包括創(chuàng)建HttpClient以及Get/Post、HttpRequest等對象,設(shè)置連接參數(shù),執(zhí)行HTTP操作,處理服務(wù)器返回結(jié)果等功能。下面是一個使用.http.*包的例子,如代碼清單8-2所示。Android網(wǎng)絡(luò)接口A.*包實際上是通過對Apache中的HttpClient的封裝來實現(xiàn)的一個HTTP編程接口,同時還提供了HTTP請求隊列管理

6、nyeyHTTP連接池管理,以提高并發(fā)請求情況下(如轉(zhuǎn)載網(wǎng)頁時)的處理效率,除此之外還有網(wǎng)絡(luò)狀態(tài)監(jiān)視等接口、網(wǎng)絡(luò)訪問的Socket、常用的Uri類以及有關(guān)WiFi相關(guān)的類等等。下面我們看最簡單的Socket連接。2. HttpURLConnection接口、HttpClient接口HTTP(Hyper Text Transfer Protocol,超文本傳輸協(xié)議)用于傳送WWW方式的數(shù)據(jù)。HTTP協(xié)議采用了請求/響應(yīng)模型??蛻舳讼蚍?wù)器發(fā)送一個,請求頭包含了請求的方法、URL、協(xié)議版本,以及包含請求修飾符、客戶信息和內(nèi)容的類似于MIME的消息結(jié)構(gòu)。HTTP通信中使用最多的就是get和post,

7、get請求可以獲取靜態(tài)頁面,也可以把參數(shù)放在URL字串后面,傳遞給服務(wù)器。Post與Get的不同之處在于Post的參數(shù)不是放在URL字串里面,而是放在http請求數(shù)據(jù)中。HttpURLConnection是java的標(biāo)準(zhǔn)類,繼承自URLConnection類,URLConnection與HttpURLConnection都是抽象類,無法直接實例化對象。我們分別使用Get和Post方式來獲取一個網(wǎng)頁內(nèi)容。首先,我們在服務(wù)器上建立一個http1.jsp文件代碼如下:再創(chuàng)建一個使用Get和Post來傳遞參數(shù)的網(wǎng)頁httpget.jsp,代碼如下:下面我們通過一個Android程序分別以不同的方式訪問

8、這兩個頁面,程序運(yùn)行結(jié)果如下: 首先,我們?yōu)榭纯丛L問不需要傳遞參數(shù)的網(wǎng)頁如何實現(xiàn)。非常簡單!只需要打開一個HttpURLConnection連接,然后取得流中的數(shù)據(jù),完成之后關(guān)閉這個連接,代碼如下:/直接獲取數(shù)據(jù)public class Activity02 extends Activityprivate final String DEBUG_TAG = "Activity02" /* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceS

9、tate)super.onCreate(savedInstanceState);setContentView(R.layout.http);TextView mTextView = (TextView)this.findViewById(R.id.TextView_HTTP);/http地址String httpUrl = "10:8080/http1.jsp"/獲得的數(shù)據(jù)String resultData = ""URL url = null;try/構(gòu)造一個URL對象url = new URL(httpUrl); c

10、atch (MalformedURLException e)Log.e(DEBUG_TAG, "MalformedURLException");if (url != null)try/使用HttpURLConnection打開連接HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();/得到讀取的內(nèi)容(流)InputStreamReader in = new InputStreamReader(urlConn.getInputStream();/ 為輸出創(chuàng)建BufferedReaderBuff

11、eredReader buffer = new BufferedReader(in);String inputLine = null;/使用循環(huán)來讀取獲得的數(shù)據(jù)while (inputLine = buffer.readLine() != null)/我們在每一行后面加上一個"n"來換行resultData += inputLine + "n"InputStreamReaderin.close();/關(guān)閉http連接urlConn.disconnect();/設(shè)置顯示取得的內(nèi)容if ( resultData != null )mTextView.setT

12、ext(resultData);else mTextView.setText("讀取的內(nèi)容為NULL");catch (IOException e)Log.e(DEBUG_TAG, "IOException");elseLog.e(DEBUG_TAG, "Url NULL");/設(shè)置按鍵事件監(jiān)聽Button button_Back = (Button) findViewById(R.id.Button_Back);/* 監(jiān)聽button的事件信息 */button_Back.setOnClickListener(new Button.

13、OnClickListener() public void onClick(View v)/* 新建一個Intent對象 */Intent intent = new Intent();/* 指定intent要啟動的類 */intent.setClass(Activity02.this, Activity01.class);/* 啟動一個新的Activity */startActivity(intent);/* 關(guān)閉當(dāng)前的Activity */Activity02.this.finish(););以Get方式傳遞參數(shù)也很簡單,對于Activity02.java只需要修改網(wǎng)頁地址,加上要傳遞的參數(shù)

14、即可。代碼如下(其中,“?par=abcdefg”則是我們傳遞的參數(shù)par)。上面都只是簡單地進(jìn)行了網(wǎng)絡(luò)的訪問,但是在實際開發(fā)中,可能會運(yùn)用到更復(fù)雜的聯(lián)網(wǎng)操作。Apache提供了HttpClient,它對中的類做了封裝和抽象,更適合我們在Android上開發(fā)聯(lián)網(wǎng)應(yīng)用。要使用HttpClient,需要了解一些類。DefaultHttpClient是默認(rèn)的一個HTTP客戶端,我們可以使用它創(chuàng)建一個HTTP連接。HttpResponse是一個HTTP連接響應(yīng),當(dāng)執(zhí)行一個HTTP連接后,就會返回一個HttpResponse,可以通過HttpResponse獲得一些響應(yīng)的信息。下面是請求一個HTTP連接

15、并獲得該請求是否成功的代碼。通過上面幾個類的了解,下面我們將分別使用Get和Post方式請求一個網(wǎng)頁程序運(yùn)行截圖如下:相關(guān)代碼如下:import java.io.IOException;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.Http

16、Get;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;public class Activity02 extends Act

17、ivity/* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.http);TextView mTextView = (TextView) this.findViewById(R.id.TextView_HTTP);/ http地址String httpUrl = "10:8080/h

18、ttpget.jsp?par=HttpClient_android_Get"/HttpGet連接對象HttpGet httpRequest = new HttpGet(httpUrl);try/取得HttpClient對象HttpClient httpclient = new DefaultHttpClient();/請求HttpClient,取得HttpResponseHttpResponse httpResponse = httpclient.execute(httpRequest);/請求成功if (httpResponse.getStatusLine().getStatusC

19、ode() = HttpStatus.SC_OK)/取得返回的字符串String strResult = EntityUtils.toString(httpResponse.getEntity();mTextView.setText(strResult);elsemTextView.setText("請求錯誤!");catch (ClientProtocolException e)mTextView.setText(e.getMessage().toString();catch (IOException e)mTextView.setText(e.getMessage().

20、toString();catch (Exception e)mTextView.setText(e.getMessage().toString(); /設(shè)置按鍵事件監(jiān)聽Button button_Back = (Button) findViewById(R.id.Button_Back);/* 監(jiān)聽button的事件信息 */button_Back.setOnClickListener(new Button.OnClickListener() public void onClick(View v)/* 新建一個Intent對象 */Intent intent = new Intent();/*

21、 指定intent要啟動的類 */intent.setClass(Activity02.this, Activity01.class);/* 啟動一個新的Activity */startActivity(intent);/* 關(guān)閉當(dāng)前的Activity */Activity02.this.finish(););3. Socket傳輸模式、Socket編程原理Socket通常也稱做“套接字”,用于描述IP地址和端口,是一個通信鏈的句柄。應(yīng)用程序通常通過“套接字”向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。它是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。它是網(wǎng)絡(luò)通信過程中端點的抽象表示,包含進(jìn)

22、行網(wǎng)絡(luò)通信必需的5種信息:連接使用的協(xié)議、本地主機(jī)的IP地址、本地進(jìn)程的協(xié)議、本地進(jìn)程的協(xié)議端口、遠(yuǎn)地主機(jī)的IP地址和遠(yuǎn)地進(jìn)程的協(xié)議端口。Socket傳輸模式Socket兩種主要的操作方式:面向連接的和無連接的。面向連接的Socket操作就像一部電話,必須建立一個連接和一個呼叫。所有的事情到達(dá)時的順序與它們出發(fā)時的順序是一樣的。無連接的Socket操作就像一個郵件投遞,沒有什么保證,多個郵件到達(dá)時的順序可能與出發(fā)時的順序不一樣的。到底用哪種模式是由應(yīng)用程序的需要決定的。如果可靠性更重要的話,用面向連接的操作會好一些。比如文件服務(wù)器需要數(shù)據(jù)的正確性和有序性,如果一些數(shù)據(jù)丟失了,系統(tǒng)的有效性將會失

23、去。一些服務(wù)器,比如間歇性發(fā)送一些數(shù)據(jù)塊,如果數(shù)據(jù)丟了的話,服務(wù)器并不想要再重新發(fā)一次,因為數(shù)據(jù)到達(dá)的時候,它可能已經(jīng)過時了。確保數(shù)據(jù)的有序性和正確性需要額外的操作,這會帶來內(nèi)存消耗,額外的費(fèi)用將會降低系統(tǒng)的回應(yīng)速率。Socketxytk編程原理Java在包中提供兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務(wù)端。這是兩個封閉得非常好的類,使用很方便。其構(gòu)造方法如下:其中,address、host和port分別是雙向連接中另一方的IP地址、主機(jī)名和端口號,stream指明Socket是流Socket不是數(shù)據(jù)報Socket,localPort表示本地主機(jī)的端口號,

24、localAddr和bindAddr是本地機(jī)器的地址(ServerSocket的主機(jī)地址),impl是Socket的父類,既可以用來創(chuàng)建ServerSocket,又可能用來創(chuàng)建Socket。Count則表示服務(wù)端所能支持的最大連接數(shù)。要想使用Socket來與一個服務(wù)器通信,就必須先在客戶端創(chuàng)建一個Socket,并指出需要連接的服務(wù)器的IP地址和端口,這也是使用Socket通信的第一步,代碼如下通過以上程序我們創(chuàng)建一個ServerSocket在端口543231監(jiān)聽客戶請求,它是Server的典型工作模式,在這里Server只能接收一個請求,接收后Server就退出了。,一旦有客戶請求,Serve

25、r問題會創(chuàng)建一個服務(wù)線程來服務(wù)新來的客戶,而自己繼續(xù)監(jiān)聽。程序中accept()是一個阻塞函數(shù),所謂阻塞性方法就是說該方法被調(diào)用 后將等待客戶的請求,直到有一個客戶啟動并請求連接到相同的端口,然后accept()返回一個對應(yīng)于客戶的Socket。這時,客戶方和服務(wù)方都建立了用于通信的Socket,接下來就是由各個Socket分別打開各自的輸入、輸出流。Socket提供了方法getInputStream()和getOutStream()來得到對應(yīng)的輸入(出)流以進(jìn)行讀(寫操作,這兩個方法分別返回InputStream和OutputStream類對象。為了便于讀(寫)數(shù)據(jù),我們可以在返回的輸入/輸

26、出流對象上建立過濾流,如DataInputStream、DataOutputStream或PrintStream類對象,對于文本方式流對象可以采用InputStreamReader和OutputStreamWriter、PrintWriter等處理。代碼如下關(guān)閉Socket和流。每一個Socket存在時都將占用一定的資源,在Socket對象使用完畢時,要使其關(guān)閉,關(guān)閉Socket可以調(diào)用Socket的close()方法。在關(guān)閉Socket之前,應(yīng)將與Socket相關(guān)的所有輸入(出)流全部關(guān)閉,以釋放所有的資源。而且要注意關(guān)閉的順序,與Socket相關(guān)的所有的輸入/輸出應(yīng)首先關(guān)閉,然后再關(guān)閉So

27、cket。盡管Java有自動回收機(jī)制,網(wǎng)絡(luò)資源最終是會被釋放的,但是為了有效利用資源,建議讀者按照合理的順序主動釋放資源。os.close();is.close();socket.close();在Android中完全可以使用Java標(biāo)準(zhǔn)API來開發(fā)網(wǎng)絡(luò)應(yīng)用,下面我們將實現(xiàn)一個服務(wù)器和客戶端通信,客戶端發(fā)送數(shù)據(jù)并接收服務(wù)器發(fā)回的數(shù)據(jù)。相關(guān)代碼如下:package com.yarin.android.Examples_08_04;/package com.yarin.android.Examples_08_04;import java.io.BufferedReader;import java.

28、io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import .ServerSocket;import .Socket;public class Server implements Runnablepublic void run()try/創(chuàng)建ServerSocketServerSocket serverSocket = new ServerSocket(54321);while (true)/接受客戶端請求Socket

29、 client = serverSocket.accept();System.out.println("accept");try/接收客戶端消息BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream();String str = in.readLine();System.out.println("read:" + str);/向服務(wù)器發(fā)送消息PrintWriter out = new PrintWriter( new BufferedWriter

30、( new OutputStreamWriter(client.getOutputStream(),true); out.println("server message"); /關(guān)閉流out.close();in.close();catch (Exception e)System.out.println(e.getMessage();e.printStackTrace();finally/關(guān)閉client.close();System.out.println("close");catch (Exception e)System.out.println(e

31、.getMessage();/main函數(shù),開啟服務(wù)器public static void main(String a)Thread desktopServerThread = new Thread(new Server();desktopServerThread.start();4. 網(wǎng)絡(luò)通信的中文亂碼問題在實際開發(fā)過程中,可能經(jīng)常會遇到中文顯示亂碼的問題,那么這空間是為什么呢?要想解決Java中文亂碼問題,首先需要了解字符、字符集、編碼的概念以及常用的編碼方式。字符:是文字與符號的總稱,包括文字、圖形符號、數(shù)學(xué)符號等。字符集:就是一組抽象字符的集合。字符集常常和一種具體的語言文字對應(yīng)起來,

32、該文字中的所有字符或者大部分常用字符就構(gòu)成了該文字的字符集,比如英文字符集、繁體漢字字符集、日文字符集等等。字符編碼:計算機(jī)要處理各種字符,就需要將字符和二進(jìn)制內(nèi)碼對應(yīng)起來,這種對應(yīng)關(guān)系就是字符編碼。要制定編碼首先要確定字符集,并將字符集內(nèi)的字符排序,然后和二進(jìn)制數(shù)字對應(yīng)起來。根據(jù)字符集內(nèi)字符的多少,確定用幾個字節(jié)來編碼。ASC編碼是目前計算機(jī)中用得最廣泛的字符集及其編碼。ISO-8859-1可以表示的是西歐語言,它看起來很單一,為什么還在使用呢?由于是單字節(jié)編碼,與計算機(jī)最基礎(chǔ)的表示單位一一致,所以很多時候,仍舊使用ISO-8859-1編碼來表示,而且在很多協(xié)議上默認(rèn)使用該編碼。Unicod

33、e編碼(統(tǒng)一碼、萬國碼、單一碼)是一種在計算機(jī)上使用的字符編碼,通常我們所遇到的UTF-8就是Unicode編碼的實現(xiàn)方式。GB2312字集是簡體字集;BIG5字集是臺灣繁體字集;GBK字集是簡繁字集,包括了GB字集、BIG5字集和一些符號。GB18030是國家制定的一個強(qiáng)制性大字集標(biāo)準(zhǔn),它的推出使?jié)h字集有了統(tǒng)一的標(biāo)準(zhǔn)。Linux系統(tǒng)默認(rèn)使用的是ISO-8859-1編碼,Win32系統(tǒng)默認(rèn)使用的是GB2312編碼。網(wǎng)絡(luò)通信中,產(chǎn)生亂碼的原因主要是通信過程中使用了不同的編碼方式:服務(wù)器中的編碼方式,傳輸過程中的編碼方式,傳輸?shù)竭_(dá)終端設(shè)備的編碼方式。因此在傳輸過程中就需要至少兩次編碼轉(zhuǎn)換:首先從服

34、務(wù)器編碼轉(zhuǎn)換為網(wǎng)絡(luò)編碼,再從網(wǎng)絡(luò)編碼轉(zhuǎn)換為終端設(shè)備編碼。在轉(zhuǎn)換過程中發(fā)生任何情況都可能引起編碼混亂,一般情況下我們可以通過以下兩種方式來避免這個問題。一個方式是:由于大部分終端設(shè)備都支持Unicode字符集,所以在連接網(wǎng)頁時,我們希望網(wǎng)頁數(shù)據(jù)在網(wǎng)絡(luò)傳輸時使用UTF-8方式傳輸,這樣就可以很簡單地將UTF-8轉(zhuǎn)換成Unicode字符集了。下面我們將通信過程中得到的流先轉(zhuǎn)換為字節(jié),然后再將字節(jié)按GB2312的方式進(jìn)行轉(zhuǎn)換得到字符串,代碼如下:InputStream is=conn.getInprtStream();BufferedInputStream bis=new BufferedInputS

35、tream(is);byte bytearray=new byte1024;int current=-1;int i=0;while(current=bis.read()!=-1)bytearrayi=(byte)current;i+;resultData=new String(bytearray,"GB2312");因此,通過上面的轉(zhuǎn)換,“resultData”字符串便可以顯示中文效果了。另一種方式是在數(shù)據(jù)傳遞過程中使用ISO-8859-1字符集,這樣就是直接使用ASC編碼方式,當(dāng)然在傳遞到終端設(shè)備時,需要將其數(shù)據(jù)反轉(zhuǎn)才能夠正常顯示。下面我們將一個字符串按ISO-8859

36、-1字符集進(jìn)行轉(zhuǎn)換,代碼如下:public static String FormatStr(String str)if(str=null|str.length()=0)return " "tryreturn new String(str.getBytes("ISO-8859-1"),"bgk");catch (UnsupportedEncodingException ex)return str;歸根結(jié)底,解決中文亂碼只需要兩個步驟:使用getBytes(“編碼方式”);來對漢字進(jìn)行重編碼,得到它的字節(jié)數(shù)組。再使用new String(

37、Bytes,“解碼方式”);來對字節(jié)數(shù)組進(jìn)行相應(yīng)的編碼。只要理解了編碼和解碼的含義,并掌握了什么時候應(yīng)該編碼,什么時候應(yīng)該解碼,怎么編碼及怎么解碼,就不再害怕中文亂碼問題了。6. WebView控件和JavascriptWebKit是一個開源瀏覽器網(wǎng)頁排版引擎,與之相應(yīng)的引擎有Gecko(Mozilla、Firefox等使用的排版引擎)和Trident(也稱為MSHTML,是IE使用的排版引擎)。同時,WebKit也是蘋果Mac OS X系統(tǒng)引擎框架版本的名稱,主要用于Safari、Dashboard、Mail和其他一些Mac OS X程序。WebKit所包含的WebCore排版引擎和JSCo

38、re引擎來自于KDE的KHTML和KJS,當(dāng)年蘋果比較了Gecko和KHTML后,仍然選擇了后者,就因為它擁有清晰的源碼結(jié)構(gòu)、極快的渲染速度。而今Android系統(tǒng)也毫不猶豫地選擇了WebKit。它具備觸摸屏、高級圖形顯示和上網(wǎng)功能,用戶能夠在手機(jī)上查看電子郵件、搜索網(wǎng)址和觀看視頻節(jié)目等??梢钥闯鲞@是一個非常強(qiáng)大的Web應(yīng)用平臺。WebKit由3個模塊組成:JavaScriptCore、WebCore和WebKit,其結(jié)構(gòu)圖如。對WebKit各個模塊的功能有了了解,下面我們看看WebKit的解析過程是怎樣的。流程如下:而Google對WebKit進(jìn)行了封裝,為開發(fā)者提供了豐富的Java接口,其

39、中最重要的便是android. WebKit.WebView控件。下面我們重點學(xué)習(xí)WebView控件的使用。Android提供了WebView控件專門用來瀏覽網(wǎng)頁,和其他控件一樣,它使用起來非常簡單。首先我們需要在XML布局文件中定義一個WebView控件,代碼如下:<WebViewandroid:id="+id/WebView01"android:layout_width="fill_parent"android:layout_height="fill_parent"andriod:layout_weight="1&

40、quot;/>然后在程序中裝載這個控件,設(shè)置其屬性,比如:顏色、字體、要文章的網(wǎng)址等(當(dāng)然也可以全部在XML中定義),下面的代碼通過loadUrl方法設(shè)置了當(dāng)前WebView需要訪問的網(wǎng)址:mWebView=(WebView)findViewById(R.id.WebView01);mWebView.loadUrl("");在Android中專門通過WebSettings來設(shè)置WebView的一些屬性、狀態(tài)等。在創(chuàng)建WebView時,系統(tǒng)有一個默認(rèn)的設(shè)置,我們可以通過WebView.getSettings來得到設(shè)置。代碼如下:WebSettings webSettin

41、gs=mWebView.getSettings();WebSettings和WebView都在同一個生命周期中存在,當(dāng)WebView被銷毀后,如果再使用WebSettings則會拋出IllegalStateException異常。下面是設(shè)置一些常用屬性、狀態(tài)的方法如下:將表中的大部分方法中的set改為get,即可得到WebView的一些狀態(tài)和屬性。方法太多了,這里我們僅列舉了一些常用的方法,大家可以參見官方API。這樣就可以瀏覽網(wǎng)頁了,但是通過調(diào)用系統(tǒng)瀏覽器來完成的。那么如何才能在應(yīng)用程序中自定義網(wǎng)頁瀏覽程序呢?可以使用WebViewClient來完成這個功能。WebViewClient就是專

42、門輔助WebView處理各種通知、請求等事件的類。我們可以通過WebView的setWebViewClient方法來指定一個WebViewClient對象。WebViewClient提供了如表8-3所示的一些方法,我們可以覆蓋這些方法來輔助WebView瀏覽網(wǎng)頁,代碼如下(我們設(shè)置覆蓋shouldOverrideUrlLoading方法,使得當(dāng)有新連接時,使用當(dāng)前的WebView來顯示):通過WebViewClient可以瀏覽網(wǎng)頁的大部分內(nèi)容了,但是現(xiàn)在很多網(wǎng)頁中使用了Javascript腳本語言,比如用Javascript實現(xiàn)的對話框,這時我們?nèi)绾翁幚磉@些對話框呢?Android中還提供了一

43、個重要的類WebChromeClient,專門用來輔助WebView處理Javascript的對話框、網(wǎng)站圖標(biāo)、網(wǎng)站Title、加載進(jìn)度等。WebChromeClient中的方法不是很多,其功能如表8-4所示。下面我們來實現(xiàn)onRevervedTitle方法,用于更改應(yīng)用程序的Title,代碼如下:WebView不但可以運(yùn)行一段HTML代碼,而且還有一個最重要的特點,就是WebView可以同Javascript相互調(diào)用。有了它我們就可以用HTML和Javascript來編寫Android應(yīng)用。下面我們通過一個例子來學(xué)習(xí)WebView如何和Javascript互相調(diào)用,該例子將實現(xiàn)從Androi

44、d應(yīng)用中調(diào)出個人資料,然后通過Javascript顯示出來。首先在Android中定義一個PersonaData類,用來保存?zhèn)€人資料,并且定義得到這些數(shù)據(jù)的成員函數(shù),供Javascript調(diào)用。首先看看運(yùn)行效果,如圖這里需要通過addJavascriptInterface(Object obj,String inter faceName)方法將一個Java對象綁定到一個Javascript對象中,Javascript對象名就是interfaceName,作用域是Global,這樣便可以擴(kuò)展Javascript的API,獲取Android的數(shù)據(jù)。代碼如下ackage com.yarin.andr

45、oid.Examples_08_07;import android.app.Activity;import android.os.Bundle;import android.webkit.WebView;public class Activity01 extends Activityprivate WebView mWebView;private PersonalData mPersonalData;/* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceS

46、tate)super.onCreate(savedInstanceState);setContentView(R.layout.main);mPersonalData = new PersonalData();mWebView = (WebView)this.findViewById(R.id.WebView01);/設(shè)置支持JavaScriptmWebView.getSettings().setJavaScriptEnabled(true);/把本類的一個實例添加到j(luò)s的全局對象window中, /這樣就可以使用window.PersonalData來調(diào)用它的方法mWebView.addJa

47、vascriptInterface(this, "PersonalData");/加載網(wǎng)頁mWebView.loadUrl("file:/android_asset/PersonalData.html");/在js腳本中調(diào)用得到PersonalData對象public PersonalData getPersonalData()return mPersonalData;/js腳本中調(diào)用顯示的資料class PersonalData/js腳本中調(diào)用顯示的資料class PersonalDataString mID;String mName;String m

48、Age;String mBlog;public PersonalData()this.mID="123456789"this.mName="Android"this.mAge="100"this.mBlog=""public String getID()return mID;public String getName()return mName;public String getAge()return mAge;public String getBlog()return mBlog;6. ScanResult、Wi

49、fiConfiguration、WifiInfo、WifiManager、WifiLockWiFi全稱Wireless Fidelity,又稱802.11b標(biāo)準(zhǔn),它的最大優(yōu)點就是傳輸速度較高,可以達(dá)到11Mbps;另外它的有效距離也很長,同時了與已有的各種802.11DSSS設(shè)備兼容。WiFi是一個無線網(wǎng)絡(luò)通信技術(shù)的品牌,由Wi-Fi聯(lián)盟(Wi-Fi Alliance)擁有,目前是改善IEEE 802.11標(biāo)準(zhǔn)的無線網(wǎng)絡(luò)產(chǎn)品之間的互通性。Wi-Fi聯(lián)盟成立于1999年,當(dāng)時的名稱叫做Wireless Ethernet Compatibility Alliance(WECA),2002年10月正

50、式改名為Wi-Fi Alliance。由于WiFi的頻段在世界范圍內(nèi)是無需任何電信運(yùn)營執(zhí)照的免費(fèi)頻段,因此WLAN無線設(shè)備提供了一個世界范圍內(nèi)可用的、費(fèi)用極其低廉且數(shù)據(jù)帶寬極高的無線的空中接口。用戶可以在WiFi覆蓋區(qū)域內(nèi)快速瀏覽網(wǎng)頁,隨時隨地接聽、撥打電話。而其他一些WLAN的寬帶數(shù)據(jù)應(yīng)用,如流媒體、網(wǎng)絡(luò)游戲等功能更是值得用戶期待。有了WiFi功能,我們打長途電話(兇手國際長途)、瀏覽網(wǎng)頁、收發(fā)電子郵件、音樂下載、數(shù)碼照片傳遞等,再也無需擔(dān)心速度慢和花費(fèi)高的問題?,F(xiàn)在WiFi在國內(nèi)的覆蓋范圍越來越廣泛高級賓館、豪華住宅區(qū)、飛機(jī)場以及咖啡廳的場所都有了WiFi接口。當(dāng)我們?nèi)ヂ糜巍⑥k公時,就可以

51、在這些場所使用我們的掌上設(shè)備盡情網(wǎng)上沖浪了。T-Mobile G1自帶了Wi-Fi無線網(wǎng)上,可以在功能表中找到Settings設(shè)置圖標(biāo),進(jìn)入后選擇Wireless controls(無線控制),其中就是WiFi的設(shè)置項。Android也提供了android.wifi包供我們操作,WiFi應(yīng)用程序接口為應(yīng)用程序和底層無線棧交流提供途徑,而底層無線棧又為WiFi提供接入點?;旧蟻碜哉埱蠖说男畔⒍际强梢姷?,包括已經(jīng)連接網(wǎng)絡(luò)的連接速度、IP地址、完成狀態(tài)和更多的信息,比如:可以到達(dá)的其他網(wǎng)絡(luò)的信息,應(yīng)用程序接口的特性(包括掃描、添加、保存、終止和開始與WiFi的連接),當(dāng)然由于WiFi和硬件設(shè)備以及

52、驅(qū)動等有關(guān),主要包括以下幾個類和接口要管理WiFi連接,首先來看看WiFiManager如何使用。中下代碼來WiFiManager對象:wifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI-SERVICE);得到了這個對象,現(xiàn)在可以使用這個對象來WiFi連接。下面我們看看可以進(jìn)行什么樣的操作,WiFiManager的常用方法如表7. 藍(lán)牙功能包,學(xué)習(xí)SMS消息的發(fā)送和接受。具體來說,“藍(lán)牙”是一種短距離的無線連接技術(shù)標(biāo)準(zhǔn)的代稱,藍(lán)牙的實質(zhì)內(nèi)容就是要建立通用的無線電空中接口及其控制軟件的公開標(biāo)準(zhǔn)?!八{(lán)牙”計劃主要面向

53、網(wǎng)絡(luò)中各類數(shù)據(jù)及語音設(shè)備,如PC機(jī),筆記本電腦、打印機(jī)、傳真機(jī)、數(shù)碼相機(jī)、移動電話、家電設(shè)備等,使用無線微波的方式將它們連成一個微微網(wǎng),多個微微網(wǎng)之間也可以互連,從而方便快速地實現(xiàn)各類設(shè)備之間的通信。藍(lán)牙采用分散式網(wǎng)絡(luò)結(jié)構(gòu)以及快跳頻和短包技術(shù),支持點對點及點對多點通信,工作在全球通用的2.4Ghz ISM(即工業(yè)、科學(xué)、醫(yī)學(xué))頻段,其數(shù)據(jù)速率為1Mbps,采用時分雙工傳輸方案實現(xiàn)全雙工傳輸。有關(guān)藍(lán)牙的類和接口位于android.bluetooth包中,首先我們看看藍(lán)牙包中提供了哪些功能,如表8-6所示。這些藍(lán)牙API允許應(yīng)用程序連接和斷開藍(lán)牙耳機(jī)、掃描儀和其他藍(lán)牙設(shè)備,包括編寫和修改本地服務(wù)的SDP協(xié)議數(shù)據(jù)庫和查詢其他藍(lán)牙設(shè)備上的SDP協(xié)議數(shù)據(jù)庫,在Android上建立RFCOMM協(xié)議的連接并連接到其他指定設(shè)備上。 下面我們依然通過一個示例來學(xué)習(xí)Android上的藍(lán)牙包的使用,程序運(yùn)行結(jié)果如圖每一個按鈕代表了一個不同的藍(lán)牙功能,下面我們就一一來學(xué)習(xí)這些功能。具體源代碼請參見本書所附代碼:第8章Examples_08_09。 首先,我們要使用藍(lán)牙API,并且

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論