Eclipse開發Android應用程序入門
翻譯:趙錕
原文出處:http://www.smashingmagazine.com/2010/10/25/get-started-developing-for-android-with-eclipse/
如今的移動設備應用程序開發充滿著讓人振奮的東西。功能強大的硬件支持,平板電腦,多樣的軟件平臺(塞班 OS,iOS,WebOS,Windows Phone 7…),移動設備開發者前景充滿了機會和挑戰。
當你想要開始開發你的移動設備程序時,如此多的選擇可能讓你產生困擾。究竟應該選擇神馬平臺?我應該學習神馬語言?為你計劃的項目選擇神馬工具?在本教程中,你將學會如何在Google公司的開源移動設備操作系統Android下開發應用程序。
為神馬選Android
Android是一個基于Linux內核的開源平臺, 并且被安裝在來自于不同廠商的上千種設備中。Android將各種移動設備的硬件如 電子羅盤,攝像頭,GPS,方向感應,等等暴露給你的應用程序。
Android的免費開發工具可以讓你以0成本開始編寫你的軟件。當你想向世界展示你的應用程序的時候,你可以將你的軟件發布到Google的 Android 市場。向Andriod Market 發布程序只一次性的收取注冊費用(25元),并且不像蘋果的App Store ,對每一次的提交都要做檢查,除非你的程序明顯地違法,在經過一個快速檢查的流程后,才能讓你的程序提供給客戶下載和購買。
下面是Android對于開發者的優點:
- Android的SDK可以在Windows,Mac和Linux上運行,因此你不需要為了開發環境支付額外的新硬件投入。(譯者注:我曾近在Win7 64x + VMWare上成功的安裝Mac Snow leopard + XCode的開發環境,對于愛用盜版的人來說,這點MS優勢不是很大啊)
- 構建于JAVA上的SDK。如果你熟悉JAVA語言,你就是事半功倍了。(譯者注:這個酷殼有篇文章討論過,大家可以參看:http://coolshell.cn)
- 你只要在Android Market上發布應用程序,你將有潛在的成千上萬的用戶。而且你不一定非要把程序發布在Android Market上,你還可以在你的博客上發布。而且有傳言,Amazon已近在最近準備搭建他們自己的Android 應用程序商店了。
- 除了了技術性的SDK 文檔外,還可以找到其他更多的使用者和開發者的資源。
閑話少說——下面讓我們進入正題,開始開發我們的Android應用程序。
安裝Eclipse和Android SDK
Android應用程序的推薦開發環境是帶有Android開發包插件(Android Devlopment Toolkit (ADT))的Eclipse。我在這里簡要說明一下安裝流程。如果你需要更多的細節,Google的開發人員網頁中詳盡地解釋了具體的安裝配置過程
- 為你的平臺下載Android SDK(Windows , Mac OS X 或者 Linux)。
- 在你的硬盤上解壓下載文件 (在Linux, 我使用 /opt/local/).
- 如果你沒有安裝Eclipse,下載并安裝Eclipse JAVA 集成開發環境包。 用于編程的話, Google推薦使用Eclipse 3.5 (Galileo).
- 運行Eclipse 并選擇Help->Install New Software.
- 在Available Software窗口中點擊Add按鈕。
- 進入 Android Development Tools 的Name輸入框, 在Location 輸入框輸入https://dl-ssl.google.com/android/eclipse/
- 檢查可用軟件中有Developer Tools并點擊OK按鈕。這將安裝Android Development Tools 和DDMS, Android的調試工具。
- 點擊Next和Finish按鈕以完成安裝,安裝完成后,你需要重啟你的Eclipse一次。
- 在Eclipse重啟后,選擇Window->Preference 后你可以在分類列表中看到Android這一項了。
- 現在需要告訴Eclipse,你的Android SDK安裝在什么地方。點擊Android項后瀏覽選擇你解壓后的Android SDK所在的路徑。例如/opt/local/android-sdk。
- 點擊OK按鈕,保存信息。
選擇Android 平臺
在你開始編寫Android應用程序之前,你需要為你需要開發應用程序的Android設備下載SDK平臺。每個平臺都有可以安裝在用戶設備上的不同版本的SDK。對于Android1.5或以上版本,有兩個可用的平臺: Android Open Source Project 和 Google.
Android Open Source Project 平臺是開源的,但是不包括Google公司的私有化擴展,比如Google Map。如果不選擇使用Google的API,Google的地圖功能就不會在你的應用程序中生效。除非你有特別的原因,否則我們推薦你選擇Google平臺,因為這樣你可享受到Google的擴展類庫提供的便利。
- 選擇Window Android SDK and AVD Manager.
- 點擊左欄中的Available Packages 并選擇選擇Respository中有效的Android SDK平臺。
- 你可以選擇列表中所需要的平臺,或全選下載所有有效的平臺。當你選擇完畢,單擊Install Selected 并完成安裝。
一旦成功的下載所有的平臺后,你就可以準備開始開發Android應用程序了。
創建一個新的Android項目
Eclipse的新建項目向導能為你創建一個新的Android項目,并生成可以開始運行的文件和代碼。通過向導生成代碼,可以讓你馬上得到一個Android程序運行的直觀映像并為你提供了一個幫助你快速入門的方法:
- 選擇 File->New->Project…
- 選擇Android Project
- 在New Project 對話框, 鍵入如下的設置:
1
2
3
4
5
6
|
Project Name: BrewClock Build Target: Google Inc. 1.6 (Api Level 4) Application Name: BrewClock Package Name: com.example.brewclock Create Activity: BrewClockActivity Min SDK Version: 4 |
在點擊了完成按鈕之后,Eclipse將為你創建一個新的可以運行的Android項目。注意,你通知了Eclipse生成了一個叫做BrewClockActivity的Activity。這個Activity的代碼用于運行你的應用程序。生成的代碼將在程序運行時非常簡單地顯示一條“Hello World”消息。
包
包名是你的應用程序標示。當你開始準備在Android Market上發布你的應用程序的時候,Android用這個標識符精確地記錄你的應用程序的更新過程,因此讓包名唯一是非常重要的。盡管我們在這里使用了com.example.brewclock這樣的名字空間,對于真實的應用程序,你應該選擇類似于com.你的公司名.你的應用程序名 這樣的包名。
SDK 版本
Min SDK Version 是你的Android程序所能運行得最早版本號。對于每個新發布的Android,SDK會增加并修改一些方法。通過選擇一個版本號,Android(Android Market)會知道你的應用程序能運行在等于或晚于指定版本的設備之上。
運行你的應用程序
現在讓我們開始在Eclipse中運行我們的應用程序。由于是第一次運行,Eclipse將會詢問你的項目類型:
- 選擇Run->Run 或 按下 Ctrl+F11.
- 選擇Android Application 并點擊 OK 按鈕.
Eclipse 將會在一個Android設備上運行一個應用程序。在這個時候,由于你沒有任何Android設備,因此在運行時一定會返回一個失敗,并且詢問你是否要新建一個Android的虛擬設備。(AVD)
Android 虛擬設備
Android 虛擬設備 (AVD) 是一個模擬真實世界中Android設備的模擬器,例如移動電話或平板電腦。你可以在不買任何真實Android設備情況下,使用AVD測試你的應用。
你可以創建任意多個你喜歡的AVD,每個可以建立在不同版本的Android平臺之上。對于你創建的每個Android設備,你可以配置不同的硬件屬性,比如是否具有物理鍵盤,是否支持GPS,攝像頭的像素,等等。
在你開始運行你的應用程序之前,你需要創建你的AVD,來運行指定的SDK平臺(Google APIs 1.6)。
現在讓我開始:
- 如果還沒有開始運行你的應用程序,點擊run(或按下 Ctrl+F11)。
- 當目標設備彈出警告,點擊Yes 以創建新的AVD。
- 單擊Android SDK and AVD Manager 對話框內的New 按鈕.
- 為你的AVD鍵入如下的設置:
1
2
3
4
|
Name: Android_1.6 Target: Google APIs (Google Inc.) - API Level 4 SD Card Size: 16 MiB Skin Built In: Default (HVGA) |
- 單擊 Create AVD 讓Android為你創建一個新虛擬設備。
- 關閉the Android SDK and AVD Manager 對話框.
運行代碼
再次運行你的應用程序(Ctrl+F11)。 Eclipse 將build 你的項目并運行一個新的AVD。記住,AVD模擬了一個完全的Android系統,因此你需要有耐心來等待這個緩慢的啟動過程,就如同你重啟真實的Android設備一樣。一個好的做法是不要關閉你的AVD,直到你完成了你一天的工作。
當你的模擬器啟動后,Eclipse自動地安裝并運行你的應用程序。
開發你第一個Android應用
生成的代碼能良好的運行,但是你真正想要的是開發一個真實的應用程序。為此,我們首先果一個咸蛋的設計流程,并開始創建一個可以讓你部署在Android設備上的應用。
大部分的開發者(包括我自己)都喜歡每天一杯咖啡或茶。在下一節中,你將開發一個簡單的泡茶計數器應用程序來記錄用戶泡了多少杯茶,并為泡每杯茶做一個定時器。
你可以從GitHub下載整個教程的源代碼.
設計用戶界面
在開發任何Android應用程序之前的第一步就是設計和開發用戶界面。下面是一個我們這個應用程序的用戶界面的一個概覽。
用戶將能通過+和-按鈕設置一個泡茶的定時器。當單擊開始按鈕,定時器將開始按指定的時間遞減。除非用戶再次點擊按鈕以取消計時,否則當定時器為0的時候,累計的泡茶計數brew將增加1。
開發用戶界面
Android 用戶界面或布局layouts, 是通過XML文檔來描述的,可以在項目的res/layouts目錄下找到。在之前運行在模擬器上代碼中,我們可以看到由eclipse自動生成的布局代碼在res/layouts/main.xml 中。
Eclipse有一個圖形化的布局設計器,通過在屏幕上的拖拽控制來完成布局的設計,然而,我卻發現直接寫XML并使用圖形布局來預覽是更容易的方式。
現在讓我們對main.xml做一些工作以達到上圖的效果:
- 在Eclipse中通過雙擊PackageExplorer的res/layouts/main.xml 來打開xml。
- 點擊屏幕下方main.xml 來切換為xml視圖。
將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">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dip">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dip"
android:text="Brews: " />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="None"
android:gravity="right"
android:textSize="20dip"
android:id="@+id/brew_count_label" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="10dip">
<Button
android:id="@+id/brew_time_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-"
android:textSize="40dip" />
<TextView
android:id="@+id/brew_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0:00"
android:textSize="40dip"
android:padding="10dip" />
<Button
android:id="@+id/brew_time_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+"
android:textSize="40dip" />
</LinearLayout>
<Button
android:id="@+id/brew_start"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:text="Start" />
</LinearLayout>
正如你所見的,Android的XML布局文件是繁瑣的,但卻能讓你控制到屏幕的各個元素。
在Android中最重要的接口元素是布局Layout容器,例如例子中使用的LinearLayout 。這些元素對于用戶是不可見的,但是卻扮演者例如Buttons 和TextViews這些元素的布局容器。
Android中有幾種不同類型的布局視圖layout view,每一種都用于開發不同的布局。如同LinearLayout 和AbsoluteLayout ,TableLayout 可以讓你使用更為復雜的基于表格結構的布局。你可以在SDK的API文檔的通用布局對象中查找到更多的布局。
關聯你的布局Layout與代碼
保存你的布局,在Eclipse中點擊Run圖標或按下Ctrl+F11重新在模擬器中運行你的程序。你現看到不是之前出現的Hello World消息了,你將看到Android顯示了一個新的界面。
如果點擊界面上的任何按鈕,他們將期望的顯示為高亮,但是不會執行任何操作。現在讓我們在布局修改后改進一下我們的源碼:
# /src/com/example/brewclock/BrewClockActivity.java
import android.widget.Button;
import android.widget.TextView;
public class BrewClockActivity extends Activity {
/** Properties **/
protected Button brewAddTime;
protected Button brewDecreaseTime;
protected Button startBrew;
protected TextView brewCountLabel;
protected TextView brewTimeLabel;
...
}
下一步,我們將修改調用onCreate。當Android啟動你的應用程序的時候,Android會首先調用這個方法。 在Eclipse生成的代碼中,onCreate把activity的視圖設置成R.layout.main。這行代碼告訴Android解釋我們的布局配置XML文件,并顯示它。
資源對象
在Android中,R是一個自動生成的對象,這是一個特殊的對象,你可以在代碼中通過這個對象訪問項目中的資源(布局,字符串,菜單,圖標,…) 。每個資源都有一個給定的id。在上面的那個布局文件中,有一些@+id XML 屬性。我們將通過這些值來關聯布局中的Buttons 與TextViews和我們的代碼和:
# /src/com/example/brewclock/BrewClockActivity.java
public class BrewClockActivity extends Activity {
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Connect interface elements to properties
brewAddTime = (Button) findViewById(R.id.brew_time_up);
brewDecreaseTime = (Button) findViewById(R.id.brew_time_down);
startBrew = (Button) findViewById(R.id.brew_start);
brewCountLabel = (TextView) findViewById(R.id.brew_count_label);
brewTimeLabel = (TextView) findViewById(R.id.brew_time);
}
}
監聽事件
為了檢測到用戶單擊我們的按鈕,我們需要實現一個監聽器listener。你可能會從其他的事件驅動系統中熟悉監聽器或回調函數callbacks。比如Javascript/JQuery事件或Rails的回調函數。
Android通過Listener接口提供相似的機制,例如OnClickListener,這個接口中定義了那些會被事件觸發的方法。當用戶點擊屏幕的時候,實現OnClickListener 接口將會通知你的應用程序,并告訴他們所按得屏幕按鈕。你當然也需要告訴每個button的ClickListener,以便Android知道具體通知到那個監聽器:
# /src/com/example/brewclock/BrewClockActivity.java
// Be sure not to import
// `android.content.dialoginterface.OnClickListener`.
import android.view.View.OnClickListener;
public class BrewClockActivity extends Activity
implements OnClickListener {
...
public void onCreate(Bundle savedInstanceState) {
...
// Setup ClickListeners
brewAddTime.setOnClickListener(this);
brewDecreaseTime.setOnClickListener(this);
startBrew.setOnClickListener(this);
}
...
public void onClick(View v) {
// TODO: Add code to handle button taps
}
}
下一步,我們將增加每個按鈕按下的處理過程。我們將為Activity類增加4個屬性,這些屬性將用來讓用戶設置和記錄我們泡茶時間,泡茶計數,計時器是否在運行的標志。
# /src/com/example/brewclock/BrewClockActivity.java
public class BrewClockActivity extends Activity
implements OnClickListener {
...
protected int brewTime = 3;
protected CountDownTimer brewCountDownTimer;
protected int brewCount = 0;
protected boolean isBrewing = false;
...
public void onClick(View v) {
if(v == brewAddTime)
setBrewTime(brewTime + 1);
else if(v == brewDecreaseTime)
setBrewTime(brewTime -1);
else if(v == startBrew) {
if(isBrewing)
stopBrew();
else
startBrew();
}
}
}
注意我們使用了Android提供的類CountDownTimer 。這讓我們非常容易的創建和開始一個簡單的遞減計數,這個遞減計數在遞減運行的時候,每當執行一個遞減就發出一個通知。你將在下面的startBrew 方法中使用到這個計數器。
在下面的方法是所有處理邏輯,這些處理邏輯用于處理設置泡茶時間,開始停止計數和維護計數器。我們同樣地在onCreate方法中來初始化我們的 brewTime和 brewCount變量。
將這些代碼放入到不同的類中是一種好做法。但是為了簡潔,我把我們所有的代碼都放到了BrewClockActivity中:
# /src/com/example/brewclock/BrewClockActivity.java
public class BrewClockActivity extends Activity
implements OnClickListener {
...
public void onCreate(Bundle savedInstanceState) {
...
// Set the initial brew values
setBrewCount(0);
setBrewTime(3);
}
/**
* Set an absolute value for the number of minutes to brew.
* Has no effect if a brew is currently running.
* @param minutes The number of minutes to brew.
*/
public void setBrewTime(int minutes) {
if(isBrewing)
return;
brewTime = minutes;
if(brewTime < 1)
brewTime = 1;
brewTimeLabel.setText(String.valueOf(brewTime) + "m");
}
/**
* Set the number of brews that have been made, and update
* the interface.
* @param count The new number of brews
*/
public void setBrewCount(int count) {
brewCount = count;
brewCountLabel.setText(String.valueOf(brewCount));
}
/**
* Start the brew timer
*/
public void startBrew() {
// Create a new CountDownTimer to track the brew time
brewCountDownTimer = new CountDownTimer(brewTime * 60 * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
brewTimeLabel.setText(String.valueOf(millisUntilFinished / 1000) + "s");
}
@Override
public void onFinish() {
isBrewing = false;
setBrewCount(brewCount + 1);
brewTimeLabel.setText("Brew Up!");
startBrew.setText("Start");
}
};
brewCountDownTimer.start();
startBrew.setText("Stop");
isBrewing = true;
}
/**
* Stop the brew timer
*/
public void stopBrew() {
if(brewCountDownTimer != null)
brewCountDownTimer.cancel();
isBrewing = false;
startBrew.setText("Start");
}
...
}
這段代碼唯一和Android相關的就是使用setText方法來設置文本的顯示文字。在startBrew方法中,我們創建,并開始了一個CountDownTimer來開每秒遞減計數直到計數器為0。注意,我們定義了CountDownTimer以內聯方式監聽onTick 和 onFinish方法。 onTick 方法將每1000毫秒(1秒)執行一次,并遞減, 當計數器為0的時候,onFinish方法被調用。
避免在你的代碼中硬編碼
為了使教程代碼簡單,我故意地在程序中將控件的標號直接寫到字串中(例如: “Brew Up!”, “Start”, “Stop”) 通常,這不是一個好的做法,因為如果在大型項目中,這樣做會使得修改變得麻煩。
Android 提供了一種簡潔的方法讓你使用R對象來使字符串和代碼分離。R 讓你在xml文件(res/values/strings.xml)定義所有你程序中字符串,并讓你可以在代碼中應用到這些字符串。例如:
# /res/values/strings.xml
...
# /res/com/example/brewclock/BrewClockActivity.java
brewLabel.setText(R.string.brew_up_label);
...
現在,如果你想改變Brew Up! 字樣,你只要一次性的修改strings.xml文件就行了。你的應用將生成一堆代碼來保證你程序中所有使用到這些字符串的地方都能被生效!
運行Brew Clock
代碼完成之后,現在是試運行程序的時候了。單擊Run 或 Ctrl+F11 在模擬器中啟動我們的應用. 所有都運行良好,你將會看到你創建的用戶界面在準備時間一到就可以喝你所泡的茶了!試著設置不同的時間,并點擊Start 觀看倒計時。
總結
在這個關于Android的簡單介紹中,你已學會如何安裝Android SDK和Eclipse的Android 開發工具插件(ADT)。你也學會如何創建一個模擬設備,并通過這個設備來測試你的應用程序。你還學會了如何開發Android應用程序。上面了那些作為標題的關鍵概念在以后你自己開發Android應用程序的時候將會經常用到。
我們希望,這個教程能激發你的開發移動應用程序的欲望,并步入這個令人激動的領域。Android為當前和即將到來的移動設備應用程序開發提供了一條寬廣的道路。如果你已經開發你自己的移動應用,請在評論中告訴我們。