http://www.ibm.com/developerworks/cn/opensource/os-android-devel/
黑莓和 iPhone 都提供了受歡迎的、高容量的移動平台,但是卻分別針對兩個不同的消費群體。黑莓是企業業務使用者的不二選擇。但是,作為一種消費裝置,它在易用性和 “新奇特性” 方面難以和 iPhone 抗衡。Android 則是一個年輕的、有待開發的平台,它有潛力同時涵蓋行動電話的兩個不同消費群體,甚至可能縮小工作和娛樂之間的差別
如今,很多基於網路或有網路支援的裝置都運行某種 Linux 核心。這是一種可靠的平台:可經濟有效地進行部署和提供支援,並且可直接作為面向部署的良好的設計方法。這些裝置的 UI 通常是基於 HTML 的,可通過 PC 或 Mac 瀏覽器查看。但並不是每個裝置都需要通過一個常規的計算裝置來控制。想象一下傳統的家用電器,例如電爐、微波爐或麵包機。如果您的家用電器由 Android 控制,並且有一個彩色觸控螢幕,會怎麼樣?如果電爐上有一個 Android UI,那麼操控者甚至可以烹飪點什麼東西。
在本文中,瞭解 Android 平台,以及如何將它用於移動和非行動裝置 App程式。安裝 Android SDK,並構建一個簡單的應用程式。下載 本文中的應用程式範例的原始碼。
回頁首
Android 簡史
Android 平台是 Open Handset Alliance 的成果,Open Handset Alliance 組織由一群共同致力於構建更好的行動電話的公司組成。這個組織由 Google 領導,包括行動電信業者、手持功能製造商、零組件製造商、軟體解決方案和平台供應商以及市場營銷公司。從軟體開發的觀點看,Android 正處在開源領域的中心位置。
市場上第一款支援 Android 的手機是由 HTC 製造並由 T-Mobile 供應的 G1。這款裝置從設想到推出花了大約一年的時間,惟一可用的軟體開發工具是一些實行增量改進的 SDK 發行版。隨著 G1 發行日的臨近,Android 團隊發布了 SDK V1.0,用於這個新平台的應用程式也浮出水面。
為了鼓勵創新,Google 舉辦了兩屆 “Android Developer Challenges”,為優勝的參賽作品提供數百萬美金的獎勵。G1 問世幾個月之後,隨後就發布了 Android Market,它使使用者可以瀏覽應用程式,並且可以將應用程式直接下載到他們的手機上。經過大約 18 個月,一個新的移動平台進入公眾領域。
回頁首
Android 平台
Android 有豐富的功能,因此很容易與案頭作業系統混淆。Android 是一個分層的環境,構建在 Linux 核心的基礎上,它包括豐富的功能。UI 子系統包括:
- 視窗
- 視圖
- 用於顯示一些常見組件(例如編輯框、列表和下拉式清單)的小組件
Android 包括一個構建在 WebKit 基礎上的可嵌入瀏覽器,iPhone 的 Mobile Safari 瀏覽器同樣也是以 WebKit 為基礎。
Android 提供多種串連選項,包括 WiFi、藍芽和通過蜂窩(cellular)串連的無線資料轉送(例如 GPRS、EDGE 和 3G)。Android 應用程式中一項流行的技術是連結到 Google 地圖,以便在應用程式中顯示地址。Android 軟體棧還提供對基於位置的服務(例如 GPS)和加速計的支援,不過並不是所有的 Android 裝置都配備了必需的硬體。另外還有攝像支援。
過去,行動裝置 App程式努力向傳統型應用程式看齊的兩個領域分別是圖形/媒體和資料存放區方法。Android 通過提供對 2D 和 3D 圖形的內建支援,包括 OpenGL 庫,解決了圖形方面的挑戰。由於 Android 平台包括流行的開源 SQLite 資料庫,因此緩解了資料存放區的負擔。圖 1 顯示一個簡化的 Android 軟體階層。
圖 1. Android 軟體階層
回頁首
應用程式架構
如前所述,Android 運行在 Linux 核心上。Android 應用程式是用 Java 程式設計語言編寫的,它們在一個虛擬機器(VM)中運行。需要注意的是,這個 VM 並非您想象中的 JVM,而是 Dalvik Virtual Machine,這是一種開源技術。每個 Android 應用程式都在 Dalvik VM 的一個執行個體中運行,這個執行個體駐留在一個由 Linux 核心管理的進程中,如所示。
圖 2. Dalvik VM
Android 應用程式由一個或多個組件組成:
-
活動
-
具有可視 UI 的應用程式是用活動實現的。當使用者從主畫面或應用程式啟動器選擇一個應用程式時,就會開始一個動作。
-
服務
-
服務應該用於任何需要持續較長時間的應用程式,例如網路監視器或更新檢查應用程式。
-
內容提供者
-
可以將內容提供者看作資料庫伺服器。內容提供者的任務是管理對持久資料的訪問,例如 SQLite 資料庫。如果應用程式非常簡單,那麼可能不需要建立內容提供者。如果要構建一個較大的應用程式,或者構建需要為多個活動或應用程式提供資料的應用程式,那麼可以使用內容提供者實現資料訪問。
-
廣播接收器
-
Android 應用程式可用於處理一個資料元素,或者對一個事件(例如接收簡訊)做出響應。
Android 應用程式是連同一個 AndroidManifest.xml 檔案一起部署到裝置的。AndroidManifest.xml 包含必要的配置資訊,以便將它適當地安裝到裝置。它包括必需的類名和應用程式能夠處理的事件類型,以及運行應用程式所需的許可。例如,如果應用程式需要訪問網路 — 例如為了下載一個檔案 — 那麼 manifest 檔案中必須顯式地列出該許可。很多應用程式可能啟用了這個特定的許可。這種聲明式安全性有助於減少惡意應用程式損害裝置的可能性。
下一節討論構建 Android 應用程式所需的開發環境。
回頁首
所需的工具
開始開發 Android 應用程式的最簡捷的方式是下載 Android SDK 和 Eclipse IDE(參見 參考資料)。Android 開發可以在 Microsoft Windows、Mac OS X 或 Linux 上進行。
本文假設您使用的是 Eclipse IDE 和用於 Eclipse 的 Android Developer Tools 外掛程式。Android 應用程式是用 Java 語言編寫的,但是是在 Dalvik VM(非 JAVA 虛擬機器)中編譯和執行的。在 Eclipse 中用 Java 語言編程非常簡單;Eclipse 提供一個豐富的 Java 環境,包括上下文敏感協助和代碼提示。Java 代碼通過編譯後,Android Developer Tools 可確保適當地將它打包,包括 AndroidManifest.xml 檔案。
雖然沒有 Eclipse 和 Android Developer Tools 外掛程式也可以開發 Android 應用程式,但是那樣就需要熟悉 Android SDK。
Android SDK 是作為一個 ZIP 檔案發布的,可以將該檔案解壓到硬碟上的一個目錄中。由於有多個 SDK 更新,建議有意識地組織開發環境,以便在不同的 SDK 安裝之間輕鬆地切換。SDK 包括:
-
android.jar
-
Java 歸檔檔案,其中包含構建應用程式所需的所有的 Android SDK 類。
-
documention.html 和 docs 目錄
-
本地和網上提供的 SDK 文檔。這些文檔的主要形式為 JavaDocs,以便於在 SDK 中導航大量的包。文檔還包括一個進階開發指南和 Android 社區的連結。
-
Samples 目錄
-
samples 子目錄包含各種應用程式的原始碼,包括 ApiDemo,該應用程式示範了很多 API。這個應用程式範例可以作為 Android 應用程式開發的良好起點。
-
Tools 目錄
-
包含所有用於構建 Android 應用程式的命令列工具。最常用、最有用的工具是
adb
公用程式(Android Debug Bridge)。
-
usb_driver
-
該目錄包含將開發環境串連到支援 Android 的裝置(例如 G1 或 Android Dev 1 解鎖開發手機)所需的驅動程式。只有 Windows 平台的開發人員才需要這些檔案。
Android 應用程式可以在實際的裝置上運行,也可以在 Android SDK 附帶的 Android Emulator 上運行。圖 3 顯示 Android Emulator 的主畫面。
圖 3. Android Emulator
Android Debug Bridge
adb
公用程式支援一些可選命令列參數,以提供強大的特性,例如複製檔案到裝置或從裝置複製檔案。可以使用 shell 命令列參數串連到手機本身,並發送基本的 shell 命令。圖 4 顯示在通過 USB 線串連到 Windows 膝上型電腦的一個實際裝置上啟動並執行 adb
shell 命令。
圖 4. 使用 adb
shell 命令
在這個 shell 環境中,可以:
- 顯示網路設定,網路設定可顯示多個網路連接。注意這多個網路連接:
lo
是本地或 loopback 串連。
tiwlan0
是 WiFi 串連,該串連由本地 DHCP 伺服器提供一個地址。
- 顯示
PATH
環境變數的內容。
- 執行
su
命令,以成為超級使用者。
- 將目錄改為 /data/app,其中存放使用者應用程式。
- 列出包含某個應用程式的目錄。Android 應用程式檔案實際上是歸檔檔案,可通過 WinZip 之類的軟體查看。副檔名為 apk。
- 發出 ping 命令,查看 Google.com 是否可用。
從相同的命令提示字元環境中,還可以與 SQLite 資料庫互動,啟動程式以及執行許多其他系統級任務。想像一下您正在串連到電話,因此這是非常了不起的功能。
在下一節,您將建立一個簡單的 Android 應用程式。
回頁首
編寫一個基本的應用程式
本節展示如何構建一個 Android 應用程式。應用程式範例非常簡單:一個修改後的 “Hello Android” 應用程式。您將進行一個微小的修改,使螢幕背景全部變為白色,以便把手機用作手電筒。這個例子不是很有創意,但是可以作為一個有用的例子。請 下載 完整的原始碼。
為了在 Eclipse 中建立應用程式,選擇 File > New > Android project,這將啟動 New Android Project 嚮導。
圖 5. New Android project 嚮導
接下來,建立一個簡單的應用程式,該應用程式有一個活動,並且在 main.xml 中有一個 UI 布局。布局包含一個文本元素,您將修改這個文本元素,以顯示 Android FlashLight。下面的清單顯示了這個簡單的布局。
清單 1. Flashlight 布局
<?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" android:background="@color/all_white"><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:textColor="@color/all_black" android:gravity="center_horizontal"/></LinearLayout> |
在 strings.xml 中建立兩個顏色資源。
清單 2. strings.xml 中的顏色
<?xml version="1.0" encoding="utf-8"?><resources> <string name="hello">Android FlashLight</string> <string name="app_name">FlashLight</string> <color name="all_white">#FFFFFF</color> <color name="all_black">#000000</color></resources> |
主畫面布局有一個定義為 all_white
的背景色。在 strings.xml 檔案中,可以看到 all_white
被定義為一個值為 #FFFFFF 的 RGB 三元組,即純白。
布局包含一個 TextView
,這實際上是一塊靜態文本。它是不可編輯的。文本被設為黑色,並通過 gravity
屬性設為水平置中。
該應用程式有一個名為 FlashLight.java 的 Java 源檔案,如以下清單所示。
清單 3. Flashlight.java
package com.msi.flashlight;import android.app.Activity;import android.os.Bundle;public class FlashLight extends Activity { /** Called when the activity is first created. */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }} |
該代碼是直接來自 New Project 嚮導的模板代碼:
- 它是 Java 包 com.msi.flashlight 的一部分。
- 它有兩個 import:
- 一個用於 activity 類
- 一個用於 bundle 類
- 當該活動發起後,
onCreate
方法被調用,傳入一個 savedInstanceState
。對於我們來說,不必關心這個 bundle。只有在暫停然後恢複活動時才會用到。
onCreate
方法覆蓋了同名的 activity 類方法。它調用超類的 onCreate
方法。
- 對
setContentView()
的調用將關聯 main.xml 檔案中定義的 UI 布局。main.xml 和 strings.xml 中的任何內容都自動對應到 R.java 源檔案中定義的常量。任何時候都不要直接編輯這個檔案,因為它隨著每次構建而改變。
運行該應用程式可以看到一個白色螢幕,其中有黑色文本。
圖 6. flashlight 的白色螢幕
下面顯示用於 FlashLight 應用程式的 AndroidManifest.xml 檔案。
清單 4. 用於 FlashLight 的 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.msi.flashlight" android:versionCode="1" android:versionName="1.0.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".FlashLight" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest> |
該檔案是由用於 Eclipse 的 Android Developer Tools 外掛程式自動建立的。您不需要做任何事情。
當然,這個應用程式並不是很強大。但是如果希望讀點書,又不想打擾正在睡覺的愛人,或者如果需要在斷電時去地下室查看保險絲盒,那麼這個應用程式還是很方便的。
回頁首
結束語
在本文中,您閱讀了對 Android 的簡介,並構建了一個小型的應用程式。希望本文中的例子能激起您進一步探索 Android 平台的興趣。Android 有望成為對市場產生深遠影響的開源平台,它的用處將遠遠超越行動電話。