使用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是运行插件的平台。 获取最新版本的Eclipse Classic(本教程中使用的是V3.3.1)。
Android开发人员工具
可以按照“安装Android SDK”中的说明来安装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开发人员工具:

  1. 运行Eclipse中“ 帮助>软件更新”菜单下的“查找并安装”功能。
  2. 选择“ 搜索要安装的新功能”选项。
  3. 选择“ 新建远程站点” 。 给该站点起一个名字,例如“ Android Developer Tools”。 在对话框中使用以下网址: https : //dl-ssl.google.com/android/eclipse 。 请注意URL中的HTTPS。 这是一个安全的下载。
    图1.新的更新站点
    新的更新站点
  4. 新条目将添加到列表中,并且默认情况下处于选中状态。 点击完成 。 搜索结果显示Android开发人员工具。 选择开发人员工具 ,然后单击下一步
  5. 查看并接受许可协议后,单击“ 下一步” 。 请注意,许可协议包括使用Google Maps API的特殊要求。
  6. 查看并接受安装位置,然后单击“ 完成”

现在已下载并安装了该插件。 该插件未签名(在编写本文时),因此请按您自己的喜好水平,单击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项目
新的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表示不可编辑的静态文本。

请注意,每个视图元素(在此示例中为layoutTextView )在Android名称空间中都有属性。 有些属性是所有的意见-的android:layout_widthandroid: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.错误窗格
错误窗格

我们在源代码中引入了错误,在setContentView之间添加了额外的空间。 保存文件后,将对其进行编译,并且任何错误都会出现在屏幕底部的“问题”窗格中。 修复源代码中的错误后,应用程序将正确构建,并将错误从问题列表中删除。

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); ,其中tagmessage都是Java字符串。 Log类是android.util.Log包的一部分。

图9显示了LogCat中的LogCat

图9. LogCat中的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应用程序。


翻译自: https://www.ibm.com/developerworks/opensource/tutorials/os-eclipse-android/index.html

参与评论
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值