By Chris Blunthtml
翻譯:趙錕
原文出處:http://www.smashingmagazine.com/2010/10/25/get-started-developing-for-android-with-eclipse/java
現在的移動設備應用程序開發充滿着讓人振奮的東西。功能強大的硬件支持,平板電腦,多樣的軟件平臺(塞班 OS,iOS,WebOS,Windows Phone
7…),移動設備開發者前景充滿了機會和挑戰。android
當你想要開始開發你的移動設備程序時,如此多的選擇可能讓你產生困擾。究竟應該選擇神馬平臺?我應該學習神馬語言?爲你計劃的項目選擇神馬工具?在本教程中,你將學會如何在Google公司的開源移動設備操做系統Android下開發應用程序。git
爲神馬選Android
Android是一個基於Linux內核的開源平臺, 而且被安裝在來自於不一樣廠商的上千種設備中。Android將各類移動設備的硬件如
電子羅盤,攝像頭,GPS,方向感應,等等暴露給你的應用程序。
Android的免費開發工具可讓你以0成本開始編寫你的軟件。當你想向世界展現你的應用程序的時候,你能夠將你的軟件發佈到Google的
Android 市場。向Andriod Market 發佈程序只一次性的收取註冊費用(25元),而且不像蘋果的App Store
,對每一次的提交都要作檢查,除非你的程序明顯地違法,在通過一個快速檢查的流程後,才能讓你的程序提供給客戶下載和購買。github
下面是Android對於開發者的優勢:shell
- 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的開發人員網頁中詳盡地解釋了具體的安裝配置過程app
- 爲你的平臺下載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.eclipse
Android Open Source Project 平臺是開源的,可是不包括Google公司的私有化擴展,好比Google
Map。若是不選擇使用Google的API,Google的地圖功能就不會在你的應用程序中生效。除非你有特別的緣由,不然咱們推薦你選擇Google平臺,由於這樣你可享受到Google的擴展類庫提供的便利。ide
- 選擇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中內容改成以下的內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# /res/layouts/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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
...
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
...
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
...
// 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
...
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
...
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
|