译者:赵坤
原始来源:
当今的移动设备应用程序开发充满了令人兴奋的事情。 凭借强大的硬件支持、平板电脑以及多样化的软件平台( OS、iOS、WebOS、Phone 7…),移动设备开发者的前景充满了机遇和挑战。
当您想要开始开发移动设备应用程序时,如此多的选择可能会让您感到不知所措。 你应该选择神马平台吗? 我应该学习什么语言? 为您计划的项目选择神马工具? 在本课程中,您将学习如何为公司的移动设备开源操作系统开发应用程序。
为神选择
是一个基于Linux内核的开源平台,安装在来自不同制造商的数千种设备上。 将电子罗盘、相机、GPS、方向传感器等各种移动设备硬件暴露给您的应用程序。
的免费开发工具,让您以零成本开始编写软件。 当您想向全世界展示您的应用程序时,您可以将您的软件发布到市场。 发布程序只收取一次性注册费(25元),并且与苹果的App Store不同,每次提交都会经过检查,除非你的程序明显违法,经过快速的检查过程,才能让你的程序可供其他人使用。客户下载并购买。
以下是开发者的优势:
言归正传,让我们言归正传,开始开发我们的应用程序。
安装和 SDK
建议的应用程序开发环境是使用开发套件 ((ADT))。 我在这里简单说明一下安装过程。如果需要更多详细信息,具体安装和配置过程在开发者网页上有详细说明
选择平台
在开始编写应用程序之前,您需要下载适合您需要开发应用程序的设备的SDK平台。 每个平台都有不同版本的 SDK 可以安装在用户的设备上。 对于 .5 或更高版本,有两个可用平台:Open 和 .
Open平台是开源的,但不包括公司私有的扩展,例如Map。 如果您不选择使用哪个 API,地图功能将无法在您的应用程序中使用。 除非您有特殊原因,否则我们建议您选择该平台,因为您可以享受扩展类库提供的便利。
成功下载所有平台后,您就可以开始开发应用程序了。
创建一个新项目
新建项目向导可以为您创建一个新项目,并生成可以开始运行的文件和代码。 通过向导生成代码可以让您立即获得程序运行的直观图像,并为您提供了帮助您快速上手的方法:
1
2
3
4
5
6
姓名:
版本:Inc.1.6(Api 级别 4)
姓名:
名称: 康..
:
最小 SDK:4
单击完成按钮后,将为您创建一个新的可运行项目。 请注意,您通知了一个名为 的函数。 该代码用于运行您的应用程序。 程序运行时,生成的代码将非常简单地显示“Hello World”消息。
包
包名称是您的应用程序标识符。 当你开始准备在互联网上发布你的应用程序时,使用这个标识符来准确记录你的应用程序的更新过程非常重要,因此使包名唯一非常重要。 尽管我们在这里使用了 com.. 命名空间,但对于真正的应用程序,您应该选择像 com.. 这样的包名称。
SDK版本
Min SDK是你的程序可以运行的最早版本号。 对于每个新版本,SDK都会添加和修改一些方法。 通过选择版本号,( ) 将知道您的应用程序将在等于或高于指定版本的设备上运行。
运行你的应用程序
现在让我们开始在 . 由于这是第一次运行,因此系统会询问您的项目类型:
应用程序将在设备上运行。 此时,由于你没有任何设备,它肯定会在运行时返回失败,询问你是否要创建新的虚拟设备。 (AVD)
虚拟设备
虚拟设备 (AVD) 是模拟现实世界设备(例如手机或平板电脑)的模拟器。 您可以使用 AVD 来测试您的应用程序,而无需购买任何真实设备。
您可以根据需要创建任意数量的 AVD,每个 AVD 都构建在不同版本的平台上。 对于您创建的每个设备,您可以配置不同的硬件属性,例如是否有物理键盘、是否支持 GPS、摄像头的像素等等。
在开始运行应用程序之前,您需要创建 AVD 以运行指定的 SDK 平台(API 1.6)。
让我现在开始:
1
2
3
4
名称:.6
:API (Inc.) - API 级别 4
SD 卡大小:16 MiB
内置皮肤:(HVGA)
运行代码
再次运行您的应用程序 (Ctrl+F11)。 将构建您的项目并运行新的 AVD。 请记住,AVD 模拟完整的系统,因此您需要耐心等待这个缓慢的启动过程,就像重新启动真实设备一样。 一个好的做法是在完成一天的工作之前不要关闭 AVD。
当您的模拟器启动时,自动安装并运行您的应用程序。
开发您的第一个应用程序
生成的代码工作正常,但您真正想要的是开发一个真正的应用程序。 为此,我们首先完成咸蛋设计过程,并开始创建一个可以部署在设备上的应用程序。
大多数开发人员(包括我自己)每天都喜欢喝一杯咖啡或茶。 在下一节中,您将开发一个简单的冲泡计数器应用程序来跟踪用户冲泡了多少杯茶,并为每杯冲泡的茶制作一个计时器。
您可以从 下载整个教程的源代码。
设计用户界面
开发任何应用程序之前的第一步是设计和开发用户界面。 以下是我们应用程序的用户界面的概述。
用户将能够通过+和-按钮设置泡茶定时器。 单击开始按钮后,计时器将开始按指定时间递减。 除非用户再次点击按钮取消计时器,否则当计时器达到 0 时,累计的冲泡计数会加 1。
开发用户界面
用户界面或布局由 XML 文档描述,可以在项目的 res/ 目录下找到。 在前面在模拟器上运行的代码中,我们可以看到布局代码是在res//main.xml中自动生成的。
有一个图形布局设计器,布局设计是通过在屏幕上拖放控件来完成的,但是我发现直接编写XML并使用图形布局进行预览更容易。
现在让我们对 main.xml 做一些工作来实现上面的图像:
将main.xml中的内容更改为以下内容:
# /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>
正如您所看到的,XML 布局文件很麻烦,但可以让您控制屏幕的各个元素。
最重要的界面元素是布局容器,例如示例中使用的布局容器。 这些元素对用户不可见,但充当这些元素的布局容器。
View中有几种不同类型的布局视图,每种类型都用于开发不同的布局。 与 和 一样,允许您使用基于表结构的更复杂的布局。 您可以在 SDK 的 API 文档中的通用布局对象中找到更多布局。
将您的布局与代码关联起来
保存布局,单击“运行”图标或按 Ctrl+F11 在模拟器中重新运行程序。 您现在将看到一个新界面,而不是之前出现的 Hello World 消息。
如果单击界面上的任何按钮,它们将按预期突出显示,但不会执行任何操作。 现在我们来改进布局修改后的源代码:
# /src/com///.java
...
import android.widget.Button;
import android.widget.TextView;
public class BrewClockActivity extends Activity {
protected Button brewAddTime;
protected Button brewDecreaseTime;
protected Button startBrew;
protected TextView brewCountLabel;
protected TextView brewTimeLabel;
...
}
接下来,我们将修改调用。 当启动您的应用程序时,将首先调用此方法。 在生成的代码中,将视图设置为 R..main。 这行代码告诉解释我们的布局配置 XML 文件并显示它。
资源对象
在R中,R是一个自动生成的对象,它是一个特殊的对象,通过它你可以在代码中访问项目中的资源(布局、字符串、菜单、图标……)。 每个资源都有一个给定的 ID。 在上面的布局文件中,有一些 @+id XML 属性。 我们将使用这些值将布局中的总和与我们的代码总和关联起来:
# /src/com///.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);
}
}
监听事件
为了检测用户何时单击我们的按钮,我们需要实现一个侦听器。 您可能熟悉来自其他事件驱动系统的侦听器或回调。 例如 / 或 Rails 回调函数。
例如,通过接口提供类似的机制,该接口定义由事件触发的方法。 实现接口以在用户点击屏幕时通知您的应用程序,并告诉他们按下了哪个屏幕按钮。 当然,您还需要告诉每个人要通知哪个侦听器:
# /src/com///.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
}
}
接下来,我们将为每次按下按钮添加处理。 我们将向该类添加 4 个属性,这些属性将用于允许用户设置和记录我们的冲泡时间、冲泡计数以及计时器是否正在运行。
# /src/com///.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();
}
}
}
请注意,我们使用提供的类。 这使我们能够非常轻松地创建并启动一个简单的倒计时,每次在减量运行时执行减量时都会发出通知。 您将在下面的方法中使用该计数器。
下面的方法中是所有的处理逻辑,用于处理设置泡茶时间、启动和停止计数以及维护计数器。 我们还在方法中初始化我们的 和 变量。
将此代码放入不同的类中是一种很好的做法。 但为了简洁起见,我将所有代码放入:
# /src/com///.java
...
public class BrewClockActivity extends Activity
implements onClickListener {
...
public void onCreate(Bundle savedInstanceState) {
...
// Set the initial brew values
setBrewCount(0);
setBrewTime(3);
}
public void setBrewTime(int minutes) {
if(isBrewing)
return;
brewTime = minutes;
if(brewTime < 1)
brewTime = 1;
brewTimeLabel.setText(String.valueOf(brewTime) + "m");
}
public void setBrewCount(int count) {
brewCount = count;
brewCountLabel.setText(String.valueOf(brewCount));
}
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;
}
public void stopBrew() {
if(brewCountDownTimer != null)
brewCountDownTimer.cancel();
isBrewing = false;
startBrew.setText("Start");
}
...
}
与此代码唯一相关的是使用方法来设置文本的显示文本。 在该方法中,我们创建并启动一个计数器,每秒倒数一次,直到计数器达到 0。请注意,我们内联定义了侦听器和方法。 该方法将每 1000 毫秒(1 秒)执行一次并递减。 当计数器为 0 时,调用该方法。
避免在代码中进行硬编码
为了使教程代码简单,我故意将控件的标签直接写入程序中的字符串中(例如:“Brew Up!”、“Start”、“Stop”)通常,这不是一个好的做法,因为如果在大型项目中,这样做会使修改变得很麻烦。
为您提供了一种使用 R 对象将字符串与代码分离的简洁方法。 R 允许您在 xml 文件 (res//.xml) 中定义程序中的所有字符串,并允许您在代码中应用这些字符串。 例如:
# /res//.xml
<string name="brew_up_label">Brew Up!string>
...
# /res/com///.java
...
brewLabel.setText(R.string.brew_up_label);
...
现在,如果您想更改酿造方式! 文本,您只需修改 .xml 文件一次。 您的应用程序将生成一堆代码,以确保程序中使用这些字符串的所有位置都有效!
运行酿造时钟
代码完成后,就可以测试运行程序了。 单击“运行”或 Ctrl+F11 在模拟器中启动我们的应用程序。 一切都很好,您将看到您创建的用户界面,一旦准备好就可以喝茶了! 尝试设置不同的时间,然后单击“开始”观看倒计时。
总结
在这篇简短的介绍中,您已经学习了如何安装 SDK 和开发工具插件 (ADT)。 您还将学习如何创建模拟设备并针对它测试您的应用程序。 您还学习了如何开发应用程序。 上面标题中的关键概念稍后在您开发自己的应用程序时将经常使用。
我们希望本教程能够激发您开发移动应用程序并进入这个令人兴奋的领域的愿望。 为当前和即将到来的移动设备应用程序开发提供了广阔的道路。 如果您开发了自己的移动应用程序,请在评论中告诉我们。