使用Eclipse开发Android应用程序
使用Eclipse开发Android应用程序
本教程介绍了Eclipse环境中的Android应用程序开发,包括两个示例应用程序的构建。 第一个是基本的入门应用程序,包括构建和调试的所有阶段。 第二个应用程序检查了Android的更复杂功能,包括联系人搜索和Google Maps地址查找。 为了从本教程中获得最大收益,移动开发经验会有所帮助,但不是必需的。 Android应用程序需要Java™编程技能,但本教程不是明确要求。
关于本教程
我们为什么要关心Android? Android是重要的平台,原因有二。 首先,Google推出了它并吸引了很多人关注的Android,这一事实在这么短的时间内就获得了。 Google正在竭尽全力,并试图在拥挤的移动市场中发挥作用。 Android和开放手机联盟(Open Handset Alliance)首次打入这个市场是一个令人印象深刻的起点。 Android之所以重要的第二个原因是,它不仅仅是具有电话,菜单和触摸屏的另一个移动平台。 您将在本教程中学习到,Android对应用程序采用了不同的方法。 Android的体系结构允许其高度可定制的软件环境,这要归功于其对请求的操作的运行时绑定以及满足这些请求的代码。 无论是市场驱动的考虑因素还是Android的技术方面,它都是值得研究的平台。
本教程分为以下几节:
- Android基础知识和所需工具
- Android软件开发人员套件
- 编译和调试SaySomething Android应用程序
- 创建内容提供商和Google Maps应用程序
系统要求
本教程需要一起使用的几种技术。 本教程需要所有这些。
: Eclipse是运行插件的平台。 获取最新版本的Eclipse Classic(本教程中使用的是V3.3.1)。
: 可以按照“安装 的说明来安装Android Developer Tools(Eclipse插件)。
: 本教程中的源代码片段包括:
* AndroidManifest.xml代码段—该文件是Android应用程序的应用程序部署描述符。
* `IntentReceiver`
-这表明一个实施
`IntentReceiver`
,这是类为标榜的过程意图
`IntentFilter`
在AndroidManifest.xml文件中的标记。
* SaySomething.java —这实现了Android活动,是本教程示例应用程序的主要入口点。
* Main.xml-包含供Android活动使用的可视元素或资源。
* R.java —该文件由Android开发人员工具自动生成,并将可视资源“连接”到Java源代码。
* 完整的AndroidManifest.xml-这列出了完整的AndroidManfest.xml文件,以及每个重要元素的描述。
* MobileServiceCallContacts.java —它包含显示联系人以及对用户输入做出React以随后执行Google Maps地址查找所必需的代码。
Android简介
在深入研究Eclipse插件的内容和开发Android应用程序之前,让我们看一下Android的体系结构以及一些对本教程及以后的内容有帮助的关键术语,因为您开始构建Android自己申请。
Android术语
Eclipse环境下的Android应用程序开发需要Eclipse环境和Android平台的知识。 理解以下术语对使用Eclipse插件进行Android应用程序开发很有帮助。
开放手机联盟: 这是由Google Inc.领导的组织,由众多公共和私人组织组成。
安卓系统: 开放手机联盟的旗舰产品。 这是针对移动设备的开源操作环境。
仿真器: 代表另一个系统的软件工具-这通常是在个人计算机(IBM®,Mac,Linux®)上运行的环境,该环境可模拟另一个环境,例如移动计算设备。
的Linux: 开源操作系统内核是许多计算平台的核心,包括服务器,台式计算机,网络设备和移动计算设备。 Android在Linux内核之上运行。
Dalvik虚拟机: Dalvik VM是在Android堆栈中找到的操作环境,可在运行时解释应用程序代码。 Dalvik VM与兼容的Java VM类似,但两者不兼容。
Android基础知识和所需工具
Android是面向移动平台的开源操作系统。 在撰写本文时,它是一个只有软件的平台,没有公开可用的硬件设备。
最好将Android平台描述为一个堆栈,因为它是组件的集合,包括:
- 基于Linux内核的操作系统
- Java编程环境
- 工具链,包括编译器,资源编译器,调试器和仿真器
- Dalvik VM用于运行应用程序
既然我们已经简要介绍了Android平台架构,那么让我们从市场角度来看一下该平台的一些重要特征。
Android为什么如此重要?
自发布和最初发布SDK以来,计算机技术新闻界一直对Android给予极大的关注。 Android作为两个不同但引人注目的理由的平台非常重要。
Android是市场的推动者。 移动应用程序空间很拥挤,很难为新手赢得立足之地。 Google拥有资源和志趣相投的产品,可以在它所看到的任何市场中引起轰动。 谷歌进入移动领域已经有几年了。 Android是Google收购的一家独立而独特的公司,目的是让它在移动设备上起步。 Google所做的任何事情都会引起关注,而宣传对于引入新平台是有好处的。 在Android上得分一。
Android之所以重要的第二个原因是因为其应用程序模型。 Android应用程序不是单块的,菜单加载的应用程序,需要大量的单击和点击操作。 当然,还有一些菜单和按钮需要点击,但是Android对其架构具有创新的设计元素,即意图。
意图
目的是一种允许应用程序发出请求的结构,这有点像帮助标记。 它可能看起来像这样:
“想要的:帮助我查找联系人的应用程序”或“想要的:帮助我显示此图像的应用程序”或“想要的:用于执行基于地理搜索的应用程序”。
以类似和互补的方式,应用程序可以将自己注册为有能力并有兴趣执行满足各种请求或意图的对象。 为了遵循分类广告范例,这些可能看起来像这样:
“可用:应用程序准备好并且愿意以清晰,简洁的方式显示联系人记录,”或“可用:应用程序准备好并且愿意执行地理搜索。”
这些是
IntentFilter
的示例,接下来将进行讨论。
IntentFilter
应用程序通过称为
IntentFilter
的构造宣布它们可以执行这些类型的操作。
IntentFilter
可以在运行时注册,也可以在AndroidManifest.xml文件中枚举。 以下代码段来自一个Android应用程序,该应用程序响应传入的SMS(文本)消息:
清单1.响应传入的SMS的Android应用程序
<receiver class=".MySMSMailBox" >
<intent-filter>
<action android:value="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
在对intent和
IntentFilter
进行了简要介绍之后,下一节将介绍四种主要的Android应用程序类型。
Android应用程序-快速调查
让我们花点时间研究一下Android应用程序的四种主要类型:activity,services,receiver和
ContentProvider
。 我们还将看一下显示用户界面(UI)元素的视图。
活动
该活动是Android应用程序中最明显和最突出的形式。 活动将UI呈现给应用程序,并借助称为view的类。 视图类被实现为各种UI元素,例如文本框,标签,按钮和计算平台(移动或其他方式)中典型的其他UI。
一个应用程序可能包含一个或多个活动。 它们通常与应用程序中的屏幕呈一对一关系。
通过调用称为
startActivity()
或
startSubActivity()
的方法,应用程序可以从一种活动转移到另一种活动。 当应用程序希望简单地“切换”到新活动时,使用前一种方法。 当需要同步呼叫/响应范例时,使用后者。 在两种情况下,都将意图作为参数传递给方法。
确定最符合条件的活动以满足指定意图是操作系统的责任。
服务和接收者
像其他多任务计算环境一样,有些应用程序在“后台”运行并执行各种任务。 Android将这些类型的应用程序称为“服务”。 该服务是一个没有UI的Android应用程序。
接收器是一个应用程序组件,它接收处理意图的请求。 像服务一样,接收者在通常情况下也没有UI元素。 接收器通常在AndroidManifest.xml文件中注册。 清单1中显示的代码段是接收器应用程序的示例。 请注意,接收方的class属性是负责实现接收方的Java类。 清单2是接收器代码的示例。
清单2.接收者代码
package com.msi.samplereceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentReceiver;
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 元素。 视图遵循以下布局设计之一:
垂直: 每个后续元素都在其前身之下在单个列中流动,以跟随其前身。
线性水平: 每个后续元素都通过在前一行中向右流动来跟随其前身。
相对的: 根据与先前元素的偏移量来描述每个后续元素。
表: 一系列类似于 HTML 表的行和列。 每个单元格可以容纳一个视图元素。
一旦选择了特定的布局(或布局的组合),便会使用各个视图来呈现 UI。
视图元素由熟悉的 UI 元素组成,包括:
- 纽扣
- 图像按钮
- 编辑文字
- TextView(类似于标签)
- 复选框
- 单选按钮
- Gallery 和 ImageSwitcher 用于显示多个图像
- 清单
- 格
- 日期选择器
- 时间选择器
- 微调器(类似于组合框)
- 自动完成(具有自动文本完成功能的 EditText)
视图在 XML 文件中定义。 清单 3 显示了一个简单的
LinearVertical
布局的示例。
清单 3.简单的 LinearVertical
布局
<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Activity 1!"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Activity 1, second text view!"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Switch To Activity 2"
id="@+id/switchto2"
/>
</LinearLayout>
请注意,每个元素在 Android 名称空间中都有一个或多个属性。
下一节将逐步获取 Android SDK 并对其进行配置以供 Eclipse 使用。
Android 软件开发人员套件
既然我们对 Android 平台有所了解,那么让我们为 Android 开发设置 Eclipse 环境,以便我们可以创建示例应用程序。 本节将逐步获取 Android SDK 并对其进行配置以供 Eclipse 使用。
获取并安装 Eclipse
如果未安装 Eclipse,请下载它并从 Eclipse Foundation 安装 Eclipse IDE 的最新稳定版本。 安装是一个压缩文件夹。 将文件夹的内容提取到计算机上的方便位置。 安装程序不会在 Windows® 上创建任何图标或快捷方式。 就本教程而言,Eclipse 文件夹将位于 c:\ software \ eclipse 目录中。
要启动 Eclipse,请双击 eclipse 安装目录中的 eclipse.exe。 这将启动 IDE。 该软件会提示您输入“工作区”,并建议一个默认位置,例如 c:\ documents and settings \ username \ workspace。 选择此位置或指定其他工作区位置。
加载 Eclipse 之后,单击“ 工作台”-转到 主屏幕上的 工作台 图标。
现在是时候获取 Android SDK。
获取并安装 Android SDK
有适用于 Windows,Mac OS X(仅英特尔 ®)和 Linux(i386)的 SDK 安装版本。 为所需平台选择最新版本的 SDK。 请注意,在撰写本文时,最新的 Android SDK 版本标记为 m3-rc37a。
Android SDK 是一个压缩文件夹。 下载此文件的内容并将其解压缩到计算机上的方便位置。 就本教程而言,SDK 已安装到 c:\ software \ google \ android_m3-rc37a。 显然,如果要在 Mac OS X 和 Linux 上安装它,则应该在通常放置开发工具的位置安装 SDK。
Eclipse 和 Android SDK 均已安装。 现在是时候安装 Eclipse 插件来利用 Eclipse 环境了。
获取并安装 Eclipse 插件
以下步骤演示了 Eclipse 插件(正式称为 Android Developer Tools)的安装。 请注意,可从 Android 网站获得替代的安装说明。
安装 Android 开发人员工具:
运行 Eclipse 中“ 帮助>软件更新” 菜单下的“查找并安装”功能。
选择“ 搜索要安装的新功能” 选项。
选择“ 新建远程站点” 。 给该站点起一个名字,例如“ Android Developer Tools”。 在对话框中使用以下网址: : 。 请注意 URL 中的 HTTPS。 这是一个安全的下载。
图 1.新的更新站点
新条目将添加到列表中,并且默认情况下处于选中状态。 点击 完成 。 搜索结果显示 Android 开发人员工具。 选择 开发人员工具 ,然后单击 下一步 。
查看并接受许可协议后,单击“ 下一步” 。 请注意,许可协议包括使用 Google Maps API 的特殊要求。
查看并接受安装位置,然后单击“ 完成” 。
现在已下载并安装了该插件。 该插件未签名(在编写本文时),因此请按您自己的喜好水平,单击 Install All ,然后重新启动 Eclipse。
配置 Eclipse 插件
Eclipse 重新启动后,就该将该插件连接到 SDK 安装了。 在窗口菜单下选择 首选项 。 点击左侧树状视图中的 Android 项目。 在右侧窗格中,指定 SDK 安装位置。 本教程使用的值为 c:\ software \ google \ android \ m3-rc37a(同样,请在 Mac OS X 和 Linux 安装中使用适当的位置)。
一旦指定了 SDK 位置,就可以配置其他三个部分。 在此简要提及:
- 生成部分具有用于自动重建资源的选项。 保持选中状态。 生成选项可以更改详细程度。 默认设置为“正常”。
- DDMS — Dalvik 调试监视器服务用于对等到正在运行的 VM。 这些设置指定用于通过调试器连接到运行中的 VM 的 TCP / IP 端口号以及各种日志记录级别和选项。 默认设置应该很好。
- LogCat —这是在基础 Linux 内核上创建的日志文件。 在此对话框中可以选择字体。 根据需要进行调整。
恭喜你! Eclipse 环境已准备好创建 Android 应用程序。
生成 SaySomething Android 应用程序
本节使用 Android 开发人员工具创建一个名为 SaySomething 的基本 Android 应用程序。 创建应用程序后,我们将调试并运行它。
新项目向导
第一步是创建一个新项目。 选择 Android 项目的向导,如下所示。
图 2.新建项目向导
该应用程序的要求是:
- 名称
- 位置
- 包裹名字
- 活动名称-将其视为应用程序的主要“表单”或屏幕
- 应用名称
看一下新项目。
图 3.新的 Android 项目
这将创建一个默认的应用程序,随时可以构建和运行。 这些组件可以在 Package Explorer 中看到,我们将在后面讨论。
包浏览器
Package Explorer(可在 Eclipse 的 Java 透视图中找到)显示示例 Android 应用程序的所有组件(请参见图 4)。
图 4.包浏览器
注意事项包括:
src 文件夹: 包括样本应用程序的软件包,即
com.msi.ibmtutorial
R.java: Android 开发人员工具会自动创建此文件,并代表访问 Android 应用程序各种资源所需的常量。 有关 R 类与资源之间关系的更多信息,请参见下文。
SaySomething.java: 应用程序主要活动类的实现。
引用库: 包含 android.jar,这是在 Android SDK 中找到的 Android 运行时类 jar 文件。
res 资料夹: 包含应用程序的资源,包括:
* 图示
* 布局文件
* 弦乐
AndriodManifest.xml: 示例应用程序的部署描述符。
接下来,我们将更详细地检查源代码。
应用程序的主要活动
该示例应用程序包含一个活动,即
SaySomething
。 如上所述,
SaySomething
类在文件 SaySomething.java 中实现。
清单 4. SaySomething.java
package com.msi.ibmtutorial;
import android.app.Activity;
import android.os.Bundle;
public class SaySomething extends Activity
{
/*_ Called when the activity is first created. _/
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
}
}
关于此源代码片段的注意事项:
SaySomething
是一个普通的 Java 类,具有预期的打包和导入功能。SaySomething
扩展了一个名为 Activity 的基本 Android 类,该类位于 android.app 包中。onCreate()
方法是此活动的入口,它接收类型为Bundle
的参数。Bundle
是一个类,本质上是地图或哈希图的包装。 构造所需的元素在此参数中传递。 本教程不检查此参数。setContentView(..)
负责使用 R.layout.main 参数创建主 UI。 这是代表在应用程序资源中找到的主要布局的标识符。
下一节将回顾示例应用程序的资源。
申请资源
如前所述,Android 中的资源被组织到名为 res 的项目的子目录中。 资源分为三大类:
画图: 此文件夹包含图形文件,例如图标和位图
版面: 此文件夹包含表示应用程序的布局和视图的 XML 文件。 这些将在下面详细讨论。
价值观: 此文件夹包含一个名为 strings.xml 的文件。 这是对应用程序进行字符串本地化的主要方法。
下一节剖析 main.xml 文件,以查看示例应用程序的主要 UI 资源。
main.xml
该示例应用程序包含一个活动和一个视图。 该应用程序包含一个名为 main.xml 的文件,该文件表示活动主 UI 的视觉外观。 请注意,在 main.xml 中没有使用布局的引用。 这意味着,如果需要,它可以用于一种以上的活动。 清单 5 包含布局文件的内容。
清单 5.布局文件
<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, SaySomething"
/>
</LinearLayout>
这是最简单的布局。 有一个线性布局,其定向为垂直布局,这意味着所有包含的元素都在单个列中。 只有一个
TextView
元素,可以将其比作其他开发环境中的标签。
TextView
表示不可编辑的静态文本。
请注意,每个视图元素(在此示例中为
layout
和
TextView
)在 Android 名称空间中都有属性。 有些属性是所有的意见-的
android:layout_width
和
android:layout_heigh
牛逼的属性,例如。 这些属性的可用值为:
填写父母: 这将扩展 view 元素以占用最大可用空间。 这也可以被认为是“伸展”的意思。
包装内容: 此值告诉 Android 在不拉伸的情况下一个接一个地绘制元素。
在构建过程中,将编译所有资源。 该过程的产品之一是 R.java 文件,它代表应用程序其余部分的资源。 接下来讨论 R.java 文件。
R.java
R.java 文件是在构建时自动创建的,因此请确保不要手工修改它,因为所有更改都会丢失。 清单 6 包含示例应用程序的 R.java 文件。
清单 6. R.java 文件
/* 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 com.msi.ibmtutorial;
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
类包含匿名子类,每个匿名子类都包含上述各种资源的标识符。 请注意,所有这些类都是静态的。
请注意由 R.layout.main 表示的元素。 该标识符表示 main.xml 定义的布局。 记得在活动的
onCreate
方法中使用此值,如下所示:
setContentView(R.layout.main);
。 这是在运行时将特定活动(在本例中为
SayAnything
)和特定布局(主要)绑定在一起的地方。
建筑应用
默认情况下,每次保存文件时都会编译文件。
图 5.错误窗格
我们在源代码中引入了错误,在
setContent
和
View
之间添加了额外的空间。 保存文件后,将对其进行编译,并且任何错误都会出现在屏幕底部的“问题”窗格中。 修复源代码中的错误后,应用程序将正确构建,并将错误从问题列表中删除。
AndroidManifest.xml
AndroidManifest.xml 文件表示 Android 应用程序的部署描述符。 该文件列出了应用程序中包含的任何活动,服务,内容提供者或接收者,以及应用程序支持的相应
IntentFilter
。 这是示例应用程序的完整 AndroidManifest.xml 文件:
清单 5. AndroidManifest.xml 文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.msi.ibmtutorial">
<application android:icon="@drawable/icon">
<activity class=".SaySomething" android:label="@string/app_name">
<intent-filter>
<action android:value="android.intent.action.MAIN" />
<category android:value="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
注意事项:
源文件中的程序包名称在此处表示。 这遵循类似于 Java 源文件并导入的模式。
<manifest>
标记本质上是从此程序包“导入”类。 在包属性中标识的包中可以找到此文件中的所有非完全合格的类。<application>
标记具有一个属性,该属性引用了应用程序资源中的资源。 注意可绘制标识符之前的@
符号。 这提示文件在应用程序资源的 drawable 文件夹中查找名为“ icon”的资源。<activity>
标记包含以下属性和 note 值:- 类表示实现此活动的 Java 类
android:label
是应用程序的名称。 请注意,它来自字符串资源之一。 string.xml 文件包含应用程序的本地化字符串。<intent-filter>
表示示例应用程序IntentFilter
可用的IntentFilter
。 这是在 Android 应用程序中最常见的IntentFilter
。 该过滤器实质上表示它实现了“主要”动作(或入口点),位于操作系统的启动器中。 用英语来说,这意味着它可以从 Android 设备上的应用程序主列表中作为应用程序启动。
下一节描述了如何从 Eclipse 中在 Android Emulator 上启动应用程序。
运行应用程序
现在,应用程序已成功编译,是时候运行示例应用程序了。 选择“ 打开运行对话框” 或 Eclipse 中工具栏上的快捷方式。 这将打开一个对话框,在其中创建启动配置。 突出显示“ Android 应用程序”选项,然后单击“ 新建 ”图标。
图 6 显示了用于教程示例的值。
图 6.运行对话框
为配置命名。 本教程样本使用名称 Tutorial Configuration 。 从可用项目列表中选择 ibmtutorial 项目(单击 浏览 以查看可用项目)。 在下拉菜单中选择启动活动。 现在,根据需要选择“ 仿真器” 选项卡以指定仿真器设置。 默认值可以保留。 有两点需要注意,如图 7 所示。
图 7.运行对话框,仿真器选项卡
有几种屏幕尺寸和方向可供选择,以及网络选择。 当构建使用 Internet 连接的应用程序时,网络的选择很重要,因为移动设备具有不同的网络速度功能。 在对应用程序进行原型制作时,请选择全速网络且不延迟。 一旦提供了主要功能,最好在不理想的网络条件下进行测试,以查看应用程序在网络连接欠佳的情况下如何响应。
选择 运行 以查看示例应用程序的 运行 。
图 8.仿真器
现在,该应用程序已在模拟器上运行,是时候查看幕后情况。 Dalvik 调试监视器服务(DDMS)将为此提供帮助。
调试应用程序
要查看正在运行的应用程序正在发生的情况,请使用正在运行的 Dalvik VM。 要从 Eclipse 启用此功能,请选择“ 窗口”>“打开透视图”>“其他” 。 这将显示一个对话框,可以在其中选择 DDMS。 这在 Eclipse 中打开了一个具有许多有趣窗口的新视角。 以下是 DDMS 透视图中的可用资源的快速介绍:
LogCat
是在 VM 中发生的活动的运行日志文件。 应用程序可以使用以下简单的代码行来自己创建该列表的条目:
Log.i(tag,message);
,其中
tag
和
message
都是 Java 字符串。
Log
类是
android.util.Log
包的一部分。
图 9 显示了
LogCat
中的
LogCat
。
图 9. LogCat
中的 LogCat
DDMS 中的另一个便捷工具是文件浏览器,它允许仿真器访问文件系统。 图 10 显示了教程的示例应用程序在 Emulator 上的部署位置。
图 10.在模拟器上部署的示例应用程序
用户应用程序部署在/ data / app 中,而 Android 内置应用程序位于/ system / app 目录中。
DDMS 中也提供了正在运行的进程列表。
图 11.运行过程列表
Android 应用程序的全面调试超出了本教程的范围。
构建内容提供商和 Google Maps 示例
现在您已经看到了完整的应用程序示例,让我们快速看一下更复杂的应用程序。
内容提供商和 Google 地图
本教程中检查的第二个应用程序是以移动服务专业人员(也许是设备维修技术人员)为主题的,他们必须将自己的方式映射到下一个服务呼叫。 该应用程序利用 Android 的内置联系人数据库作为记录存储。 本教程将为您提供从内容提供商访问数据的感觉,并让我们快速了解行动意图,因为我们使用在联系人数据库中找到的地址数据来执行 Google Maps 搜索。 为了使本教程能够在您的 Android 仿真器上正常运行,请确保已记录一个或多个联系人,并确保填充家庭住址字段。 图 12 显示了仿真器,其中包含联系人应用程序中的一些条目。
图 12.在联系人应用程序中具有条目的仿真器
这是第二个应用程序的两个代码段中的第一个。 请注意,此应用程序的主
Activity
类扩展了
ListActivity
。 这是因为我们将在列表中显示信息。
清单 6.第二个应用程序的第一段
public class MobileServiceCallContacts extends ListActivity
{
final String tag = "MSCC";
/*_ Called when the activity is first created. _/
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
// Get a cursor with all people
Cursor c = getContentResolver().query(People.CONTENT_URI, null, null,
null, null);
startManagingCursor(c);
ListAdapter adapter = new SimpleCursorAdapter(this,android.R.
layout.simple_list_item_1,c,new String[] {People.NAME} ,new int[]
{android.R.id.text1});
setListAdapter(adapter);
}
...
}
注意使用游标类查询联系人数据库。 该“结果集”光标通过称为
ListAdapter
的类链接到 UI。 图 13 显示了正在运行的应用程序,其中显示了设备上可用的联系人。 请注意,此显示中没有使用排序顺序。
图 13.实际应用
可以通过点击(单击鼠标),仿真器上的中心按钮或通过按下键盘上的
Enter
键来选择任何一个联系人。 选择此条目后,代码必须执行查找以获取所选联系人的地址。 这是
onListItemClick()
重写方法起作用的地方。 此方法的实现有四个重要参数。 这里最有趣的一个是
dbidentifier
方法。 因为游标绑定到 UI,所以在调用此方法时,它实际上接收到基础数据源的标识符。
dbidentifier
字段可用于向联系人数据库查询所需信息。 它也可以用来简单地使用意图启动联系人应用程序,如清单 7 中注释掉的代码所示。
清单 7.重写 onListItemClick()
方法
@Override
protected void onListItemClick(ListView list,View view,int position,long
dbidentifier)
{
super.onListItemClick(list,view,position,dbidentifier);
try
{
// this commented out code below will launch the Contacts application \
// and "view" the contact Intent myIntent = \
new Intent(android.content.
// Intent.VIEW_ACTION,new ContentURI("content://contacts/people/"
// + dbidentifier)); startSubActivity(myIntent,position);
// let's lookup specifics on this record
ContentURI theContact = \
new ContentURI(android.provider.Contacts.ContactMethods.CONTENT_URI.toURI());
// 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 (!c.first())
{
showAlert("MSCC","No Contact Methods Available!","",true);
return;
}
String address = c.getString(c.getColumnIndex("data"));
address = address.replace("\n","");
address = address.replace(",","");
address = address.replace(" ","+");
Intent geoIntent = new Intent("android.intent.action.VIEW",
new ContentURI\
("geo:0,0?q=" + address));
startActivity(geoIntent);
}
catch (Exception ee)
{
Log.i(tag,ee.getMessage());
}
}
获取地址后,只需执行一些简单的字符串操作即可清理数据,以准备对 Google Maps 进行查询。
geoIntent
是为执行地理搜索而创建的新 Intent,在默认的 Android Emulator 图像中,它是通过调用 Google Maps 来满足的。
第一个应用程序的所有主要元素仍然适用于该应用程序。 从主应用程序屏幕启动一个活动。 当然,有 AndroidManifest.xml 文件标识了我们的新应用程序。 请记住,完整的源代码可在“ 部分中找到。
最后一个信息对第二个示例应用程序很重要。 在 AndroidManifest.xml 文件中,还有一个附加条目授予应用程序读取联系人数据库
<uses-permission id="android.permission.READ_CONTACTS" />
:
<uses-permission id="android.permission.READ_CONTACTS" />
。 没有此明确许可,Linux 内核将阻止应用程序访问联系人数据库。
摘要
本教程介绍了 Android 平台,Android 开发人员工具以及 Eclipse 中 Android 开发的关键要素。 Android 开发人员工具可让您利用丰富的 Eclipse 开发环境来构建和测试 Android 应用程序。 现在,您应该准备创建自己的 Android 应用程序。
翻译自: