本教程介紹如何在 Eclipse 環境中進行 Android 應用程序開發,包括兩個示例應用程序。第一個示例是一個基本的應用程序,涉及構建和調試的所有階段。第二個應用程序示例涉及比較複雜的 Android 特性,包括聯系人搜索和 Google Maps 地址查找。要想從本教程獲得最大收益,具備移動開發經驗會有幫助,但不是必需的。開發 Android 應用程序需要 Java™ 編程技能,但是對于本教程不是必需的。
關于本教程
我們爲什麽要關注 Android?有兩個原因使 Android 成爲重要的平台。首先,Google 引入了 Android,它在很短時間內就獲得了市場的關注。Google 正在進軍移動市場。它在這個市場上采取的第一個行動就是發布 Android 和 Open Handset Alliance,這是一個令人印象深刻的起點。第二,Android 不僅僅是另一種包含電話、菜單和觸摸屏功能的移動平台。您將在本教程中了解到,Android 提供了一種不同的應用程序開發方法。由于可以對請求的操作和代碼進行運行時綁定,Android 的體系結構支持高度可定制的軟件環境。無論是考慮市場因素還是 Android 的技術方面,它都是一個值得研究的平台。
本教程分爲以下幾節:
系統需求
本教程需要結合使用幾種技術。
Eclipse 平台Eclipse 是一個運行插件的平台。您應該安裝 Eclipse Classic 的最新版本(本教程使用 V3.3.1)。Android Developer Tools按照 安裝 Android SDK 中的說明安裝 Android Developer Tools(Eclipse 插件)。Android 簡介
在討論 Eclipse 插件和開發 Android 應用程序之前,我們先看看 Android 的體系結構和一些重要的術語,這會對本教程後面的討論和您自己構建 Android 應用程序有幫助。
Android 術語
在 Eclipse 環境中開發 Android 應用程序需要了解 Eclipse 環境和 Android 平台的知識。了解以下術語會有助于用 Eclipse 插件開發 Android 應用程序。
Open Handset Alliance這是一個由 Google 公司主導的組織,它由許多公共和私人組織組成。Android這是 Open Handset Alliance 的主打産品。它是一種針對移動設備的開放源碼操作環境。模擬器模擬另一個系統的軟件工具 — 這常常是在個人計算機(IBM®、Mac、Linux®)上運行的一個環境,它模擬另一個環境,比如移動計算設備。Linux一種開放源碼的操作系統內核,許多計算平台都使用這種操作系統,包括服務器、桌面計算機、網絡設備和移動計算設備。Android 在 Linux 內核上運行。Dalvik Virtual MachineDalvik VM 是 Android 産品組合中的一種操作環境,它在運行時解釋應用程序代碼。Dalvik VM 與 Java VM 相似,但是兩者不兼容。Android 基礎知識和必需的工具
Android 是一種針對移動平台的開放源碼操作系統。到編寫本教程時,它是一種純軟件的平台,沒有可用的硬件設備。
Android 平台被稱爲一個産品組合,因爲它是一系列組件的集合,包括:
簡要介紹了 Android 平台的體系結構之後,我們來從市場的角度看看這個平台的一些重要特性。
Android 爲什麽很重要?
自從 Android 和最初的 SDK 發布以來,計算機技術新聞界一直非常關注 Android。Android 之所以重要主要有兩個原因。
Android 是 Google 進軍移動市場的主要行動。移動應用程序領域競爭激烈,新的競爭者很難涉足。Google 擁有大量資源和強大的品牌實力,有能力涉足任何市場。Google 進軍移動市場已經好幾年了。Android 原來屬于另一家公司,Google 通過收購這家公司大大提高了在移動市場上的競爭力。Google 的任何行動都會受到關注,而且引入新平台也很引人注目。Android 同時具備這兩個因素。
第二個原因是 Android 的應用程序模型與衆不同。Android 應用程序並不是需要大量單擊操作的純粹的菜單式應用程序。Android 應用程序中確實有菜單和按鈕,但是 Android 在體系結構中引入了一種新穎的設計元素 intent。
intent
intent 是一種構造,應用程序可以通過它發出請求,這就像是發出求助信號。intent 可能像下面這樣:
"Wanted: An application to help me look up a contact" 或 "Wanted: An application to help me display this image" 或 "Wanted: An application to perform this geographic-based search"
應用程序可以按照相似或互補的方式進行注冊,表明它們有能力或有興趣執行各種請求或 intent。比如:
"Available: Application ready and willing to present contact records in clear, concise manner" 或 "Available: Application ready and willing to perform a geographic search"
這些是 IntentFilter 的示例,下面將要討論。
IntentFilter
應用程序通過一個稱爲 IntentFilter 的構造聲明它們能夠執行某些類型的操作。IntentFilter 可以在運行時進行注冊,也可以在 AndroidManifest.xml 文件中設置。下面的代碼片段取自一個對 SMS(文本)消息進行響應的 Android 應用程序:
簡要介紹 intent 和 IntentFilter 之後,下一節介紹 Android 應用程序的四種主要類型。
Android 應用程序 — 概述
我們來看看 Android 應用程序的四種主要類型:活動、服務、接收器和 ContentProvider。我們還要看看顯示用戶界面(UI)元素的視圖。
活動
活動是最常用的 Android 應用程序形式。活動在一個稱爲視圖 的類的幫助下,爲應用程序提供 UI。視圖類實現各種 UI 元素,比如文本框、標簽、按鈕和計算平台上常見的其他 UI 元素。
一個應用程序可以包含一個或多個活動。這些活動通常與應用程序中的屏幕形成一對一關系。
應用程序通過調用 startActivity() 或 startSubActivity() 方法從一個活動轉移到另一個活動。如果應用程序只需 “切換” 到新的活動,就應該使用前一個方法。如果需要異步的調用/響應模式,就使用後一個方法。在這兩種情況下,都需要通過方法的參數傳遞一個 intent。
由操作系統負責決定哪個活動最適合滿足指定的 intent。
服務和接收器
與其他多任務計算環境一樣,“在後台” 運行著一些應用程序,它們執行各種任務。Android 把這種應用程序稱爲 “服務”。服務是沒有 UI 的 Android 應用程序。
接收器是一個應用程序組件,它接收請求並處理 intent。與服務一樣,接收器在一般情況下也沒有 UI 元素。接收器通常在 AndroidManifest.xml 文件中注冊。清單 2 是接收器代碼的示例。注意,接收器的類屬性是負責實現這個接收器的 Java 類。
用 ContentProvider 進行數據管理
ContentProvider 是 Android 的數據存儲抽象機制。我們以移動設備上常見的一種數據爲例:地址簿或聯系人數據庫。地址簿包含所有聯系人及其電話號碼,用戶在使用手機時可能需要使用這些數據。ContentProvider 對數據存儲的訪問方法進行抽象。ContentProvider 在許多方面起到數據庫服務器的作用。對數據存儲中數據的讀寫操作應該通過適當的 ContentProvider 傳遞,而不是直接訪問文件或數據庫。可能還有 ContentProvider 的 “客戶機” 和 “實現”。
下一節介紹 Android 視圖,這是 Android 在移動設備屏幕上顯示 UI 元素的機制。
視圖
Android 活動通過視圖顯示 UI 元素。視圖采用以下布局設計之一:
LinearVertical後續的每個元素都排在前一個元素下面,形成一個單一列。LinearHorizontal後續的每個元素都排在前一個元素右邊,形成一個單一行。Relative後續的每個元素相對于前一個元素有一定的偏移量。Table與 HTML 表相似的一系列行和列。每個單元格可以包含一個視圖元素。選擇一種布局(或布局的組合)之後,就可以用各個視圖顯示 UI。
視圖元素由大家熟悉的 UI 元素組成,包括:
視圖是在一個 XML 文件中定義的。清單 3 給出一個簡單的 LinearVertical 布局示例。
注意,每個元素有一個或多個屬于 Android 名稱空間的屬性。
下一節討論如何獲取 Android SDK 並在 Eclipse 環境中配置它。
Android Software Developer Kit
我們已經大致了解了 Android 平台,現在討論如何設置 Eclipse 環境來支持 Android 應用程序開發。本節討論如何獲取 Android SDK 並在 Eclipse 環境中配置它。
獲取和安裝 Eclipse
如果您還沒有安裝 Eclipse,那麽從 Eclipse Foundation 下載並安裝 Eclipse IDE 最新的穩定版(參見 參考資料)。安裝包是一個壓縮的文件夾。把這個文件夾的內容解壓到您計算機上的適當位置。安裝程序並不在 Windows® 上創建任何圖標或快捷方式。對于本教程,Eclipse 文件夾位于 c:\software\eclipse 目錄。
雙擊 eclipse 安裝目錄中的 eclipse.exe 啓動 Eclipse。這會啓動 IDE。軟件提示您指定一個 “工作空間” 並建議一個默認位置,比如 c:\documents and settings\username\workspace。選擇這個位置或者指定另一個工作空間位置。
啓動 Eclipse 之後,單擊主屏幕上的 Workbench - Go to the workbench 圖標。
現在該獲取 Android SDK 了。
獲取和安裝 Android SDK
在 參考資料 中找到 Android 的下載鏈接。
有針對 Windows、Mac OS X(只有 Intel® 版)和 Linux(i386)的 SDK 安裝版。選擇適合您平台的最新的 SDK 版本。注意,到編寫本教程時,最新的 Android SDK 版本是 m3-rc37a。
Android SDK 是一個壓縮的文件夾。下載這個文件夾並把它的內容解壓到您計算機上的適當位置。對于本教程,SDK 安裝在 c:\software\google\android_m3-rc37a。顯然,如果要在 Mac OS X 和 Linux 上安裝 SDK,應該安裝在通常安裝開發工具的位置。
Eclipse 和 Android SDK 都已經安裝好了。現在應該安裝 Eclipse 插件。
獲取並安裝 Eclipse 插件
下面介紹安裝 Eclipse 插件 Android Developer Tools 的步驟。注意,Android 網站上也提供了安裝說明。更多信息請參見 參考資料。
按照以下步驟安裝 Android Developer Tools:
fig01.jpg (16.64 KB, 下載次數: 392)
現在下載並安裝這個插件。這個插件沒有經過數字簽名(到編寫本教程時),所以只需單擊 Install All,然後重新啓動 Eclipse。
配置 Eclipse 插件
重新啓動 Eclipse 之後,應該把這個插件連接到 SDK 的安裝位置。在 Window 菜單中選擇 Preferences。單擊左邊樹視圖中的Android。在右邊的面板中,指定 SDK 的安裝位置。本教程使用的安裝位置是 c:\software\google\android\m3-rc37a(同樣,在 Mac OS X 和 Linux 系統上也應該使用適當的位置)。
指定 SDK 安裝位置之後,可以配置另外三部分設置。下面簡要介紹一下:
好了!Eclipse 環境已經設置好了,可以開始創建 Android 應用程序了。
構建 SaySomething Android 應用程序
本節要使用 Android Developer Tools 創建一個基本的 Android 應用程序,它稱爲 SaySomething。創建這個應用程序之後,將調試和運行它。
New project 向導
第一步是創建一個新項目。選擇用來創建 Android 項目的向導,如下所示。
fig02.jpg (53.67 KB, 下載次數: 396)
這個應用程序需要:
看看這個新項目。
fig03.jpg (56.43 KB, 下載次數: 450)
這會創建一個默認的應用程序,可以構建和運行它。可以在 Package Explorer 中查看它的組件。
Package Explorer
Package Explorer(在 Eclipse 的 Java 透視圖中)顯示 Android 示例應用程序的所有組件,見圖 4。
fig04.jpg (38.64 KB, 下載次數: 443)
需要注意的組件包括:
src 文件夾包含示例應用程序的包,即 com.msi.ibmtutorial。R.javaAndroid Developer Tools 自動創建這個文件,它提供訪問 Android 應用程序的各種資源所需的常量。後面會詳細討論 R 類與資源之間的關系。SaySomething.java應用程序的主活動類的實現。Referenced libraries包含 android.jar,這是 Android SDK 中的 Android 運行時類的 jar 文件。res 文件夾包含應用程序的資源,包括:接下來,詳細研究一下源代碼。
應用程序的主活動
這個示例應用程序由一個活動組成,即 SaySomething。正如前面提到的,SaySomething 類是在 SaySomething.java 文件中實現的。
在這個源代碼片段中,要注意幾點:
下一節討論示例應用程序的資源。
應用程序的資源
正如前面提到的,Android 中的資源放在項目的 res 子目錄中。資源分爲三類:
Drawables這個文件夾包含圖形文件,比如圖標和位圖。Layouts這個文件夾包含表示應用程序布局和視圖的 XML 文件。後面會詳細研究這些文件。Values這個文件夾包含 strings.xml 文件。這是爲應用程序實現字符串本地化的主要方法。下一節研究 main.xml 文件,了解示例應用程序的 UI 資源。
main.xml
這個示例應用程序包含一個活動和一個視圖。應用程序包含一個名爲 main.xml 的文件,它代表活動的主 UI 的視覺方面。注意,在 main.xml 中沒有指定在哪裏使用這個布局。這意味著,如果需要的話,可以在多個活動中使用它。清單 5 給出布局文件的內容。
這是最簡單的布局,其中只有一個垂直的線性布局,這意味著所有元素排成一列。這裏有一個 TextView 元素,它與其他開發環境中的標簽類似。TextView 代表不可編輯的靜態文本。
注意,每個視圖元素(比如這個示例中的 LinearLayout 和 TextView)都有屬于 Android 名稱空間的屬性。一些屬性是所有視圖元素都有的,比如 android:layout_width 和 android:layout_height。這些屬性可以采用的值是:
fill_parent使視圖元素占滿可用的空間。也可以認爲這就是 “拉伸”。wrap_content這個值讓 Android 把元素一個接一個地排列,不進行拉伸。在構建期間,對所有資源進行編譯。編譯過程的輸出之一是 R.java 文件,這個文件向應用程序的其余部分提供資源。下面討論 R.java 文件。
R.java
R.java 文件是在構建時自動創建的,所以不要手工修改它,因爲所有修改都會丟失。清單 6 給出這個示例應用程序的 R.java 文件。
R 類包含一些匿名子類,每個子類包含前面描述的各種資源的標識符。注意,這些類都是靜態的。
請注意 R.layout.main 代表的元素。這個標識符代表由 main.xml 定義的布局。在活動的 onCreate 方法中使用過這個值:setContentView(R.layout.main);。這就是在運行時把特定的活動(在這個示例中是 SayAnything)和特定的布局(主布局)聯系在一起的方法。
構建應用程序
在默認情況下,每次保存文件時,都將對它們進行編譯。
fig05.jpg (47.87 KB, 下載次數: 373)
我們在源代碼中引入了一個錯誤,即在 setContent 和 View 之間加了一個空格。在保存這個文件時,它被編譯並在屏幕底部的 Problems 面板中顯示錯誤。在源代碼中糾正這個錯誤之後,應用程序就能夠成功編譯,並從問題列表中刪除錯誤。
AndroidManifest.xml
AndroidManifest.xml 文件是 Android 應用程序的部署描述符。這個文件列出應用程序中包含的所有活動、服務、內容提供器和接收器,以及應用程序支持的 IntentFilter。下面是這個示例應用程序的完整的 AndroidManifest.xml 文件。
請注意以下情況:
下一節討論如何在 Eclipse 中的 Android 模擬器上啓動應用程序。
運行應用程序
應用程序已經成功地編譯了,現在該運行這個示例應用程序了。在 Eclipse 中選擇 Open Run Dialog 或工具欄上的快捷按鈕。這會打開一個對話框,可以在這裏創建啓動配置。選擇 Android Application 選項並單擊 New 的圖標。
圖 6 顯示本教程示例所用的值。
fig06.jpg (37.62 KB, 下載次數: 374)
指定配置名稱。本教程使用的名稱是 Tutorial Configuration。在可用項目列表中選擇 ibmtutorial 項目(單擊 Browse 可以看到可用項目)。在下拉列表中選擇啓動活動。現在選擇 Emulator 選項卡,根據需要指定模擬器設置。可以保持默認設置。有兩個設置需要注意,見圖 7。
fig07.jpg (40.98 KB, 下載次數: 360)
有幾種可供選擇的屏幕大小和方向,還有網絡選擇。如果運行應用程序的移動設備的因特網連接速度不同,網絡選擇就很重要了。在構造應用程序原型時,選擇完整網絡速度而且沒有延遲。開發了主要功能之後,最好在比較真實的網絡環境中進行測試,看看應用程序的響應速度如何。
選擇 Run 運行示例應用程序。
fig08.jpg (32.96 KB, 下載次數: 370)
應用程序已經在模擬器上運行了,現在看看幕後發生的情況。Dalvik Debug Monitor Service(DDMS)將會幫助檢查應用程序的運行情況。
調試應用程序
要想檢查正在運行的應用程序中發生了什麽情況,就需要查看正在運行的 Dalvik VM。在 Eclipse 中,選擇 Window > Open Perspective > Other。在出現的對話框中選擇 DDMS。這會在 Eclipse 中打開一個新的透視圖,其中有許多有趣的窗口。下面簡要介紹一下 DDMS 透視圖中提供的資源:
LogCat 是一個日志文件,它記錄 VM 中發生的活動。應用程序可以通過 Log.i(tag,message); 在這個日志文件中添加自己的日志項,其中的 tag 和 message 都是 Java 字符串。Log 類屬于 android.util.Log 包。
圖 9 顯示 LogCat。
fig09.jpg (36.03 KB, 下載次數: 371)
DDMS 中的另一個方便的工具是文件管理器,可以用它訪問模擬器的文件系統。圖 10 顯示在模擬器上部署本教程示例應用程序的位置。
fig10.jpg (79.04 KB, 下載次數: 382)
用戶應用程序部署在 /data/app 目錄中,而 Android 內置的應用程序部署在 /system/app 目錄中。
在 DDMS 中還可以查看正在運行的進程。
fig11.jpg (28.74 KB, 下載次數: 360)
全面討論 Android 應用程序的調試超出了本教程的範圍,更多信息請參見 參考資料。
創建內容提供器和 Google Maps 應用程序
您已經看到了一個完整的應用程序示例,現在簡要討論一下更加複雜的應用程序。
內容提供器和 Google Maps
本教程中討論的第二個應用程序適用于提供上門服務的專業人員,比如設備維修技術人員,這些人必須找到去客戶地址的路線。這個應用程序使用 Android 內置的聯系人數據庫作爲記錄存儲庫。本節將講解如何訪問內容提供器中的數據,還將看看 intent 的效果。我們將用聯系人數據庫中的地址數據執行 Google Maps 搜索。爲了讓這個應用程序在 Android 模擬器上正確運行,必須記錄一些聯系人,而且必須填寫家庭地址字段。圖 12 顯示模擬器中與聯系人應用程序相關的條目。
fig12.jpg (53.9 KB, 下載次數: 366)
下面是這個應用程序的一個代碼片段。注意,這個應用程序的主 Activity 類擴展 ListActivity。這是因爲我們需要在列表中顯示信息。
注意,這裏使用遊標類查詢聯系人數據庫。這個 “結果集” 遊標通過 ListAdapter 類鏈接到 UI。圖 13 顯示當設備上記錄了聯系人時應用程序的效果。注意,這個屏幕上的記錄沒有排序。
fig13.jpg (33.03 KB, 下載次數: 358)
可以通過鼠標單擊、按模擬器的中間按鈕或按鍵盤上的 Enter 鍵選擇一個聯系人。選擇聯系人之後,代碼必須查詢所選聯系人的地址。這要使用覆蓋的 onListItemClick() 方法。這個方法的實現有四個重要參數,其中最重要的是 dbidentifier。因爲遊標綁定到 UI,所以在調用這個方法時,它實際上會獲得底層數據源的標識符。可以使用 dbidentifier 字段在聯系人數據庫中查詢所需的信息。還可以使用它啓動聯系人應用程序,所用的 intent 見清單 9 中被注釋掉的代碼。
找到地址之後,需要通過一些簡單的字符串操作清理數據,准備查詢 Google Maps。geoIntent 是一個用來執行地理搜索的新的 intent,它通過調用 Google Maps 提供默認的 Android 模擬器圖像。
第一個應用程序的所有主要元素仍然適用于這個應用程序。它有一個從主應用程序屏幕啓動的活動。當然,還有 AndroidManifest.xml 文件。在 下載 一節中可以找到完整的源代碼。
關于第二個應用程序,還有最後一點需要注意。AndroidManifest.xml 文件中包含一個條目,它使應用程序能夠讀取聯系人數據庫:<uses-permission id="android.permission.READ_CONTACTS" />。如果不這樣做,Linux 內核就會禁止應用程序訪問聯系人數據庫。