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
|