編輯:開發入門
簡介
本文建立在 “使用 Eclipse 開發 android 應用程序” 一文的基礎之上,探究了 Android 的網絡功能。了解如何利用 Android 的網絡選項來實現有趣、有用的東西。android 平台非常適合 Java™ 開發人員:他們可以使用已有的技能將網絡連接帶到一個移動或 “嵌入式” 平台中。
在本文中,了解用於 Android 應用程序的網絡選項以及基本的 Android 聯網技巧。本文研究一個真實的應用程序,它在結合使用環境監視系統時需要具備聯網功能。這類系統為什麼如此重要?原因之一是:如果您的朋友需要外出幾個星期,在他離開後,他打電話給我,讓我從他家裡找到某樣東西並郵寄給他。我來到他的家裡,發現供暖設備已經被切斷並且水管已經凍裂 — 場面非常混亂。如果備有一個溫度監控系統,那麼就可以避免出現這類事故。本文將探查 android 在這類監控系統中扮演的角色。
android 聯網功能
Android 基於 Linux® 內核,包含一組優秀的聯網功能。如果尚未安裝 android SDK,那麼需要 下載 它才能實踐本文的示例。
表 1 展示了 android SDK 中一些與網絡有關的包。
表 1. android SDK 網絡包
上表並沒有列出所有包,但是可以讓您清楚地意識到該平台的強大功能。下一小節將介紹一些簡單的網絡示例。
簡單的網絡示例
為了演示將 android 連接到一個網絡有多麼簡單,這個示例將展示如何從 Web 頁面發送文本。可以 下載 本例的源代碼。圖 1 展示了應用程序的實際使用。
圖 1. 從 Web 頁面獲取文本
本節提供了構建示例應用程序所需的代碼。我們將首先查看 UI 部分,然後介紹與網絡有關的代碼。
共有三個 UI 元素:
清單 1 展示了 main.XML 文件,這是該應用程序的完整 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) { } } }); } }
這些代碼可以分解成一些常見的部分。這裡使用一些重要(必需)的導入語句來恰當地引用 UI、數據傳遞以及應用程序中使用的與網絡有關的類。所有與網絡相關的代碼出現在 OnClickListener
的OnClick
方法中。在選擇 圖 1 所示的標簽為 go!
的按鈕之後調用這些代碼。
URL
和 URLConnection
類共同提供與用戶所選的 Web 站點的連接。BufferedReader
的一個實例負責從 Web 站點連接中讀取傳入的數據。每讀取一行代碼,文本就被附加到一個 TextView。數據並沒有直接指定給 TextVIEw(但是在本例中可以)。我們引入了一種設計模式,即創建一個消息對象並將該對象發送到一個處理程序的實例。這是更新 UI 的一種比較可取的方法,對可能需要同時運行多個線程的應用程序而言尤其如此。
在示例中,android 應用程序與 HTTP Web 服務器進行通信,比如 apache 或 Internet Information Server(IIS 位於 Microsoft® 服務器上)。如果應用程序直接與 TCP socket 對話,那麼您將以不同的方式實現應用程序。清單 3 所示的代碼片段展示了另一種與遠程服務器交互的方式。這個清單被實現為一個單獨的線程。
清單 3. Daytime 客戶機
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()); } } }
與前面的示例類似,上面的代碼使用消息和處理程序方法來將數據發送給調用者,調用者將更新 UI 並執行後續處理。與 清單 1 不同,這個例子並沒有與 HTTP 服務器通信,因此沒有使用 URLConnection
類。相反,使用了較低級的 Socket
類在端口 13 打開與遠程服務器的基於流的 socket 連接。端口 13 是典型的 “Daytime Server” 應用程序。
Daytime Server 接受傳入的 socket 連接並以文本的形式將日期和時間發送給調用 socket。一旦發送完數據,服務器將關閉 socket。示例也展示了 InputStreamReader
的使用和一個特定字符編碼。
發送文本消息是您需要使用 android 完成的另一項任務。清單 4 展示了一個示例。
清單 4. 發送一條文本消息
void sendMessage(String recipIEnt,String myMessage) { SmsManager sm = SmsManager.getDefault(); sm.sendTextMessage("destination number",null,"hello there",null,null); }
發送文本消息非常簡單。首先,使用靜態方法 getDefault()
獲取對 SmsManager 的引用。然後調用 sendTextMessage
方法。參數為:
不管是連接到 Web 頁面還是連接到定制 TCP 應用程序,android 平台都可以立即反應並且能夠提供幫助。如 清單 4 所示,發送文本消息非常簡單。通過使用可選的 intent 參數,甚至可以在消息被發送並交付後采取操作。這是其他移動平台所不具備的強大特性。
下一節將快速浏覽一個真實的應用程序設計。
Android 應用程序一個最常見的任務就是檢索數據或通過網絡將數據發送到遠程服務器。這一操作的結果通常是一些您想要展示給用戶的新數據。這意味著您需要修改用戶界面。大多
使用小部件的樣例應用程序現在我們要修改現有應用程序,使其像圖 8 中所示的那樣。本例的目的在於讓讀者熟悉在真實應用程序中對 textVIEw、editText
編者按:本文為一位第一線的android開發者在經過三周學習Android收集整理的一份android 2.2開發初學者的入門培訓教程。文章深淺得當,對於剛剛學習and
android 術語典型的 android 應用程序具有如下組件。同時下面還有 android Developer 站點 提供的定義:活動 — 一個
XMLvsJSON 應用程序真實的實時更新需要注意的是,樣例應用程序沒