进入 Android 的移动世界并构建您的第一个应用程序
移动领域是一个充满希望的领域,对于希望进入这一领域的开发人员来说,Android 是一个令人兴奋的平台。本系列将首先对 Android 进行介绍,并专门针对那些希望涉足移动领域的 Java™ 开发人员进行了修改。我们将了解 Android 的分为三层的版本系统(并了解其重要性),然后设置您的开发环境并构建您的第一个 Android 应用程序。
近来,移动技术的迅猛发展势头甚至让业内人士都感到惊讶。在 2012 年 9 月的访谈中,Apple CEO Tim Cook 在讨论 iPad 的成功时表达了这一点。在短短两年内卖出 6700 万个 iPad,这绝对是一个骄人的业绩。Cook 根据历史销售情况比较了这个数字,“这一销售量相当于我们的 Mac 24 年的销售量,iPod 5 年的销售量,以及 iPhone 三年的销售量”。
如 果说 iOS 获得了巨大成功的话,那么以 Java 为中心的 Android 平台自然也表现不俗。根据 Google 最近的一项声明,自 Android 于 2008 年正式发布以来,已有 5 亿台 Android 设备被激活,每天约有 130 万设备激活。据报道,Apple 的 iTunes App Store 和 Google Play 总共有至少 1400000 个应用程序和超过 60,000,000,000 个移动应用程序被下载。
激活所有这些移动设备意味着存在新的应用程序销售机会,以及会有更大的移动开发技术市场。对于想要快速构建移动技能的开发人员而言,Android 是一个不错的起点。如果您可以编写 Java 代码和其他 JVM 语言,那么您可以将最初的学习曲线集中到移动部署需求上面。Android 的多样性意味着您可以轻松地采用和尝试一些较新的技术,如 HTML5 和 PhoneGap。并且其平台的普遍性(附带 Google Play)将确保您的生产应用程序可以得到广泛发布。
面向大众的移动技术系列的第一篇文章将简单介绍 Android。我们首先会了解 Android 非常精巧的版本系统,然后设置一个开发环境,开始构建您的第一个应用程序。
Android 热潮
Android 设备的分发速度超过了其他任何移动平台,这使得 Android 成为您首次移动开发之旅的不二选择,尤其当您是一名 Java 开发人员的时候。Android 的大量采用带来的一个缺点是存储碎片,这为应用程序的测试带来了巨大挑战。大多数开发人员面对的残酷现实是无法为所有 Android 设备和 OS 版本配置文件的组合测试应用程序。(事实上,以一种经济高效的方式进行测试正逐渐成为一种新兴的服务行业)。后续文章将会探讨一些技术问题,包括移植到多 个 Android 配置文件,以及测试 Android 移动应用程序的基于 Java 的工具。本文将了解 Android 的版本控制方面,您可以通过了解版本控制对这个平台进行开发。
Android 版本控制
Android OS 的版本号是连续的,比如 1.6、2.1、4.2 等。版本的命名效仿甜点菜单中的名称:Donut、Eclair 和 Jelly Bean。当有人在 Android 环境下引用 Jelly Bean 时,其实指的是 Android 版本 4.2。Android 版本也可以在 API 级别上进行描述,使用连续的升序整数表示。因此 Android API level 17 就是指 Android 版本 4.2,也就是 Jelly Bean。
如果您觉得这些命名不容易理解,您不是惟一有这种想法的人。但是,理解这些命名非常重要,因为这三种版本名经常互换使用。
在 支持不同 Android 版本方面,大多数 Java 开发人员必须彻底改变他们以前的思维。Java 平台被认为是一项服务器端技术,用户对这项技术的接触通常是通过 Web 页面。如果 Web 页面是可浏览的,那么 Web 页面的访问者并不会关心您的应用程序究竟运行的是哪一个 Java 版本。然而,对于 Android,这意味着应用程序离开了服务器的保护,运行在您无法控制的设备上。
应用程序的许多潜在使用者只在旧设备不能使用后才会升级到新版的 Android OS。到底支持哪一个 Android 操作系统非常重要。虽然最新的 Android 版本是 4.2,但是差不多有半数 Android 设备仍然支持 Android 2.3.x。为 Android 3.1 编写的应用程序可以在 4.2 等新版本上运行,但是无法在 2.3 等老版本上运行。因此,按理说,如果您希望实现更广范围的发布,那么最好的选择是针对较旧的操作系统。
以旧的系统为目标的、更广泛发布的平台的一个弊端是新的版本总是会推出新特性,您可能希望将这些特性用到自己的应用程序中。如果幸运的话,Android 开发团队将会发布兼容库,您可以在旧版本上使用这些新特性。
使用 Android 和 Eclipse ADT 创建并运行应用程序
在 Android 简介的开始部分,我将帮助您尽可能快地创建一个简单的 Android 应用程序。您将使用 Android 4.2 和 Eclipse Android Development Tools (ADT) 插件来创建一个基于 Java 的 Hello World 应用程序。
为 Android 建立开发环境的途径有两种。刚接触 Eclipse 和 Android 的开发人员可以先下载 ADT (Android Developer Tools) Bundle。ADT Bundle 捆绑了一个 Android SDK 和一个 Eclipse 版本,其中已经安装了 ADT 插件。这个程序包可帮助您快速、轻松地使用 Android。
如果 Eclipse 已经安装在台式机上并设置好,那么请手动下载并安装 Android SDK。基础 Android SDK 包含一些可简化 Android 开发的系统工具,但它缺乏 开发特定 Android 版本所需的 Android 库。为您的操作系统下载基础 Android SDK 后,可以访问 SDK 安装目录的工具目录,并运行 清单 1 中的 Android 脚本。
清单 1. 启动 Android SDK Manager
- ~/Development/tools/android/android-sdk-mac_x86/tools$>./android
该脚本启动了 Android SDK Manager,您可以下载 Android 的各种版本和库,并创建模拟程序或虚拟设备实例。Android SDK Manager 打开了一个窗口,其中显示一个很长的要下载的选项的列表,如 图 1 所示。
图 1. SDK Manager
在左侧复选框中,选择 Tools,然后选择 Android 4.2 (API 17)。该文件夹将会显示许多选项。选择 SDK Platform 和 ARM EABI v7a System 图片,如 图 2 所示。
图 2. SDK Manager 中的选择
单击 Install packages 并接受任何必要许可;管理器将完成其余步骤。
创建一个模拟器
接下来,创建一个模拟器实例,这是一个运行应用程序的虚拟设备。模拟器必须以 Android 的特定版本为目标,因此我们将创建一个运行 Android 4.2 的模拟器实例。
再次启动 SDK Manager(如果已关闭的话)。如果 Android SDK 工具或平台工具已更新,则重启 SDK Manager。在 SDK Manager 顶层菜单中,选择 Tools > Manage AVDs 会打开关于 Android Virtual Device Manager 的新对话框,如 图 3 所示。
图 3. Android Virtual Device Manager
该对话框列出了您的机器上定义的所有模拟器。模拟器列表在创建模拟器之前是空的。单击 New 打开 Create a new Android Virtual Device (AVD) 对话框,在其中可以定义一个模拟器。在 Target 下拉列表中选择 Android version 4.2。在 AVD Name 文件夹中,为模拟器命名,我使用的名称是 Android_4.2。当您准备好测试应用程序时,就可以使用该名称从命令行启动模拟器。
图 4. 创建一个新的 Android 虚拟设备
在 图 4 中,您可以看到一些 AVD 选项,包括设备类型、摄像头设置、内存和存储。在我的示例中,选择了 Galaxy Nexus,对它使用了一个 200MB 的 SD 卡。最后,我选中了 Use Host GPU 模拟选项,这可以提高模拟器实例的性能。
单击 OK,在 AVD 对话框中查看列出的新的虚拟设备。选择该设备并单击 Start,这将打开一个带有启动选项的对话框。现在,使用默认值并单击 Launch。模拟器实例的启动时间较长,因此这个时候可以去喝一杯咖啡,浏览一下 Facebook 或更新您的 Twitter 状态。
图 5. 新的 Android 设备!
过一会后,一个闪亮的模拟器设备(类似 图 5)将会显示在您的主屏幕上,这意味着您可以开始创建 Android 4.2 应用程序了。
#p#
设置 Eclipse ADT
如果 Eclipse 已经安装到系统中,那么您必须在继续后面的操作之前添加 Android Development Tools (ADT) 插件库。
在 Eclipse 菜单中,打开 Help > Find New Software。单击 Add 和 ADT 插件的 URL:https://dl-ssl.google.com/android/eclipse/(参见 图 6)。
图 6. 添加 ADT 插件库
完成插件下载后,根据操作说明完成安装。将 ADT 插件配置为可以使用您刚才安装的 SDK。现在,您的项目已针对 Android 4.2 平台完成了设置,并使用了您配置好的模拟器。
使用 Android 4.2!
要在 Eclipse 中创建 Android 应用程序,请选择创建 Android Application Project 的选项。在 New Android Application 对话框中,提供应用程序名称、项目名称和包名称。应用程序名称 是用户在设备图标中看到的内容;而项目名称 是您的项目在 Eclipse 中的名称。
图 7. 创建一个新的 Android 项目
在 图 7 所示的 New Android Application 对话框中执行下面的步骤:
- 在 Target SDK 下拉列表中,选择 API 17: Android 4.2 (Jelly Bean),然后单击 Next。
- 在下一个对话框中,保留默认设置,但是您可以将最终生成的代码放到任意位置。单击 Next。
- 保留 Configure Launcher Icon 对话框中的默认设置并单击 Next。
- 保留 Create Activity 对话框和最终对话框中的默认设置,这些设置用于选择应用程序的行为。单击 Finish。
如果项目创建成功,您会看到一个新的项目,其用户界面类似 图 8 中所示的界面。
图 8. Eclipse 中的样例启动项目
在 Android 模拟器中运行应用程序
默认情况下,使用 ADT 项目向导创建的 Android 项目将创建一个简单的 Hello World 移动应用程序(参见 图 8)。在开始修饰这个应用程序之前,让我们来看一看在模拟器上运行这个基本应用程序会发生什么。
如果 Android 4.2 模拟器处于关闭状态,请打开它。这一次不会在 AVD Manager 中启动模拟器,而是通过命令行启动它。您可以从 SDK 的 tools 目录访问 emulator 脚本。在启动脚本时,系统会要求您提供您的模拟器的名称。我的模拟器的名称为 Android_4.2,因此我在 清单 2 中运行脚本来启动我的模拟器实例:
清单 2. 在命令行中访问模拟器
- ~/Development/tools/android/android-sdk-mac_x86/tools$>./emulator -avd Android_4.2
启动您的模拟器实例,返回 Eclipse,然后选择您的项目。右键单击并选择 Run As > Android Application。
图 9. 从 Eclipse 中运行项目
默认情况下,Eclipse 将在目前正运行的模拟器上部署您的应用程序(图 9)。您的模拟器实例现在显示了一个白色的屏幕,其中显示了所有 Java 开发人员都喜欢的问候语!如果 Eclipse 因为某种原因在模拟器上运行应用程序时出现故障,则需要返回到 Run As 选项并选择 Run Configurations。在 Target 选项卡中,重新选择 Automatically select compatible device,并确保您的模拟器也被选中。
图 10. Hello World!
#p#
基本 Android 应用程序
您现在有了一个基本的 Hello World 应用程序,可以在任何与 4.2 兼容的 Android 设备上运行它。最后,您可能希望定制这个应用程序,以便添加更多的功能。目前,我希望对 Android 应用程序进行分析。
回到 Eclipse IDE。在项目的 src 目录中,导航到项目的 .java 文件。如果您保留了所有默认值,那么该文件的名称应为 MainActivity。Activity 类是 Android 移动应用程序的驱动引擎,类似于 servlets 对于 Java 服务器端应用程序的意义。每个 Activity 都有一个生命周期,类似于 Java applet 的生命周期。
Hello World 应用程序只包含基本的架构,因此其 Activity 非常简单。首先,该类将从 Android 的 Activity 类扩展。activity 的入口点是 onCreate 方法,它在应用程序加载时由平台启动。这个方法中的关键代码是 setContentView 调用。清单 3 显示了默认的 MainActivity 类。
清单 3. MainActivity
- package com.example.hello;
- import android.os.Bundle;
- import android.app.Activity;
- import android.view.Menu;
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_main, menu);
- return true;
- }
- }
在 清单 3 中,setContentView 加载了 activity_main 布局,它是您在第一次打开项目时在 Eclipse 中看到的视图的名称。该名称与 res/layout 目录中的 activity_main.xml 文件对应。打开该文件,查看应用程序的图形化表示。在视图的左下方的选项卡中,有一个查看原始 XML 文件的选项,可以单击该选项来查看原始文件,内容类似于 清单 4。
清单 4. 原始布局的定义
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity" >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_centerVertical="true"
- android:text="@string/hello_world" />
- </RelativeLayout>
Android 视图是在 XML 文件中定义的。每个视图都有一个布局,您可以向其中添加小部件,比如按钮或文本字段。目前,样例应用程序有一个 RelativeLayout 和一个小部件: TextView。如果仔细观察这个小部件,您会发现一个文本字段,它被设置为一个引用:@string/hello_world。
该变量是指向实际字符串的指针,您可以在 res/values/strings.xml 文件中找到它。打开该文件。要查看原始 XML,请单击左下方区域的 strings.xml 选项卡。
清单 5. strings.xml 文件
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="app_name">Hello 4.2</string>
- <string name="hello_world">Hello world!</string>
- <string name="menu_settings">Settings</string>
- </resources>
清单 5 中的第二个字符串定义将 hello_world 映射到 Hello World!。
Android manifest
您目前已经了解了 Android 应用程序的三个重要元素是如何联系起来的:行为、布局和资源文件。在应用程序启动时,Android OS 将调用 MainActivity 的 onCreate 方法。onCreate 方法随后会加载布局,该布局从另一个 XML 资源文件获取一些值。在本例中,结果是一个显示了 “Hello World!” 的简单的 UI。
但是,设备如何知道应该调用哪个 Activity?现在是 AndroidManifest.xml 发挥作用的时候了。在项目根目录中查看这个文件。单击该文件,Eclipse 会加载一个简洁的定制视图,视图左下角有一些选项卡。单击标签为 AndroidManifest.xml 的选项卡将会显示 清单 6 所示的原始 XML。
清单 6. AndroidManifest.xml
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.hello"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="17" />
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.example.hello.MainActivity"
- 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>
该文件的作用是向底层设备解释您的应用程序。它包含一个名为 application 的 XML 块,其中定义了 activity。您的 MainActivity 将被引用,action 被定义并包含一个 category。action 会告诉设备要启动哪一个 Activity。在本例中,action 将您的 Activity 描述为 MAIN。
AndroidManifest.xml 文件中的其他重要声明包括 uses-sdk 部分,它表示 min 版本为 8(即 Android 2.2.x),目标版本为 17,即 Android 4.2。我在后面的文章中将会介绍这些细节。现在,只需明白 Android 平台提供了可以兼容早期版本的库就足够了。
结束语
您的第一个 Android 应用程序已经成功创建。在这个过程中,您了解了有关 Android(和移动开发)的一些重要内容。您安装了 Android 的 SDK,下载了 Android 版本 4.2,并创建了一个 AVD(即模拟器)来模拟应用程序在设备上的运行。如果使用的是 Eclipse,那么需要将 IDE 配置为可以构建并将 Android 应用程序部署到所选的 AVD 中。要在 Android 中创建应用程序,必须执行所有这些设置。
您还看到了将 Android 应用程序关联起来是多么简单,可以使用 Activity 类完成大部分工作,使用 AndroidManifest.xml 为底层设备定义 Activity 类。您会看到最终结果:一个简单的 Hello World 应用程序,并对它继续进行定制。
我们在下一篇文章中将深入讨论 Android。同时,我建议您研究一下目前完成的应用程序设置。添加一些小部件或修改 XML 文件中的某些值。如果您还意犹未尽,那么可以尝试创建一个不包含默认值的新的 Hello World 应用程序。