使用 Android 实现联网
Frank Ableson, 軟件設(shè)計(jì)師
簡(jiǎn)介:?Android 是面向應(yīng)用程序開(kāi)發(fā)的豐富平臺(tái),它提供一套出色的用戶(hù)界面元素和數(shù)據(jù)管理功能。它還為開(kāi)發(fā)連接到真實(shí)世界的應(yīng)用程序提供了出色的網(wǎng)絡(luò)選項(xiàng)。您希望連接到哪 里?也許您希望告訴全世界您正在使用 Twitter。或者希望收到有關(guān)在本地洗衣店或熟食店的排號(hào)。如果希望將 Android 連接到您所生活的世界,那么請(qǐng)閱讀本文。
本文的標(biāo)簽:? 社交網(wǎng)絡(luò)
發(fā)布日期:?2009 年 6 月 29 日
簡(jiǎn)介
本文建立在 “使用 Eclipse 開(kāi)發(fā) Android 應(yīng)用程序” 一文的基礎(chǔ)之上,探究了 Android 的網(wǎng)絡(luò)功能。了解如何利用 Android 的網(wǎng)絡(luò)選項(xiàng)來(lái)實(shí)現(xiàn)有趣、有用的東西。Android 平臺(tái)非常適合 Java? 開(kāi)發(fā)人員:他們可以使用已有的技能將網(wǎng)絡(luò)連接帶到一個(gè)移動(dòng)或 “嵌入式” 平臺(tái)中。
在本文中,了解用于 Android 應(yīng)用程序的網(wǎng)絡(luò)選項(xiàng)以及基本的 Android 聯(lián)網(wǎng)技巧。本文研究一個(gè)真實(shí)的應(yīng)用程序,它在結(jié)合使用環(huán)境監(jiān)視系統(tǒng)時(shí)需要具備聯(lián)網(wǎng)功能。這類(lèi)系統(tǒng)為什么如此重要?原因之一是:如果您的朋友需要外出幾個(gè)星 期,在他離開(kāi)后,他打電話(huà)給我,讓我從他家里找到某樣?xùn)|西并郵寄給他。我來(lái)到他的家里,發(fā)現(xiàn)供暖設(shè)備已經(jīng)被切斷并且水管已經(jīng)凍裂 — 場(chǎng)面非常混亂。如果備有一個(gè)溫度監(jiān)控系統(tǒng),那么就可以避免出現(xiàn)這類(lèi)事故。本文將探查 Android 在這類(lèi)監(jiān)控系統(tǒng)中扮演的角色。
回頁(yè)首
Android 聯(lián)網(wǎng)功能
Android 基于 Linux? 內(nèi)核,包含一組優(yōu)秀的聯(lián)網(wǎng)功能。如果尚未安裝 Android SDK,那么需要 下載 它才能實(shí)踐本文的示例。
表 1 展示了 Android SDK 中一些與網(wǎng)絡(luò)有關(guān)的包。
表 1. Android SDK 網(wǎng)絡(luò)包
| java.net | 提供與聯(lián)網(wǎng)有關(guān)的類(lèi),包括流和數(shù)據(jù)包(datagram)sockets、Internet 協(xié)議和常見(jiàn) HTTP 處理。該包是一個(gè)多功能網(wǎng)絡(luò)資源。有經(jīng)驗(yàn)的 Java 開(kāi)發(fā)人員可以立即使用這個(gè)熟悉的包創(chuàng)建應(yīng)用程序。 |
| java.io | 雖然沒(méi)有提供顯式的聯(lián)網(wǎng)功能,但是仍然非常重要。該包中的類(lèi)由其他 Java 包中提供的 socket 和連接使用。它們還用于與本地文件(在與網(wǎng)絡(luò)進(jìn)行交互時(shí)會(huì)經(jīng)常出現(xiàn))的交互。 |
| java.nio | 包含表示特定數(shù)據(jù)類(lèi)型的緩沖區(qū)的類(lèi)。適合用于兩個(gè)基于 Java 語(yǔ)言的端點(diǎn)之間的通信。 |
| org.apache.* | 表示許多為 HTTP 通信提供精確控制和功能的包。可以將 Apache 視為流行的開(kāi)源 Web 服務(wù)器。 |
| android.net | 除核心 java.net.* 類(lèi)以外,包含額外的網(wǎng)絡(luò)訪(fǎng)問(wèn) socket。該包包括 URI 類(lèi),后者頻繁用于 Android 應(yīng)用程序開(kāi)發(fā),而不僅僅是傳統(tǒng)的聯(lián)網(wǎng)方面。 |
| android.net.http | 包含處理 SSL 證書(shū)的類(lèi)。 |
| android.net.wifi | 包含在 Android 平臺(tái)上管理有關(guān) WiFi(802.11 無(wú)線(xiàn) Ethernet)所有方面的類(lèi)。并不是所有設(shè)備都配備了 WiFi 功能,特別是 Android 在 Motorola 和 LG 等手機(jī)制造商的 “翻蓋手機(jī)” 領(lǐng)域獲得了成功。 |
| android.telephony.gsm | 包含用于管理和發(fā)送 SMS(文本)消息的類(lèi)。一段時(shí)間后,可能會(huì)引入額外的包來(lái)來(lái)為非 GSM 網(wǎng)絡(luò)提供類(lèi)似的功能,比如 CDMA 或 android.telephony.cdma 等網(wǎng)絡(luò)。 |
上表并沒(méi)有列出所有包,但是可以讓您清楚地意識(shí)到該平臺(tái)的強(qiáng)大功能。下一小節(jié)將介紹一些簡(jiǎn)單的網(wǎng)絡(luò)示例。
回頁(yè)首
簡(jiǎn)單的網(wǎng)絡(luò)示例
為了演示將 Android 連接到一個(gè)網(wǎng)絡(luò)有多么簡(jiǎn)單,這個(gè)示例將展示如何從 Web 頁(yè)面發(fā)送文本。可以 下載 本例的源代碼。圖 1 展示了應(yīng)用程序的實(shí)際使用。
圖 1. 從 Web 頁(yè)面獲取文本
本節(jié)提供了構(gòu)建示例應(yīng)用程序所需的代碼。我們將首先查看 UI 部分,然后介紹與網(wǎng)絡(luò)有關(guān)的代碼。
共有三個(gè) UI 元素:
- EditText 讓用戶(hù)能夠進(jìn)入一個(gè) Web 頁(yè)面(圖 1 和 清單 2 所示的 http://developer.android.com)。
- 使用一個(gè)按鈕告訴程序取回 Web 頁(yè)面文本。
- 檢索回?cái)?shù)據(jù)后,它將顯示在 TextView 中。
清單 1 展示了 main.xml 文件,這是該應(yīng)用程序的完整 UI 布局。
清單 1. main.xml
| <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:layout_height="wrap_content" android:id="@+id/address" android:layout_width="fill_parent" android:text="http://google.com" > </EditText> <Button android:id="@+id/ButtonGo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="go!" > </Button> <TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff" android:textColor="#000000" android:id="@+id/pagetext" /> </LinearLayout> |
清單 2 展示了本示例使用的 Java 代碼。
清單 2. GetWebPage.java
| package com.msi.getwebpage; import android.app.Activity; import android.os.Bundle; // used for interacting with user interface import android.widget.Button; import android.widget.TextView; import android.widget.EditText; import android.view.View; // used for passing data import android.os.Handler; import android.os.Message; // used for connectivity import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; public class GetWebPage extends Activity { /** Called when the activity is first created. */ Handler h; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final EditText eText = (EditText) findViewById(R.id.address); final TextView tView = (TextView) findViewById(R.id.pagetext); this.h = new Handler() { @Override public void handleMessage(Message msg) { // process incoming messages here switch (msg.what) { case 0: tView.append((String) msg.obj); break; } super.handleMessage(msg); } }; final Button button = (Button) findViewById(R.id.ButtonGo); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { try { tView.setText(""); // Perform action on click URL url = new URL(eText.getText().toString()); URLConnection conn = url.openConnection(); // Get the response BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = ""; while ((line = rd.readLine()) != null) { Message lmsg; lmsg = new Message(); lmsg.obj = line; lmsg.what = 0; GetWebPage.this.h.sendMessage(lmsg); } } catch (Exception e) { } } }); } } |
這些代碼可以分解成一些常見(jiàn)的部分。這里使用一些重要(必需)的導(dǎo)入語(yǔ)句來(lái)恰當(dāng)?shù)匾?UI、數(shù)據(jù)傳遞以及應(yīng)用程序中使用的與網(wǎng)絡(luò)有關(guān)的類(lèi)。所有與網(wǎng)絡(luò)相關(guān)的代碼出現(xiàn)在 OnClickListener 的 OnClick 方法中。在選擇 圖 1 所示的標(biāo)簽為 go! 的按鈕之后調(diào)用這些代碼。
URL 和 URLConnection 類(lèi)共同提供與用戶(hù)所選的 Web 站點(diǎn)的連接。BufferedReader 的一個(gè)實(shí)例負(fù)責(zé)從 Web 站點(diǎn)連接中讀取傳入的數(shù)據(jù)。每讀取一行代碼,文本就被附加到一個(gè) TextView。數(shù)據(jù)并沒(méi)有直接指定給 TextView(但是在本例中可以)。我們引入了一種設(shè)計(jì)模式,即創(chuàng)建一個(gè)消息對(duì)象并將該對(duì)象發(fā)送到一個(gè)處理程序的實(shí)例。這是更新 UI 的一種比較可取的方法,對(duì)可能需要同時(shí)運(yùn)行多個(gè)線(xiàn)程的應(yīng)用程序而言尤其如此。
在示例中,Android 應(yīng)用程序與 HTTP Web 服務(wù)器進(jìn)行通信,比如 Apache 或 Internet Information Server(IIS 位于 Microsoft? 服務(wù)器上)。如果應(yīng)用程序直接與 TCP socket 對(duì)話(huà),那么您將以不同的方式實(shí)現(xiàn)應(yīng)用程序。清單 3 所示的代碼片段展示了另一種與遠(yuǎn)程服務(wù)器交互的方式。這個(gè)清單被實(shí)現(xiàn)為一個(gè)單獨(dú)的線(xiàn)程。
清單 3. Daytime 客戶(hù)機(jī)
| public class Requester extends Thread { Socket requestSocket; String message; StringBuilder returnStringBuffer = new StringBuilder(); Message lmsg; int ch; @Override public void run() { try { this.requestSocket = new Socket("remote.servername.com", 13); InputStreamReader isr = new InputStreamReader(this.requestSocket. getInputStream(), "ISO-8859-1"); while ((this.ch = isr.read()) != -1) { this.returnStringBuffer.append((char) this.ch); } this.message = this.returnStringBuffer.toString(); this.lmsg = new Message(); this.lmsg.obj = this.message; this.lmsg.what = 0; h.sendMessage(this.lmsg); this.requestSocket.close(); } catch (Exception ee) { Log.d("sample application", "failed to read data" + ee.getMessage()); } } } |
與前面的示例類(lèi)似,上面的代碼使用消息和處理程序方法來(lái)將數(shù)據(jù)發(fā)送給調(diào)用者,調(diào)用者將更新 UI 并執(zhí)行后續(xù)處理。與 清單 1 不同,這個(gè)例子并沒(méi)有與 HTTP 服務(wù)器通信,因此沒(méi)有使用 URLConnection 類(lèi)。相反,使用了較低級(jí)的 Socket 類(lèi)在端口 13 打開(kāi)與遠(yuǎn)程服務(wù)器的基于流的 socket 連接。端口 13 是典型的 “Daytime Server” 應(yīng)用程序。
Daytime Server 接受傳入的 socket 連接并以文本的形式將日期和時(shí)間發(fā)送給調(diào)用 socket。一旦發(fā)送完數(shù)據(jù),服務(wù)器將關(guān)閉 socket。示例也展示了 InputStreamReader 的使用和一個(gè)特定字符編碼。
發(fā)送文本消息是您需要使用 Android 完成的另一項(xiàng)任務(wù)。清單 4 展示了一個(gè)示例。
清單 4. 發(fā)送一條文本消息
| void sendMessage(String recipient,String myMessage) { SmsManager sm = SmsManager.getDefault(); sm.sendTextMessage("destination number",null,"hello there",null,null); } |
發(fā)送文本消息非常簡(jiǎn)單。首先,使用靜態(tài)方法 getDefault() 獲取對(duì) SmsManager 的引用。然后調(diào)用 sendTextMessage 方法。參數(shù)為:
接收者的手機(jī)號(hào)不管是連接到 Web 頁(yè)面還是連接到定制 TCP 應(yīng)用程序,Android 平臺(tái)都可以立即反應(yīng)并且能夠提供幫助。如 清單 4 所示,發(fā)送文本消息非常簡(jiǎn)單。通過(guò)使用可選的 intent 參數(shù),甚至可以在消息被發(fā)送并交付后采取操作。這是其他移動(dòng)平臺(tái)所不具備的強(qiáng)大特性。
下一節(jié)將快速瀏覽一個(gè)真實(shí)的應(yīng)用程序設(shè)計(jì)。
回頁(yè)首
環(huán)境監(jiān)控系統(tǒng)
在這個(gè)場(chǎng)景中,我們假設(shè)您是企業(yè)所在的若干辦公場(chǎng)所的資產(chǎn)管理員。管理資產(chǎn)與管理數(shù)據(jù)中心沒(méi)有太大的差別 — 一般情況下都很枯燥,只有出現(xiàn)緊急的情況下工作才會(huì)比較有意思。幾天前,一臺(tái)使用了 10 年的熱水器突然漏水,滲到一個(gè)裝滿(mǎn)老式 PC 和培訓(xùn)手冊(cè)的存儲(chǔ)柜,您必須檢查一下清理情況。幸運(yùn)的是,您當(dāng)時(shí)沒(méi)有外出。如果您在旅途中的話(huà),那么情形將非常糟糕。此類(lèi)災(zāi)難性事故促使我們考慮使用 Android 來(lái)幫助監(jiān)視資產(chǎn)的維護(hù)情況。圖 2 展示了此類(lèi)系統(tǒng)的一個(gè)高級(jí)方框圖。
圖 2. 監(jiān)控系統(tǒng)的高級(jí)方框圖
此架構(gòu)是一種比較傳統(tǒng)的方法,使用一個(gè)微控制器與一些簡(jiǎn)單場(chǎng)景進(jìn)行交互以收集數(shù)據(jù)。數(shù)據(jù)隨后通過(guò)一個(gè)串行通信協(xié)議(比如 RS232 或 RS485)發(fā)送到控制器。控制器可以是一個(gè) PC 或類(lèi)似的機(jī)器。隨后可以穿過(guò)防火墻通過(guò) Internet 訪(fǎng)問(wèn)數(shù)據(jù)。Android 電話(huà)(比如 TMobile G1)之間使用的協(xié)議可以是 HTTP 或私有協(xié)定。
在控制器和配備 Android 的設(shè)備之間發(fā)送的數(shù)據(jù)將是表示以下內(nèi)容的基本數(shù)據(jù):
- 出現(xiàn)漏水
- 當(dāng)前溫度
- 消耗的功率
- 可能包含一些通用的類(lèi)似數(shù)據(jù)和數(shù)字值
為什么需要關(guān)注消耗的功率?一個(gè)可能的原因就是有些人忘記關(guān)閉機(jī)器,因此電費(fèi)單上的數(shù)字會(huì)一直增長(zhǎng)。第二個(gè)理由有些復(fù)雜:假設(shè)您有一臺(tái)非常大 的冰箱,并且電源可能已被關(guān)閉。那么情況就復(fù)雜了,而且處理起來(lái)也需要很高的代價(jià)。或者,空調(diào)設(shè)備的斷路器出現(xiàn)故障,因此機(jī)房無(wú)法保持恒定的溫度。
基本的設(shè)計(jì)看上去是可行的。如果使用的是 Android,那么可以使用任何移動(dòng)平臺(tái)來(lái)替換 圖 2 中的 Android。但如果使用配備了 Android 的設(shè)備替換微控制器,那應(yīng)該怎么做呢?下一節(jié)將討論對(duì)這個(gè)應(yīng)用程序的擴(kuò)展以及通過(guò)使用 Android 而啟用的特性。
回頁(yè)首
擴(kuò)展應(yīng)用程序
本文的第一個(gè)架構(gòu)以一個(gè)微控制器為中心。微控制器可分為不同的外形和大小,從 Microchip 的 6 pin “10F” 到添加了外圍設(shè)備、pin 和代碼空間的 32 位大型微控制器。如果使用 Android 取代傳統(tǒng)的微控制器放到設(shè)備中,會(huì)怎么樣?對(duì)于某些應(yīng)用程序而言,在成本方面是不可取的,但是根據(jù)圖 3 的判斷,這種方法也是可行的。
圖 3. 在設(shè)備中使用 Android 的可能架構(gòu)
使用嵌入式的方式部署 Android 為您提供了更加豐富的編程環(huán)境。您可以和以前一樣繼續(xù)監(jiān)視濕度、溫度和功率消耗特征,同時(shí)還可以觀察到記錄音頻、視頻和振動(dòng)。您將擁有一個(gè)微報(bào)警、訪(fǎng)問(wèn)控 制系統(tǒng),以及一個(gè)環(huán)節(jié)監(jiān)控工具。由于 Android 已經(jīng)可以實(shí)現(xiàn)聯(lián)網(wǎng),您不需要使用控制器 PC 就可以實(shí)現(xiàn)監(jiān)控并與網(wǎng)絡(luò)直接對(duì)話(huà)。
這種方法還為現(xiàn)場(chǎng)更新軟件提供了額外的好處。假設(shè)您希望為監(jiān)控軟件添加新的特性(或修復(fù) bug)。如果使用傳統(tǒng)的微控制器方法,那么任務(wù)執(zhí)行起來(lái)將十分繁瑣并且代價(jià)昂貴,甚至根本不可能實(shí)現(xiàn)。而對(duì)于 Android 而言,您可以獲得更整潔的部署模型并擁有更好的靈活性。
Android 如今主要運(yùn)行在移動(dòng)手機(jī)中,但是它已經(jīng)被移植到 NetBooks 和其他平臺(tái)上。希望本文為您提供了一些好的思考內(nèi)容。我現(xiàn)在該去運(yùn)行我的系統(tǒng)了。您永遠(yuǎn)也不會(huì)知道下一次熱水器漏水會(huì)在什么時(shí)候發(fā)生。
回頁(yè)首
結(jié)束語(yǔ)
在本文中,我們大體介紹了 Android 的聯(lián)網(wǎng)功能。您了解了一些自己可以創(chuàng)建的樣例應(yīng)用程序,包括與 Web 服務(wù)器交互和發(fā)送文本消息。您看到了如何將 Android 連接到一個(gè)真實(shí)的環(huán)境監(jiān)控系統(tǒng)。通過(guò)代碼示例,您了解到應(yīng)該在什么時(shí)候?qū)?Android 擴(kuò)展到一些特殊應(yīng)用程序中,比如嵌入式控制器。
請(qǐng)繼續(xù)關(guān)注我的下一篇文章,它將介紹如何使用基于 Android 的電話(huà)構(gòu)建一個(gè)嬰兒監(jiān)控系統(tǒng)。
回頁(yè)首
下載
| GetWebPage 源代碼 | os-android-networking_GetWebPage.zip | 14KB | HTTP |
關(guān)于下載方法的信息
參考資料
學(xué)習(xí)
- 閱讀 “用 Eclipse 開(kāi)發(fā) Android 應(yīng)用程序”。
? - Android developers 站點(diǎn) 提供文檔、下載、博客等眾多內(nèi)容。
? - 了解 Android 的贊助商 Open Handset Alliance,它是由 47 家技術(shù)和移動(dòng)公司組成的組織,致力于加速移動(dòng)平臺(tái)的創(chuàng)新,并為客戶(hù)提供豐富的、廉價(jià)的、出色的移動(dòng)體驗(yàn)。
? - 深入 分析 Unlocking Android。
? - 進(jìn)一步了解 Dalvik Virtual Machine。
? - 查看 YouTube 上面的 教程,它們討論了 Dalvik VM 的內(nèi)部細(xì)節(jié)。
? - Unlocking Android: A Developer's Guide 提供關(guān)于 Android 操作系統(tǒng)和開(kāi)發(fā)工具的簡(jiǎn)要?jiǎng)邮种笇?dǎo)。
? - 要收聽(tīng)針對(duì)軟件開(kāi)發(fā)人員的有趣訪(fǎng)談和討論,請(qǐng)查看 developerWorks podcasts。
? - 隨時(shí)關(guān)注 developerWorks 技術(shù)活動(dòng)和網(wǎng)絡(luò)廣播。
? - 查閱最近將在全球舉辦的面向 IBM 開(kāi)放源碼開(kāi)發(fā)人員的研討會(huì)、交易展覽、網(wǎng)絡(luò)廣播和其他 活動(dòng)。
? - 訪(fǎng)問(wèn) developerWorks Open source 專(zhuān)區(qū),獲得豐富的 how-to 信息、工具和項(xiàng)目更新,幫助您用開(kāi)放源碼技術(shù)進(jìn)行開(kāi)發(fā),并與 IBM 產(chǎn)品結(jié)合使用。
? - 查看免費(fèi)的 developerWorks 演示中心,觀看并了解 IBM 及開(kāi)源技術(shù)和產(chǎn)品功能。
?
獲得產(chǎn)品和技術(shù)
- 下載 Android SDK。
? - 下載 最新的 Eclipse IDE。
? - 使用 IBM 試用軟件 改進(jìn)您的下一個(gè)開(kāi)發(fā)項(xiàng)目,這些軟件可以通過(guò)下載獲得。
? - 下載 IBM 產(chǎn)品評(píng)估試用軟件 或 IBM SOA Sandbox for Reuse,并開(kāi)始使用來(lái)自 DB2?、Lotus?、Rational?、Tivoli? 和 WebSphere? 的應(yīng)用程序開(kāi)發(fā)工具和中間件產(chǎn)品。
?
討論
- 參與 developerWorks blogs 并加入 developerWorks 社區(qū)。
?
關(guān)于作者
Frank Ableson 是新澤西州北部的一名企業(yè)家和軟件開(kāi)發(fā)人員,擅長(zhǎng)開(kāi)發(fā)移動(dòng)和嵌入式應(yīng)用程序軟件。他目前正在為 Manning Publications 撰寫(xiě)一本關(guān)于 Android 應(yīng)用程序開(kāi)發(fā)的圖書(shū)。他感興趣的專(zhuān)業(yè)領(lǐng)域包括嵌入式系統(tǒng)、無(wú)線(xiàn)通信和汽車(chē)電子。他最大的支持者就是他的妻子 Nikki 和他們的孩子。
轉(zhuǎn)載于:https://www.cnblogs.com/shihao/archive/2012/01/05/2313360.html
總結(jié)
以上是生活随笔為你收集整理的使用 Android 实现联网的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: js代码收集(1)_隐藏div、tabl
- 下一篇: 网络资源备份 杨萃先书