admin 管理员组文章数量: 887021
2023年12月18日发(作者:linux命令tach)
Android基础教程
开始之前
本教程介绍如何在 Eclipse 环境中进行 Android 应用程序开发,包括两个示例应用程序。第一个示例是一个基本的应用程序,涉及构建和调试的所有阶段。第二个应用程序示例涉及比较复杂的
Android 特性,包括联系人搜索和 Google Maps 地址查找。要想从本教程获得最大收益,具备移动开发经验会有帮助,但不是必需的。开发 Android 应用程序需要 Java™ 编程技能,但是对于本教程不是必需的。
关于本教程
我们为什么要关注 Android?有两个原因使 Android 成为重要的平台。首先,Google 引入了 Android,它在很短时间内就获得了市场的关注。Google 正在进军移动市场。它在这个市场上采取的第一个行动就是发布 Android 和 Open Handset Alliance,这是一个令人印象深刻的起点。第二,Android 不仅仅是另一种包含电话、菜单和触摸屏功能的移动平台。您将在本教程中了解到,Android
提供了一种不同的应用程序开发方法。由于可以对请求的操作和代码进行运行时绑定,Android 的体系结构支持高度可定制的软件环境。无论是考虑市场因素还是 Android 的技术方面,它都是一个值得研究的平台。
本教程分为以下几节:
•
Android 基础知识和必需的工具
•
•
•
Android Software Developer Kit
构建和调试 SaySomething Android 应用程序
创建内容提供器和 Google Maps 应用程序
系统需求
本教程需要结合使用几种技术。
Eclipse 平台
Eclipse 是一个运行插件的平台。您应该安装 Eclipse Classic
的最新版本(本教程使用 V3.3.1)。
Android Developer Tools
按照 安装 Android SDK 中的说明安装 Android Developer
Tools(Eclipse 插件)。
源代码
本教程中的源代码片段包括:
•
(片段)— 这个文件是 Android
应用程序的应用程序部署描述符。
•
IntentReceiver — 演示 IntentReceiver 的实现,这个类处理 文件中
IntentFilter 标记所公布的 intent。
•
— 实现一个 Android 活动,这是本教程的示例应用程序的主要入口点。
•
— 这个文件包含 Android 活动所用的视觉元素或资源。
•
— 这个文件是由 Android Developer Tools 自动生成的,它把视觉资源 “连接” 到 Java 源代码。
•
(完整)— 这是完整的
文件,包含每个重要元素的描述。
•
— 这个文件包含的代码显示联系人并对用户输入做出反应,执行 Google
Maps 地址查找。
•
•
Android 简介
在讨论 Eclipse 插件和开发 Android 应用程序之前,我们先看看 Android 的体系结构和一些重要的术语,这会对本教程后面的讨论和您自己构建 Android 应用程序有帮助。
•
•
Android 术语
在 Eclipse 环境中开发 Android 应用程序需要了解 Eclipse
环境和 Android 平台的知识。了解以下术语会有助于用
Eclipse 插件开发 Android 应用程序。
•
•
Open Handset Alliance
这是一个由 Google 公司主导的组织,它由许多公共和私人组织组成。
•
Android
•
这是 Open Handset Alliance 的主打产品。它是一种针对移动设备的开放源码操作环境。
•
•
模拟器
模拟另一个系统的软件工具 — 这常常是在个人计算机(IBM®、Mac、Linux®)上运行的一个环境,它模拟另一个环境,比如移动计算设备。
•
•
Linux
一种开放源码的操作系统内核,许多计算平台都使用这种操作系统,包括服务器、桌面计算机、网络设备和移动计算设备。Android 在 Linux 内核上运行。
•
•
Dalvik Virtual Machine
Dalvik VM 是 Android 产品组合中的一种操作环境,它在运行时解释应用程序代码。Dalvik VM 与 Java VM 相似,但是两者不兼容。
Android 基础知识和必需的工具
Android 是一种针对移动平台的开放源码操作系统。到编写本教程时,它是一种纯软件的平台,没有可用的硬件设备。
Android 平台被称为一个产品组合,因为它是一系列组件的集合,包括:
•
•
基于 Linux 内核的操作系统
Java 编程环境
•
•
工具集,包括编译器、资源编译器、调试器和模拟器
用来运行应用程序的 Dalvik VM
简要介绍了 Android 平台的体系结构之后,我们来从市场的角度看看这个平台的一些重要特性。
Android 为什么很重要?
自从 Android 和最初的 SDK 发布以来,计算机技术新闻界一直非常关注 Android。Android 之所以重要主要有两个原因。
Android 是 Google 进军移动市场的主要行动。移动应用程序领域竞争激烈,新的竞争者很难涉足。Google 拥有大量资源和强大的品牌实力,有能力涉足任何市场。Google 进军移动市场已经好几年了。Android 原来属于另一家公司,Google 通过收购这家公司大大提高了在移动市场上的竞争力。Google 的任何行动都会受到关注,而且引入新平台也很引人注目。Android 同时具备这两个因素。
第二个原因是 Android 的应用程序模型与众不同。Android 应用程序并不是需要大量单击操作的纯粹的菜单式应用程序。Android 应用程序中确实有菜单和按钮,但是 Android 在体系结构中引入了一种新颖的设计元素 intent。
intent
intent 是一种构造,应用程序可以通过它发出请求,这就像是发出求助信号。intent 可能像下面这样:
"Wanted: An application to help me look up a contact" 或 "Wanted:
An application to help me display this image" 或 "Wanted: An
application to perform this geographic-based search"
应用程序可以按照相似或互补的方式进行注册,表明它们有能力或有兴趣执行各种请求或 intent。比如:
"Available: Application ready and willing to present contact records
in clear, concise manner" 或 "Available: Application ready and
willing to perform a geographic search"
这些是 IntentFilter 的示例,下面将要讨论。
IntentFilter
应用程序通过一个称为 IntentFilter 的构造声明它们能够执行某些类型的操作。IntentFilter 可以在运行时进行注册,也可以在 文件中设置。下面的代码片段取自一个对 SMS(文本)消息进行响应的 Android 应用程序:
清单 1. 对 SMS 进行响应的 Android 应用程序
android:value="_RECEIVED" /> 简要介绍 intent 和 IntentFilter 之后,下一节介绍 Android 应用程序的四种主要类型。 我们来看看 Android 应用程序的四种主要类型:活动、服务、接收器和 ContentProvider。我们还要看看显示用户界面(UI)元素的视图。 活动 活动是最常用的 Android 应用程序形式。活动在一个称为视图 的类的帮助下,为应用程序提供 UI。视图类实现各种 UI 元素,比如文本框、标签、按钮和计算平台上常见的其他 UI 元素。 一个应用程序可以包含一个或多个活动。这些活动通常与应用程序中的屏幕形成一对一关系。 应用程序通过调用 startActivity() 或 startSubActivity() 方法从一个活动转移到另一个活动。如果应用程序只需 “切换” 到新的活动,就应该使用前一个方法。如果需要异步的调用/响应模式,就使用后一个方法。在这两种情况下,都需要通过方法的参数传递一个 intent。 由操作系统负责决定哪个活动最适合满足指定的 intent。 服务和接收器 与其他多任务计算环境一样,“在后台” 运行着一些应用程序,它们执行各种任务。Android 把这种应用程序称为 “服务”。服务是没有 UI 的 Android 应用程序。 接收器是一个应用程序组件,它接收请求并处理 intent。与服务一样,接收器在一般情况下也没有 UI 元素。接收器通常在 文件中注册。清单 2 是接收器代码的示例。注意,接收器的类属性是负责实现这个接收器的 Java 类。 清单 2. 接收器代码 package receiver; import t; import ; import Receiver; public class myreceiver extends IntentReceiver { public void onReceiveIntent(Context arg0, Intent arg1) { // do something when this method is invoked. } } 用 ContentProvider 进行数据管理 ContentProvider 是 Android 的数据存储抽象机制。我们以移动设备上常见的一种数据为例:地址簿或联系人数据库。地址簿包含所有联系人及其电话号码,用户在使用手机时可能需要使用这些 数据。ContentProvider 对数据存储的访问方法进行抽象。ContentProvider 在许多方面起到数据库服务器的作用。对数据存储中数据的读写操作应该通过适当的 ContentProvider 传递,而不是直接访问文件或数据库。可能还有 ContentProvider 的 “客户机” 和 “实现”。 下一节介绍 Android 视图,这是 Android 在移动设备屏幕上显示 UI 元素的机制。 视图 Android 活动通过视图显示 UI 元素。视图采用以下布局设计之一: LinearVertical 后续的每个元素都排在前一个元素下面,形成一个单一列。 LinearHorizontal 后续的每个元素都排在前一个元素右边,形成一个单一行。 Relative 后续的每个元素相对于前一个元素有一定的偏移量。 Table 与 HTML 表相似的一系列行和列。每个单元格可以包含一个视图元素。 选择一种布局(或布局的组合)之后,就可以用各个视图显示 UI。 视图元素由大家熟悉的 UI 元素组成,包括: • • • • • • • • • • • • • Button ImageButton EditText TextView(与标签相似) CheckBox Radio Button Gallery 和 ImageSwitcher(用来显示多个图像) List Grid DatePicker TimePicker Spinner(与组合框相似) AutoComplete(具有文本自动补全特性的 EditText) 视图是在一个 XML 文件中定义的。清单 3 给出一个简单的 LinearVertical 布局示例。 清单 3. 简单的 LinearVertical 布局 xmlns:android="/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Activity 1!" /> android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Activity 1, second text view!" /> 注意,每个元素有一个或多个属于 Android 名称空间的属性。 下一节讨论如何获取 Android SDK 并在 Eclipse 环境中配置它。 获取和安装 Eclipse 如果您还没有安装 Eclipse,那么从 Eclipse Foundation 下载并安装 Eclipse IDE 最新的稳定版ECLIPSE3.4(参见 参考资料)。安装包是一个压缩的文件夹。把这个文件夹的内容解压到您计算机上的适当位置。安装程序并不在 Windows® 上创建任何图标或快捷方式。对于本教程,Eclipse 文件夹位于 c:softwareeclipse 目录。 双击 eclipse 安装目录中的 启动 Eclipse。这会启动 IDE。软件提示您指定一个 “工作空间” 并建议一个默认位置,比如 c:documents and settingsusernameworkspace。选择这个位置或者指定另一个工作空间位置。 启动 Eclipse 之后,单击主屏幕上的 Workbench - Go to the workbench 图标。 现在该获取 Android SDK 了。 获取和安装 Android SDK 在 参考资料 中找到 Android 的下载链接。 有针对 Windows、Mac OS X(只有 Intel® 版)和 Linux(i386)的 SDK 安装版。选择适合您平台的最新的 SDK 版本。注意,到编写本教程时,最新的 Android SDK 版本是 m3-rc37a。 Android SDK 是一个压缩的文件夹。下载这个文件夹并把它的内容解压到您计算机上的适当位置。对于本教程,SDK 安装在 c:softwaregoogleandroid_m3-rc37a。显然,如果要在 Mac OS X 和 Linux 上安装 SDK,应该安装在通常安装开发工具的位置。 Eclipse 和 Android SDK 都已经安装好了。现在应该安装 Eclipse 插件。 获取并安装 Eclipse 插件 下面介绍安装 Eclipse 插件 Android Developer Tools 的步骤。注意,Android 网站上也提供了安装说明。更多信息请参见 参考资料。 按照以下步骤安装 Android Developer Tools: 1. 在 Eclipse 中运行 “Find and Install” 特性(在 Help > Software Updates 菜单下面)。 2. 选择 Search for new features to install 选项。 3. 选择 New Remote Site。给站点命名,比如 “Android Developer Tools”。在对话框中输入以下 URL:/android/eclipse。注意,这个 URL 使用 HTTPS 协议。这是一个安全的下载。 图 1. New Update Site 4. 列表中会增加一个新条目并被默认选中。单击 Finish。搜索结果会显示 Android Developer Tools。选择 Developer Tools 并单击 Next。 5. 阅读并接受许可协议之后,单击 Next。注意,许可协议中对于使用 Google Maps API 有一个特殊的要求。 6. 检查并接受安装位置,然后单击 Finish。 现在下载并安装这个插件。这个插件没有经过数字签名(到编写本教程时),所以只需单击 Install All,然后重新启动 Eclipse。 配置 Eclipse 插件 重新启动 Eclipse 之后,应该把这个插件连接到 SDK 的安装位置。在 Window 菜单中选择 Preferences。单击左边树视图中的 Android。在右边的面板中,指定 SDK 的安装位置。本教程使用的安装位置是 c:softwaregoogleandroidm3-rc37a(同样,在 Mac OS X 和 Linux 系统上也应该使用适当的位置)。 指定 SDK 安装位置之后,可以配置另外三部分设置。下面简要介绍一下: • Build 部分中的选项用来自动地重新构建资源。保持这个选项的设置不变。Build 选项可以改变输出的详细程度。Normal 是默认设置。 • DDMS — Dalvik Debug Monitor Service 用来监视正在运行的 VM。这些设置指定调试器用来连接 VM 的 TCP/IP 端口号、各个日志记录级别和选项。默认设置应该是合适的。 • LogCat — 这是在底层 Linux 系统上创建的一个日志文件。可以在这个对话框中选择字体。根据需要调整这个选项。 好了!Eclipse 环境已经设置好了,可以开始创建 Android 应用程序了。 构建 SaySomething Android 应用程序 本节要使用 Android Developer Tools 创建一个基本的 Android 应用程序,它称为 SaySomething。创建这个应用程序之后,将调试和运行它。 New project 向导 第一步是创建一个新项目。选择用来创建 Android 项目的向导,如下所示。 图 2. New project 向导 这个应用程序需要: • • • • • Name Location Package name Activity name — 可以认为这是应用程序的主 “表单” 或屏幕 Application name 看看这个新项目。 图 3. 新的 Android 项目 这会创建一个默认的应用程序,可以构建和运行它。可以在 Package Explorer 中查看它的组件。 Package Explorer Package Explorer(在 Eclipse 的 Java 透视图中)显示 Android 示例应用程序的所有组件,见图 4。 图 4. Package Explorer 需要注意的组件包括: src 文件夹 包含示例应用程序的包,即 orial。 Android Developer Tools 自动创建这个文件,它提供访问 Android 应用程序的各种资源所需的常量。后面会详细讨论 R 类与资源之间的关系。 应用程序的主活动类的实现。 Referenced libraries 包含 ,这是 Android SDK 中的 Android 运行时类的 jar 文件。 res 文件夹 包含应用程序的资源,包括: • • • 图标 布局文件 字符串 示例应用程序的部署描述符。 接下来,详细研究一下源代码。 应用程序的主活动 这个示例应用程序由一个活动组成,即 SaySomething。正如前面提到的,SaySomething 类是在 文件中实现的。 清单 4. package orial; import ty; import ; public class SaySomething extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { te(icicle); setContentView(); } } 在这个源代码片段中,要注意几点: • SaySomething 是一个普通的 Java 类,包含包和导入语句。 • SaySomething 扩展 包中的 Android 基类 Activity。 • onCreate() 方法是这个活动的入口点,它接受一个 Bundle 类型的参数。Bundle 类本质上是 map 或 hashmap 的包装器。在这个参数中传递构造活动所需的元素。本教程不讨论这个参数。 • setContentView(..) 负责用 参数创建主 UI。 是应用程序资源中主布局的标识符。 下一节讨论示例应用程序的资源。 应用程序的资源 正如前面提到的,Android 中的资源放在项目的 res 子目录中。资源分为三类: Drawables 这个文件夹包含图形文件,比如图标和位图。 Layouts 这个文件夹包含表示应用程序布局和视图的 XML 文件。后面会详细研究这些文件。 Values 这个文件夹包含 文件。这是为应用程序实现字符串本地化的主要方法。 下一节研究 文件,了解示例应用程序的 UI 资源。 这个示例应用程序包含一个活动和一个视图。应用程序包含一个名为 的文件,它代表活动的主 UI 的视觉方面。注意,在 中没有指定在哪里使用这个布局。这意味着,如果需要的话,可以在多个活动中使用它。清单 5 给出布局文件的内容。 清单 5. 布局文件 xmlns:android="/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World, SaySomething" /> 这是最简单的布局,其中只有一个垂直的线性布局,这意味着所有元素排成一列。这里有一个 TextView 元素,它与其他开发环境中的标签类似。TextView 代表不可编辑的静态文本。 注意,每个视图元素(比如这个示例中的 LinearLayout 和 TextView)都有属于 Android 名称空间的属性。一些属性是所有视图元素都有的,比如 android:layout_width 和 android:layout_height。这些属性可以采用的值是: fill_parent 使视图元素占满可用的空间。也可以认为这就是 “拉伸”。 wrap_content 这个值让 Android 把元素一个接一个地排列,不进行拉伸。 在构建期间,对所有资源进行编译。编译过程的输出之一是 文件,这个文件向应用程序的其余部分提供资源。下面讨论 文件。 文件是在构建时自动创建的,所以不要手工修改它,因为所有修改都会丢失。清单 6 给出这个示例应用程序的 文件。 清单 6. 文件 /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */ package orial; public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040000; } } R 类包含一些匿名子类,每个子类包含前面描述的各种资源的标识符。注意,这些类都是静态的。 请注意 代表的元素。这个标识符代表由 定义的布局。在活动的 onCreate 方法中使用过这个值:setContentView();。这就是在运行时把特定的活动(在这个示例中是 SayAnything)和特定的布局(主布局)联系在一起的方法。 构建应用程序 在默认情况下,每次保存文件时,都将对它们进行编译。 图 5. 错误面板 我们在源代码中引入了一个错误,即在 setContent 和 View 之间加了一个空格。在保存这个文件时,它被编译并在屏幕底部的 Problems 面板中显示错误。在源代码中纠正这个错误之后,应用程序就能够成功编译,并从问题列表中删除错误。 文件是 Android 应用程序的部署描述符。这个文件列出应用程序中包含的所有活动、服务、内容提供器和接收器,以及应用程序支持的 IntentFilter。下面是这个示例应用程序的完整的 文件。 清单 7. 文件 xmlns:android="/apk/res/android" package="orial"> android:label="@string/app_name"> android:value="" /> android:value="ER" /> 请注意以下情况: • 这里指定了源文件中的包名。这里采用与 Java 源文件和导入语句相似的模式。 这个包中的类。在这个文件中,所有非完全限定的类都属于 package 属性指定的包。 • 的资源。 • o o class 属性表示实现这个活动的 Java 类。 android:label 是应用程序的名称。注意,它来自一个字符串资源。 文件包含应用程序的本地化字符串。 o IntentFilter。这是 Android 应用程序中最常见的 IntentFilter。这个过滤器的实际意思是,它实现 “主” 操作(也就是入口点),而且它位于 OS 的启动器中。这意味着可以在 Android 设备上像启动其他应用程序一样,从应用程序主列表中启动它。 下一节讨论如何在 Eclipse 中的 Android 模拟器上启动应用程序。 运行应用程序 应用程序已经成功地编译了,现在该运行这个示例应用程序了。在 Eclipse 中选择 Open Run Dialog 或工具栏上的快捷按钮。这会打开一个对话框,可以在这里创建启动配置。选择 Android Application 选项并单击 New 的图标。 图 6 显示本教程示例所用的值。 图 6. Run 对话框 指定配置名称。本教程使用的名称是 Tutorial Configuration。在可用项目列表中选择 ibmtutorial 项目(单击 Browse 可以看到可用项目)。在下拉列表中选择启动活动。现在选择 Emulator 选项 卡,根据需要指定模拟器设置。可以保持默认设置。有两个设置需要注意,见图 7。 图 7. Run 对话框,Emulator 选项卡 有几种可供选择的屏幕大小和方向,还有网络选择。如果运行应用程序的移动设备的因特网连接速度不同,网络选择就很重要了。在构造应用程序原型时,选择完整网络速度而且没有延迟。开发了主要功能之后,最好在比较真实的网络环境中进行测试,看看应用程序的响应速度如何。 选择 Run 运行示例应用程序。 图 8. 模拟器 应用程序已经在模拟器上运行了,现在看看幕后发生的情况。Dalvik Debug Monitor Service(DDMS)将会帮助检查应用程序的运行情况。 调试应用程序 要想检查正在运行的应用程序中发生了什么情况,就需要查看正在运行的 Dalvik VM。在 Eclipse 中,选择 Window > Open Perspective > Other。在出现的对话框中选择 DDMS。这会在 Eclipse 中打开一个新的透视图,其中有许多有趣的窗口。下面简要介绍一下 DDMS 透视图中提供的资源: LogCat 是一个日志文件,它记录 VM 中发生的活动。应用程序可以通过 Log.i(tag,message); 在这个日志文件中添加自己的日志项,其中的 tag 和 message 都是 Java 字符串。Log 类属于 包。 图 9 显示 LogCat。 图 9. LogCat DDMS 中的另一个方便的工具是文件管理器,可以用它访问模拟器的文件系统。图 10 显示在模拟器上部署本教程示例应用程序的位置。 图 10. 在模拟器上部署的示例应用程序 用户应用程序部署在 /data/app 目录中,而 Android 内置的应用程序部署在 /system/app 目录中。 在 DDMS 中还可以查看正在运行的进程。 图 11. 正在运行的进程列表 全面讨论 Android 应用程序的调试超出了本教程的范围,更多信息请参见 参考资料。 您已经看到了一个完整的应用程序示例,现在简要讨论一下更加复杂的应用程序。 内容提供器和 Google Maps 本教程中讨论的第二个应用程序适用于提供上门服务的专业人员,比如设备维修技术人员,这些人必须找到去客户地址的路线。这个应用程序使用 Android 内置的联系人数据库作为记录存储库。本节将讲解如何访问内容提供器中的数据,还将看看 intent 的效果。我们将用联系人数据库中的地址数据执行 Google Maps 搜索。为了让这个应用程序在 Android 模拟器上正确运行,必须记录一些联系 人,而且必须填写家庭地址字段。图 12 显示模拟器中与联系人应用程序相关的条目。 图 12. 模拟器中与联系人应用程序相关的条目 下面是这个应用程序的一个代码片段。注意,这个应用程序的主 Activity 类扩展 ListActivity。这是因为我们需要在列表中显示信息。 清单 8. 第一个代码片段 public class MobileServiceCallContacts extends ListActivity { final String tag = "MSCC"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { te(icicle); setContentView(); // Get a cursor with all people Cursor c = getContentResolver().query(T_URI, null, null, null, null); startManagingCursor(c); ListAdapter adapter = new SimpleCursorAdapter(this,android.R. _list_item_1,c,new String[] {} ,new int[] {1}); setListAdapter(adapter); } ... } 注意,这里使用游标类查询联系人数据库。这个 “结果集” 游标通过 ListAdapter 类链接到 UI。图 13 显示当设备上记录了联系人时应用程序的效果。注意,这个屏幕上的记录没有排序。 图 13. 应用程序的运行效果 可以通过鼠标单击、按模拟器的中间按钮或按键盘上的 Enter 键选择一个联系人。选择联系人之后,代码必须查询所选联系人的地址。这要使用覆盖的 onListItemClick() 方法。这个方法的实现有四个重要参数,其中最重要的是 dbidentifier。因为游标绑定到 UI,所以在调用这个方法时,它实际上会获得底层数据源的标识符。可以使用 dbidentifier 字段在联系人数据库中查询所 需的信息。还可以使用它启动联系人应用程序,所用的 intent 见清单 9 中被注释掉的代码。 书签 清单 9. 覆盖的 onListItemClick() 方法 @Override protected void onListItemClick(ListView list,View view,int position,long dbidentifier) { ItemClick(list,view,position,dbidentifier); try { // this commented out code below will launch the Contacts application // and "view" the contact Intent myIntent = new Intent(t. // _ACTION,new ContentURI("content://contacts/people/" |-------10--------20--------30--------40--------50--------60--------70--------80--------9| |-------- XML error: The previous line is longer than the max of 90 characters ---------| // + dbidentifier)); startSubActivity(myIntent,position); // let's lookup specifics on this record ContentURI theContact = new ContentURI(T_()); // IMPORTANT // in order to use this sample application, you need to have at least // one Contact record on your Android emulator // and be sure to have populated the 'Home Address field' // // this "where clause" is for HOME address and for the person record // selected in the GUI (id, dbidentifier) Cursor c = managedQuery(theContact,null," type = 1 and person = " + dbidentifier,null); if (!()) { showAlert("MSCC","No Contact Methods Available!","",true); return; } String address = ing(umnIndex("data")); address = e("n",""); address = e(",",""); address = e(" ","+"); Intent geoIntent = new Intent("", new ContentURI ("geo:0,0?q=" + address)); startActivity(geoIntent); } catch (Exception ee) { Log.i(tag,sage()); } } 找到地址之后,需要通过一些简单的字符串操作清理数据,准备查询 Google Maps。geoIntent 是一个用来执行地理搜索的新的 intent,它通过调用 Google Maps 提供默认的 Android 模拟器图像。 第一个应用程序的所有主要元素仍然适用于这个应用程序。它有一个从主应用程序屏幕启动的活动。当然,还有 文件。在 下载 一节中可以找到完整的源代码。 关于第二个应用程序,还有最后一点需要注意。 文件中包含一个条目,它使应用程序能够读取联系人数据库: id="_CONTACTS" />。如果不这样做,Linux 内核就会禁止应用程序访问联系人数据库。 结束语 本教程介绍了 Android 平台、Android Developer Tools 以及在 Eclipse 中开发 Android 应用程序时涉及的关键概念。通过使用 Android Developer Tools,可以在强大的 Eclipse 开发环境中构建和测试 Android 应用程序。您现在可以开始创建自己的 Android 应用程序了。 构建 Android 手机 RSS 阅读器 如果不能随时了解最喜欢的新闻提要,那么移动计算环境又有什么用呢?当然,可以使用 Android 的浏览器浏览最喜爱的 Web 站点,但遗憾的是,这些站点很可能没有针对两英寸高的屏幕进行优化。此外,您也无法使用其他移动应用程序集成 RSS 或其他 XML 数据以构建自己的 mash-up。本教程将展示如何使用 Android Developer Tools 读取、解析和显示 XML 数据。 开始之前 本教程介绍了如何在 Android 平台之上处理 XML。要按照本教程构建样例应用程序,必须在开发计算机中安装和运行 Android SDK。推荐使用 Eclipse 构建 Android 应用程序,但不作硬性要求。具备移动开发经验固然有帮助,常用缩写词 但是 Android 应用程序开发要求具• DOM:文档对象模型(Document Object Model) 有 Java™ 编程技能,这将有助于本• GUI:图形用户界面(Graphical user interface) 教程的学习。 • HTTP:超文本传输协议(Hyper Text Transport Protocol) 关于本教程 • • RSS:真正简单的连锁(Really Simple Syndication) SAX:XML 简单API(Simple API for XML) SDK:软件开发套件(Software Development Kit) Android 的 RSS 阅读器为什么值得我们关注?XML 又是如何融入其中的呢?首先,Android 是一种在移动• • XML:可扩展标记语言(Extensible Markup Language) 市场中迅速获得广泛关注的平台。甚 至在配备了 Android 的消费型设备出现之前,许多开发人员就已纷纷投入到这一移动市场,希望为即 将出现的、备受期待的 Android 式设备做好准备。诸如 Android 这样的富设备(Rich device)要求提供内容。某些情况下,内容的表现形式为游戏或一个生产力应用程序。然而,除了移动电子邮件外,最能够驱动数据使用的内容是新闻和信息。这种内容可能看上去类似于与特定金融市场有关的新闻,或者是天气预报这种比较普遍的信息。对于周末想到海边度假的人,自然十分关心天气预报。于是,以一种简单、实用的方式从移动设备获取数据成为了摆在人们面前的一道难题。 Android 包含了 浏览器引擎,这意味着它可以向移动用户交付高质量的浏览器体验。然而,对于一个小型屏幕和有限的输入设备,在多个 Web 站点中查找新闻和消息是非常乏味的事情。不要误会,自从出现 WAP 浏览器和有限的基于文本的信息以来,这一市场已经得到了长足的发展,然而,移动信息的价值在于:输入 RSS 提要时一眼就可以判断出它是否可用。RSS 是 “Really Simple Syndication” 的缩写。实际上,RSS 是一种分布感兴趣的信息的方便方法。RSS 支持 XML 数据;数据包含完整信息源的简单摘要。如果对这些摘要该兴趣,用户可以进一步获取信息并获得全部内容。本教程将演示在构建 Android RSS 阅读器过程中涉及到的几个主要的 XML 处理步骤。 本教程分为以下小节: • • RSS 基础 Android RSS 阅读器应用程序架构 • • 使用 SAX 获取并解析 XML 数据 使用 Android 呈现 RSS 数据 先决条件 本教程需要结合使用几种技术。需要通过以下步骤获得所有这些工具。 • • 从 /downloads 下载 Eclipse。 要安装 Android Developer Tools(Eclipse 插件),请按照 Android 文档 “安装 Android SDK” 中的说明操作。 • 在 /android 中下载 Android SDK。Android SDK 是一个不断发展的项目。撰写本教程时 SDK 的最新版本为 m5-rc14。 • 选择一个 RSS 提要。本教程使用 developerWorks Web 站点中最受欢迎教程的提要。 • 建立一个活动的 Internet Connection 来运行示例应用程序。 完整的源代码可以从 下载 小节获得。本教程包含的源代码片段包括: • 片段:该文件是 Android 应用程序的应用程序部署描述符。 • RSSReader:该类实现主 GUI 并包含菜单处理代码。 • RSSFeed:该类含有一个经过解析的 RSS 提要,包含 RSS 通道信息和一组 RSSItems。 • RSSHandler:该类实现 SAX 解析器处理程序,从而实现对 XML 流(Internet 中的 RSS 提要)的解析并填充一个 RSSFeed 实例。 • • RSSItem:该类表示解析 XML 流得到的一个 RSS 项。 ShowDescription:这是一种行为(Activity),显示所选的 RSSItem 的摘要并包含可链接的文本,可以无缝启动 Android 浏览器来访问 RSSItem 中的可用链接。启用这一 Activity 将在伪同步调用中结合使用一个 Intent 和额外的 Bundle。 • :该文件表示应用程序使用的 GUI 标识符。 术语 构建一个 Android RSS/XML 应用程序需要 XML、RSS 和 HTTP 方面的知识,还需要了解 Android 平台的各个方面。了解下面的术语对于学习本教程大有裨益。要想了解关于这些主题的更多信息,请参见 参考资料 中的链接。 • Android:Open Handset Alliance 的旗舰产品。这是一个针对手机等移动设备的开源操作环境。 • RSS:Really Simple Syndication 是一种可以通过高效的方式发布信息的数据格式。 • XML:eXtensible Mark-up Language 是一种自描述性的数据格式。 • HTTP:Hyper Text Transport Protocol 几乎专门用来传输所有的 RSS 提要。 • 解析器(Parser):这个工具的作用是从一种格式中提取信息并使信息可用于其他结构。例如,XML 解析器可以从一个 XML 数据源提取数据。 • 模拟器(Emulator):这种软件工具代表另一种系统。Android 目前还不能用于真实的用户硬件平台;本文在 Android Emulator 上运行示例应用程序。 • • RSS 基础介绍 在详细介绍下载 RSS 提要并使用基于 Android 的 RSS 阅读器进行处理之前,让我们首先简要回顾一下使用 RSS 的需求、位置以及它的结构。 • • 为什么使用 RSS? 信息传播工具多种多样,包括可以免费收听的无线电广播、公共和有线电视、印刷媒体,甚至包括 Internet 这样颠覆性的技术,以及其庞大的 Web 站点和电子邮件订阅。虽然选择很多,但是这些工具都存在一个问题:很难在庞杂的海量数据中精确查找到真正感兴趣的信息和价值。幸运的是,RSS 可以帮助我们解决这个问题。 • RSS 是 “Really Simple Syndication” 的缩写。RSS 是一种内容发布者用来发布信息的 XML 数据格式,这些信息经过了分类并适合人机阅读。RSS 提要通常使用诸如新闻阅读器这种人类可读的友好格式进行处理并显示给用户,本教程中构建的应用程序就是这样一种新闻阅读器。RSS 提要同样可以供计算机使用,从而生成后续的、聚合的信息源。举例来说,定期检索并提供给旅行社本地预订系统的租赁列表就是一个机器使用 RSS 提要的例子。 • 在讨论新闻内容时经常会提到 RSS,然而,除新闻以外,这种格式可用于组织和发布其他很多类型的信息。例如,很多 Web 站点都发布可用的 pod-cast 的 RSS 提要,从而发布音频和视频内容。 是一个流行的移动软件和内容的在线商店,它根据移动平台分类,提供新的流行软件标题的提要。例如,提供针对 Windows® Mobile、Blackberry、Palm 和其他平台的提要。用不了多久,很可能就会提供针对 Android 应用程序的提要了! • RSS 的格式是 XML 数据,这表示数据本身就包含描述性元素,也就是说它是自包含的。随着行业的逐步规范化,XML 结构在过去几年也经历了一些变化。最新的版本也是应用最广的版本是 2.0。RSS 2.0 是一种相对简单的 XML 结构,很容易由计算机程序解析。在本教程中,我们将解析从 IBM developerWorks Web 站点获得的一条 RSS 提要。 RSS version 2.0 关于哪一个版本最流行已经进行了太多的讨论,现在让我们了解一下 RSS 2.0 规范。RSS 2.0 格式只包含有限的标记。 是一个强制使用的标记,所有 XML 文档都需要使用到。第一个标记实际是 清单 1. RSS 2.0 中的通道和元素
+
每个通道可能含有一个或多个项。每个项具有如清单 2 所示的结构。
清单 2. 项结构
数据使用
RSS 提要的使用者可以决定如何显示数据。通常,RSS 阅读器将显示一些有关可用通道的标题信息,包括发布日期(包含在
pubDate 元素中)。注意,RSS 是用于发布相关的即时数据,因此不应该忽视发布日期。图 1 演示了本教程中运行的示例应用程序,它显示了一条 RSS 提要。图 1 显示了 RSS 提要的标题、发布日期,并使用列表(List)格式显示提要项。本教程后面的内容讨论将解析得到的 RSS 提要提供给 Android 用户界面的机制。
回页首
图 1. 运行中的 Android RSS 阅读器
RSS 提要的 item 标记中的元素描述提要中包含的所有项。例如,在本教程中,您要处理的 RSS 提要中包含来自 IBM
developerWorks 站点中的一组受欢迎的教程。提要中的每个条目都提供了足够的信息,使用户充分了解提要的主题以及如何获取更多信息。这些信息共分三个级别,每个级别的信息都非常详细。此外,每个条目都包含一个发布日期和类别信息。条目标题简要介绍了提要的主题,例如:
applications with Eclipse]]>
如果您对使用 Eclipse 进行 Android 开发感兴趣的话,那么这个条目标题足够引起您的兴趣。如果用户(即使有应用程序的人员)希望了解更多,则可以获取更多信息,即清单 3 中的描述。
清单 3. 描述
oft-discussed mobile, wireless, computer, and communications platform. You can take advantage of the powerful Eclipse environment to build Android applications using the Android Eclipse plug-in. This tutorial introduces Android application development with the Eclipse plug-in, otherwise known as Android Development Tools. The tutorial provides an introduction to Android development with a quick introduction to the platform, a tour of Android Development Tools, and includes the construction of two example applications. ]]>
注意这里使用了 CDATA XML 技术。如果 XML 提要中包含了可以与所含的 XML 标记进行交互的 mark-up 元素,那么则需要使用
CDATA。CDATA 的一个副作用是数据是按原样获取的,因此您需要对文本进行额外的格式化,以便正确显示到目标用户界面中。本教程后面演示的示例应用程序中将看到这样一个例子。
最后,如果用户对这一主题非常感兴趣的话,可以通过提供的链接找到关于这一特定主题的更多信息:
本教程没有细究对类别的任何特殊处理,这是因为 RSS 提要中的所有类别都是相同的。显示发布日期是一项最佳实践技术。
简要介绍了 RSS 及其用途之后,我们来从较高的层次了解一下
RSS 阅读器应用程序的架构。
Android RSS 阅读器应用程序架构
一份简短扼要的教程很难详尽地描述如何构建一个功能丰富的 RSS
阅读器,因此,我们来看一下 RSS 阅读器需要实现哪些功能。然后逐步完善重要的组件以实现 XML 处理并呈现到 Android 平台。完成这些任务后,您将拥有一个具有基本功能的 RSS 阅读器,并且具有一些功能钩子,可以在将来实现进一步扩展。
RSS 阅读器应用程序的主要需求
以下各小节将详细介绍 Android RSS 阅读器是如何解决 RSS 阅读器应用程序的这些主要需求的。
指定感兴趣的 RSS 提要
不计其数的 Internet 站点都提供 RSS 提要。应用程序需要指定要处理哪些 RSS 提要。一个功能丰富的 RSS 提要可以使用一种或多种方法选择所需的 RSS 提,包括能够从大量站点和通道中进行选择,或者允许用户在一个 EditView 中手动输入感兴趣的提要。为了尽量减少本教程中与非 XML 内容相关的代码,我们对 RSS
提要 URL 进行了硬编码。将菜单实现为一个钩子,以便根据需要添加 RSS 提要选择。
获取感兴趣的 RSS 提要
在对 RSS 提要进行任何解析和数据处理之前,首先需要从
Internet 中获得它。这意味着需要通过一个 Internet 连接(网络或
WiFi)连接到托管 RSS 提要的站点,然后执行一个 HTTP GET 操作检索 RSS 数据。返回的数据并不是文件形式,而是一个 XML
数据流。将使用 URL 类取回数据。
解析 XML 数据流
可以使用多种机制解析 XML 数据。这些机制都需要导航数据流并逐一描述各个数据元素,然后保存这些数据。Android SDK 提供了各种不同的 XML 解析器(Parser) ,但是您也可以选择自行创建。Android SDK 还提供了两种最流行的方法,即 DOM 解析器和
SAX 解析器。DOM 方法非常适合复杂的 XML 文档,因为它会在内存中构建面向节点的 XML 数据表示。SAX 方法在遇到新的标记时将使用回调,因而允许应用程序只保存感兴趣的数据。由于 RSS
版权声明:本文标题:Android基础教程 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1702913552h435759.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论