用 Eclipse 开发 Android 应用程序_第1页
用 Eclipse 开发 Android 应用程序_第2页
用 Eclipse 开发 Android 应用程序_第3页
用 Eclipse 开发 Android 应用程序_第4页
用 Eclipse 开发 Android 应用程序_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在Eclipse环境中进行Android应用程序开发开始之前本教程介绍如何在Eclipse环境中进行Android应用程序开发,包括两个示例应用程序。第一个示例是一个基本的应用程序,涉及构建和调试的所有阶段。第二个应用程序示例涉及比较复杂的Android特性,包括联系人搜索和GoogleMaps地址查找。要想从本教程获得最大收益,具备移动开发经验会有帮助,但不是必需的。开发Android应用程序需要Java™编程技能,但是对于本教程不是必需的。关于本教程我们为什么要关注Android?有两个原因使Android成为重要的平台。首先,Google引入了Android,它在很短时间内就获得了市场的关注。Google正在进军移动市场。它在这个市场上采取的第一个行动就是发布Android和OpenHandsetAlliance,这是一个令人印象深刻的起点。第二,Android不仅仅是另一种包含电话、菜单和触摸屏功能的移动平台。您将在本教程中了解到,Android提供了一种不同的应用程序开发方法。由于可以对请求的操作和代码进行运行时绑定,Android的体系结构支持高度可定制的软件环境。无论是考虑市场因素还是Android的技术方面,它都是一个值得研究的平台。本教程分为以下几节:Android基础知识和必需的工具AndroidSoftwareDeveloperKit构建和调试SaySomethingAndroid应用程序创建内容提供器和GoogleMaps应用程序系统需求本教程需要结合使用几种技术。Eclipse平台Eclipse是一个运行插件的平台。您应该安装EclipseClassic的最新版本(本教程使用V3.3.1)。AndroidDeveloperTools按照安装AndroidSDK中的说明安装AndroidDeveloperTools(Eclipse插件)。源代码本教程中的源代码片段包括:AndroidManifest.xml(片段)一这个文件是Android应用程序的应用程序部署描述符。IntentReceiver—演示IntentReceiver的实现,这个类处理AndroidManifest.xml文件中IntentFilter标记所公布的intent。SaySomething.java—实现一个Android活动,这是本教程的示例应用程序的主要入口点。Main.xml一这个文件包含Android活动所用的视觉元素或资源。R.java一这个文件是由AndroidDeveloperTools自动生成的,它把视觉资源“连接”到Java源代码。AndroidManifest.xml(完整)一这是完整的AndroidManfest.xml文件,包含每个重要元素的描述。MobileServiceCallContacts.java—这个文件包含的代码显示联系人并对用户输入做出反应,执行GoogleMaps地址查找。Android简介在讨论Eclipse插件和开发Android应用程序之前,我们先看看Android的体系结构和一些重要的术语,这会对本教程后面的讨论和您自己构建Android应用程序有帮助。Android术语在Eclipse环境中开发Android应用程序需要了解Eclipse环境和Android平台的知识。了解以下术语会有助于用Eclipse插件开发Android应用程序。OpenHandsetAlliance这是一个由Google公司主导的组织,它由许多公共和私人组织组成。Android这是OpenHandsetAlliance的主打产品。它是一种针对移动设备的开放源码操作环境。模拟器模拟另一个系统的软件工具一这常常是在个人计算机(IBM®、Mac、Linux®)上运行的一个环境,它模拟另一个环境,比如移动计算设备。Linux—种开放源码的操作系统内核,许多计算平台都使用这种操作系统,包括服务器、桌面计算机、网络设备和移动计算设备。Android在Linux内核上运行。DalvikVirtualMachineDalvikVM是Android产品组合中的一种操作环境,它在运行时解释应用程序代码°DalvikVM与JavaVM相似,但是两者不兼容。Android基础知识和必需的工具Android是一种针对移动平台的开放源码操作系统。到编写本教程时,它是一种纯软件的平台,没有可用的硬件设备。Android平台被称为一个产品组合,因为它是一系列组件的集合,包括:基于Linux内核的操作系统Java编程环境工具集,包括编译器、资源编译器、调试器和模拟器用来运行应用程序的DalvikVM简要介绍了Android平台的体系结构之后,我们来从市场的角度看看这个平台的一些重要特性。Android为什么很重要?自从Android和最初的SDK发布以来,计算机技术新闻界一直非常关注Android。Android之所以重要主要有两个原因。Android是Google进军移动市场的主要行动。移动应用程序领域竞争激烈,新的竞争者很难涉足。Google拥有大量资源和强大的品牌实力,有能力涉足任何市场。Google进军移动市场已经好几年了。Android原来属于另一家公司,Google通过收购这家公司大大提高了在移动市场上的竞争力。Google的任何行动都会受到关注,而且引入新平台也很引人注目。Android同时具备这两个因素。第二个原因是Android的应用程序模型与众不同。Android应用程序并不是需要大量单击操作的纯粹的菜单式应用程序。Android应用程序中确实有菜单和按钮,但是Android在体系结构中引入了一种新颖的设计元素entintent是一种构造,应用程序可以通过它发出请求,这就像是发出求助信号。intent可能像下面这样:"Wanted:Anapplicationtohelpmelookupacontact"或"Wanted:Anapplicationtohelpmedisplaythisimage"或"Wanted:Anapplicationtoperformthisgeographic-basedsearch"应用程序可以按照相似或互补的方式进行注册,表明它们有能力或有兴趣执行各种请求或intent。比如:"Available:Applicationreadyandwillingtopresentcontactrecordsinclear,concisemanner"或"Available:Applicationreadyandwillingtoperformageographicsearch"这些是IntentFilter的示例,下面将要讨论。IntentFilter应用程序通过一个称为IntentFilter的构造声明它们能够执行某些类型的操作。IntentFilter可以在运行时进行注册,也可以在AndroidManifest.xml文件中设置。下面的代码片段取自一个对SMS(文本)消息进行响应的Android应用程序:清单1.对SMS进行响应的Android应用程序〈receiverclass二".MySMSMailBox">〈intent-filter><actionandroid:value二"vider.Telephony.SMS_RECEIVED"/></intent-filter>〈/receiver〉复制代码简要介绍intent和IntentFilter之后,下一节介绍Android应用程序的四种主要类型。Android应用程序一概述我们来看看Android应用程序的四种主要类型:活动、服务、接收器和ContentProvider。我们还要看看显示用户界面(UI)元素的视图。活动活动是最常用的Android应用程序形式。活动在一个称为视图的类的帮助下,为应用程序提供UI。视图类实现各种UI元素,比如文本框、标签、按钮和计算平台上常见的其他UI元素。一个应用程序可以包含一个或多个活动。这些活动通常与应用程序中的屏幕形成一对一关系。应用程序通过调用startActivity()或startSubActivity()方法从一个活动转移到另一个活动。如果应用程序只需“切换”到新的活动,就应该使用前一个方法。如果需要异步的调用/响应模式,就使用后一个方法。在这两种情况下,都需要通过方法的参数传递一个intent。由操作系统负责决定哪个活动最适合满足指定的intent。服务和接收器与其他多任务计算环境一样,“在后台”运行着一些应用程序,它们执行各种任务oAndroid把这种应用程序称为“服务”。服务是没有UI的Android应用程序。接收器是一个应用程序组件,它接收请求并处理intent。与服务一样,接收器在一般情况下也没有UI元素。接收器通常在AndroidManifest.xml文件中注册。清单2是接收器代码的示例。注意,接收器的类属性是负责实现这个接收器的Java类。清单2.接收器代码packagecom.msi.samplereceiver;2.importandroid.content.Context;importandroid.content.Intent;importandroid.content.IntentReceiver;6.publicclassmyreceiverextendsIntentReceiverTOC\o"1-5"\h\z{publicvoidonReceiveIntent(ContextargO,Intentargl){//dosomethingwhenthismethodisinvoked.}}复制代码用ContentProvider进行数据管理

ContentProvider是Android的数据存储抽象机制。我们以移动设备上常见的一种数据为例:地址簿或联系人数据库。地址簿包含所有联系人及其电话号码,用户在使用手机时可能需要使用这些数据。ContentProvider对数据存储的访问方法进行抽象。ContentProvider在许多方面起到数据库服务器的作用。对数据存储中数据的读写操作应该通过适当的ContentProvider传递,而不是直接访问文件或数据库。可能还有ContentProvider的“客户机”和“实现”。下一节介绍Android视图,这是Android在移动设备屏幕上显示UI元素的机制。视图Android活动通过视图显示UI元素。视图采用以下布局设计之一:LinearVertical后续的每个元素都排在前一个元素下面,形成一个单一列。LinearHorizontal后续的每个元素都排在前一个元素右边,形成一个单一行。Relative后续的每个元素相对于前一个元素有一定的偏移量。Table与HTML表相似的一系列行和列。每个单元格可以包含一个视图元素。选择一种布局(或布局的组合)之后,就可以用各个视图显示UI。视图元素由大家熟悉的UI元素组成,包括:ButtonImageButtonEditTextTextView(与标签相似)CheckBoxRadioButtonGallery和ImageSwitcher(用来显示多个图像)ListGridDatePickerTimePickerSpinner(与组合框相似)AutoComplete(具有文本自动补全特性的EditText)视图是在一个XML文件中定义的。清单3给出一个简单的LinearVertical布局示例。清单3.简单的LinearVertical布局<?xmlversion二"1.0"encoding="utf-8"?〉〈LinearLayoutxmlns:android="/apk/res/android".android:orientation二"vertical"android:layout_width="fill_parent"android:layout_height二.7.&7.&9.android:layout_width="fill_parent"android:layout_height二"wrap_contentandroid:text二"Activity1!"/><TextViewandroid:layout_width="fill_parent"android:layout_height二"wrap_content"android:text二"Activity1,secondtextview!/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text二"SwitchToActivity2"id="@+id/switchto2"/>〈/LinearLayout〉复制代码注意,每个元素有一个或多个属于Android名称空间的属性。下一节讨论如何获取AndroidSDK并在Eclipse环境中配置它。AndroidSoftwareDeveloperKit我们已经大致了解了Android平台,现在讨论如何设置Eclipse环境来支持Android应用程序开发。本节讨论如何获取AndroidSDK并在Eclipse环境中配置它。获取和安装Eclipse如果您还没有安装Eclipse,那么从EclipseFoundation下载并安装EclipseIDE最新的稳定版(参见参考资料)。安装包是一个压缩的文件夹。把这个文件夹的内容解压到您计算机上的适当位置。安装程序并不在Windows®上创建任何图标或快捷方式。对于本教程,Eclipse文件夹位于c:\software\eclipse目录。双击eclipse安装目录中的eclipse.exe启动Eclipse。这会启动IDE。软件提示您指定一个“工作空间”并建议一个默认位置,比如c:\documentsandsettings\username\workspace。选择这个位置或者指定另一个工作空间位置。启动Eclipse之后,单击主屏幕上的Workbench-Gototheworkbench图标。现在该获取AndroidSDK了。获取和安装AndroidSDK在参考资料中找到Android的下载链接。

有针对Windows、MacOSX(只有Intel®版)和Linux(i386)的SDK安装版。选择适合您平台的最新的SDK版本。注意,到编写本教程时,最新的AndroidSDK版本是m3-rc37a。AndroidSDK是一个压缩的文件夹。下载这个文件夹并把它的内容解压到您计算机上的适当位置。对于本教程,SDK安装在c:\software\google\android_m3-rc37a。显然,如果要在MacOSX和Linux上安装SDK,应该安装在通常安装开发工具的位置。Eclipse和AndroidSDK都已经安装好了。现在应该安装Eclipse插件。获取并安装Eclipse插件下面介绍安装Eclipse插件AndroidDeveloperTools的步骤。注意,Android网站上也提供了安装说明。更多信息请参见参考资料。按照以下步骤安装AndroidDeveloperTools:在Eclipse中运行“FindandInstall”特性(在Help>SoftwareUpdates菜单下面)。选择Searchfornewfeaturestoinstall选项。选择NewRemoteSite。给站点命名,比如“AndroidDeveloperTools”。在对话框中输入以下URL:/android/eclipse。注意,这个URL使用HTTPS协议。这是一个安全的下载。图1.NewUpdateSite列表中会增加一个新条目并被默认选中。单击Finish。搜索结果会显示AndroidDeveloperTools。选择DeveloperTools并单击Next。阅读并接受许可协议之后,单击Next。注意,许可协议中对于使用GoogleMapsAPI有一个特殊的要求。检查并接受安装位置,然后单击Finish。现在下载并安装这个插件。这个插件没有经过数字签名(到编写本教程时),所以只需单击InstallAll,然后重新启动Eclipse。配置Eclipse插件重新启动Eclipse之后,应该把这个插件连接到SDK的安装位置。在Window菜单中选择Preferences。单击左边树视图中的Android。在右边的面板中,指定SDK的安装位置。本教程使用的安装位置是c:\software\google\android\m3-rc37a(同样,在MacOSX和Linux系统上也应该使用适当的位置)。指定SDK安装位置之后,可以配置另外三部分设置。下面简要介绍一下:Build部分中的选项用来自动地重新构建资源。保持这个选项的设置不变oBuild选项可以改变输出的详细程度。Normal是默认设置。DDMS一DalvikDebugMonitorService用来监视正在运行的VM。这些设置指定调试器用来连接VM的TCP/IP端口号、各个日志记录级别和选项。默认设置应该是合适的。LogCat一这是在底层Linux系统上创建的一个日志文件。可以在这个对话框中选择字体。根据需要调整这个选项。好了!Eclipse环境已经设置好了,可以开始创建Android应用程序了。构建SaySomethingAndroid应用程序本节要使用AndroidDeveloperTools创建一个基本的Android应用程序,它称为SaySomething。创建这个应用程序之后,将调试和运行它。Newproject向导第一步是创建一个新项目。选择用来创建Android项目的向导,如下所示。

图2.Newproject向导这个应用程序需要:NameLocationPackagenameActivityname—可以认为这是应用程序的主“表单”或屏幕Applicationname看看这个新项目。

图3.新的Android项目这会创建一个默认的应用程序,可以构建和运行它。可以在PackageExplorer中查看它的组件。PackageExplorerPackageExplorer(在Eclipse的Java透视图中)显示Android示例应用程序的所有组件,见图4。

图4.PackageExplorer需要注意的组件包括:src文件夹包含示例应用程序的包,即com.msi.ibmtutorial。R.javaAndroidDeveloperTools自动创建这个文件,它提供访问Android应用程序的各种资源所需的常量。后面会详细讨论R类与资源之间的关系。SaySomething.java应用程序的主活动类的实现。Referencedlibraries包含android.jar,这是AndroidSDK中的Android运行时类的jar文件。res文件夹包含应用程序的资源,包括:•图标布局文件字符串AndriodManifest.xml示例应用程序的部署描述符。接下来,详细研究一下源代码。

应用程序的主活动这个示例应用程序由一个活动组成,即SaySomething。正如前面提到的,SaySomething类是在SaySomething.java文件中实现的。清单4.SaySomething.javapackagecom.msi.ibmtutorial;2.importandroid.app.Activity;importandroid.os.Bundle;5.publicclassSaySomethingextendsActivityTOC\o"1-5"\h\z{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(Bundleicicle){super.onCreate(icicle);setContentView(R.layout.main);}}复制代码在这个源代码片段中,要注意几点:SaySomething是一个普通的Java类,包含包和导入语句。SaySomething扩展android.app包中的Android基类Activity。onCreate()方法是这个活动的入口点,它接受一个Bundle类型的参数0Bundle类本质上是map或hashmap的包装器。在这个参数中传递构造活动所需的元素。本教程不讨论这个参数。setContentView(..)负责用R.layout.main参数创建主UI°R.layout.main是应用程序资源中主布局的标识符。下一节讨论示例应用程序的资源。应用程序的资源正如前面提到的,Android中的资源放在项目的res子目录中。资源分为三类

Drawables这个文件夹包含图形文件,比如图标和位图。Layouts这个文件夹包含表示应用程序布局和视图的XML文件。后面会详细研究这些文件。Values这个文件夹包含strings.xml文件。这是为应用程序实现字符串本地化的主要方法。下一节研究main.xml文件,了解示例应用程序的UI资源。main.xml这个示例应用程序包含一个活动和一个视图。应用程序包含一个名为main.xml的文件,它代表活动的主UI的视觉方面。注意,在main.xml中没有指定在哪里使用这个布局。这意味着,如果需要的话,可以在多个活动中使用它。清单5给出布局文件的内容。清单5.布局文件<?xmlversion二"1.0"encoding二"utf-8"?〉〈LinearLayoutxmlns:android="/apk/res/android"android:orientation二"vertical"android:layout_width="fill_parent"android:layout_height二"fill_parent">〈TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text二"HelloWorld,SaySomething"/>〈/LinearLayout〉复制代码这是最简单的布局,其中只有一个垂直的线性布局,这意味着所有元素排成一列。这里有一个TextView元素,它与其他开发环境中的标签类似。TextView代表不可编辑的静态文本注意,每个视图元素(比如这个示例中的LinearLayout和TextView)都有属于Android名称空间的属性。一些属性是所有视图元素都有的,比如android:layout_width和android:layout_height。这些属性可以采用的值是:fill_parent使视图元素占满可用的空间。也可以认为这就是“拉伸”。wrap_content这个值让Android把元素一个接一个地排列,不进行拉伸。在构建期间,对所有资源进行编译。编译过程的输出之一是R.java文件,这个文件向应用程序的其余部分提供资源。下面讨论R.java文件。

R.javaR.java文件是在构建时自动创建的,所以不要手工修改它,因为所有修改都会丢失。清单6给出这个示例应用程序的R.java文件。清单6.R.java文件/*AUTO-GENERATEDFILE.DONOTMODIFY.**Thisclasswasautomaticallygeneratedbythe*aapttoolfromtheresourcedataitfound.It*shouldnotbemodifiedbyhand.*/7.packagecom.msi.ibmtutorial;9.publicfinalclassR{public static final class attr{TOC\o"1-5"\h\z}public static final class drawable {publicstaticfinalinticon=0x7f020000;}public static final class layout {publicstaticfinalintmain=0x7f030000;}public staticfinalclassstring{publicstaticfinalintapp_name=0x7f040000;}}复制代码R类包含一些匿名子类,每个子类包含前面描述的各种资源的标识符。注意,这些类都是静态的。请注意R.layout.main代表的元素。这个标识符代表由main.xml定义的布局。在活动的onCreate方法中使用过这个值:setContentView(R.layout.main);。这就是在运行时把特定的活动(在这个示例中是SayAnything)和特定的布局(主布局)联系在一起的方法。构建应用程序在默认情况下,每次保存文件时,都将对它们进行编译。世rw.jcjrf至]SaySomrfhng.^vqS圜世rw.jcjrfpofkzgrcd^.nis1・ibmmt口uiciJUhini|jDrlarLdrolil.app.Ate.Lvie.yjnpu^iiLCcla^sS&ySoiirethingextrntl^Accivlcve/**CalXe*^wh&Htheai亡c.1vieyisfitbetre&teda*/SOvijccidcpulkllDvoidonCreate(B1eicicleJ(■Ptobter^f'翼问兀&K<ar如2白・山务dWib-rir^ja卅3Pith^iyScrfnethi...无戚注匕讷恤亡忙疋譚trsifixti… “iiSayScmrthi.B・iHnfcutor^/^rc/tcsT^msV'trn.r,ine11日生Errors(2jtems)OSebCtjntfirJtc^hotbfrFesaivtdtd占gp白G5^nt«xerrorontcfcefi"Ybcw^-a:却cctcdafterthetohm我们在源代码中引入了一个错误,即在setContent和View之间加了一个空格。在保存这个文件时,它被编译并在屏幕底部的Problems面板中显示错误。在源代码中纠正这个错误之后,应用程序就能够成功编译,并从问题列表中删除错误。AndroidManifest.xmlAndroidManifest.xml文件是Android应用程序的部署描述符。这个文件列出应用程序中包含的所有活动、服务、内容提供器和接收器,以及应用程序支持的IntentFilter。下面是这个示例应用程序的完整的AndroidManifest.xml文件。清单7.AndroidManifest.xml文件<?xmlversion二"1.0"encoding二"utf-8"?〉〈manifestxmlns:android="/apk/res/android"package二"com.msi.ibmtutorial"〉〈applicationandroid:icon="@drawable/icon"><activityclass二".SaySomething"android:label="@string/app_name"〉〈intent-filter><actionandroid:value="ent.action.MAIN"/>〈categoryandroid:value="ent.category.LAUNCHER"/></intent-filter></activity〉〈/application></manifest>复制代码请注意以下情况:这里指定了源文件中的包名。这里采用与Java源文件和导入语句相似的模式。<manifest>标记的实际作用是“导入”这个包中的类。在这个文件中,所有非完全限定的类都属于package属性指定的包。〈application>标记的一个属性引用了应用程序的一个资源。请注意drawable标识符前面的@符号。这里的意思是,在应用程序资源的drawable文件夹中寻找名为“icon”的资源。<activity>标记包含以下属性和值:class属性表示实现这个活动的Java类。android:label是应用程序的名称。注意,它来自一个字符串资源。string.xml文件包含应用程序的本地化字符串。<intent-filter>表示应用程序中可用的IntentFilter。这是Android应用程序中最常见的IntentFilter。这个过滤器的实际意思是,它实现“主”操作(也就是入口点),而且它位于OS的启动器中。这意味着可以在Android设备上像启动其他应用程序一样,从应用程序主列表中启动它。下一节讨论如何在Eclipse中的Android模拟器上启动应用程序。运行应用程序应用程序已经成功地编译了,现在该运行这个示例应用程序了。在Eclipse中选择OpenRunDialog或工具栏上的快捷按钮。这会打开一个对话框,可以在这里创建启动配置。选择AndroidApplication选项并单击New的图标。图6显示本教程示例所用的值。

图6.Run对话框指定配置名称。本教程使用的名称是TutorialConfiguration。在可用项目列表中选择ibmtutorial项目(单击Browse可以看到可用项目)。在下拉列表中选择启动活动。现在选择Emulator选项卡,根据需要指定模拟器设置。可以保持默认设置。有两个设置需要注意,见图7。

图7.Run对话框,Emulator选项卡有几种可供选择的屏幕大小和方向,还有网络选择。如果运行应用程序的移动设备的因特网连接速度不同,网络选择就很重要了。在构造应用程序原型时,选择完整网络速度而且没有延迟。开发了主要功能之后,最好在比较真实的网络环境中进行测试,看看应用程序的响应速度如何。选择Run运行示例应用程序。

图8.模拟器应用程序已经在模拟器上运行了,现在看看幕后发生的情况°DalvikDebugMonitorService(DDMS)将会帮助检查应用程序的运行情况。调试应用程序要想检查正在运行的应用程序中发生了什么情况,就需要查看正在运行的DalvikVM。在Eclipse中,选择Window>OpenPerspective>Other。在出现的对话框中选择DDMS。这会在Eclipse中打开一个新的透视图,其中有许多有趣的窗口。下面简要介绍一下DDMS透视图中提供的资源:LogCat是一个日志文件,它记录VM中发生的活动。应用程序可以通过Log.i(tag,message);在这个日志文件中添加自己的日志项,其中的tag和message都是Java字符串。Log类属于android.util.Log包。图9显示LogCat。

图9.LogCatL09TiffiHpidtagKsssage01-1114-44D71;Andro...>>>>>>>>>>>>>>AndzoidRuntineSTA01-1114.44D712jd^PJDCTP1 0^part8QGS01-1114:44_D712Jtndro... registeTitijnativefutiDtions 01-1114:44D712Andre—Shut11ngdownVKDl-1114.-14C:712dalvikvsDas:trayJavaVKvaiEingforftsn-dae01-1114:44D720Andro...A^drcidEuntiise5TA..01-1114:44D7S&jdvpJDWP1istenia,ngonport8005-01-1114.44…D720Andra... regLsteritignativefutictions—01-1114:44…D720Andro...ShuttingdovnVKDDMS中的另一个方便的工具是文件管理器,可以用它访问模拟器的文件系统。图10显示在模拟器上部署本教程示例应用程序的位置。图10.在模拟器上部署的示例应用程序Tire InfoetfrdatA2057^242Il7:3&diff-AWK^-X&w2O07-1Z-L217:I6dpwWwS—SCl ——3->3-t?■扌冒:u_°Hrtdcr曲砂L21592ODM1-L5L4:29-rw-ivr-iw-corn-.-msL^T^^:±®LUkaknCMifediwsTWxrwx曲2008^1-Li0E;34dnwwx—x宙'凸d<MMhb^d2008-Hl-LIOS測diw>fwxrwx&dim200a-ClL-Lii05:駅dmwrwGTwx20迹小"05:3idm.ajwxrwxtjtfIcsHfoufrf2008-411-11L4:2?rdiw-rw-fw-出-iwc2007-12-L2旳孕drwijwcrwxs«_'■■2ma-<jL-LIQ5:3SdraMTWcriMXtimejnone200S-01-LB覺:羽-rw-iMfrw-可£:■sysEo2COM2-L217:JSdn¥sr-xr-xaL-'"iPPawMtiz(7:34divw-w-x<1廊即悴r.apkan?-j?-L£■fw-f^-r—tpm平*…GCprt^ctSflpl:«W?6MMMS17:15-TW-ff-f™Cipm.^QQ^t.■■CiUonMrt六口vWcf■砂KsiaOTM2-L2IMScom.gciQ^e...2WM?42P:3S卅”『“ccmflwgte...<iFAmIl酹K0M?42I?:I5叶w-F・・寸©»**峠*妙MM2-12[MS□&»gfeftpp5Prcvdtrg:品200?-]L?:]&灯HWTW.JpkWS32t»7-]?4ZL7:15■rw-r-r--twi-Twate,"CiimPr&Vfcfer.ipt:L百册曲ORLN17:・rw-F-f-com-go^..sCMaps如:1716132tM?-12>L217:]«・COm-QQOdte.口MtftfePrffpwJw.apk2Q3G72007-1J42L7:J50Pbwe.epk*2«0Q2W74J42L7:16屮阳ar”(om-oooah..-.a5tttifflsPwrt>T.碱LI3K2007-3242117:1*5怦知zc^-gc&afe-<-.灯Teiepbw桦如dee却kZI27I2W7-12-LZL7:35彳屮fccmjijQogte...<1瀚ppSetYk匕疑.19E3ie2007-12-1217:16comygoo^-.□硏^WpSeflriW邮k6«1S2007-1Z42L7:36-fw-f-r-cwniXMtfs...a&E>n2007-12-L2li7;Hdrt^^-Mr-Kbulhl.prep3172OO7-1Z-L2L7:3Od-w-t-r-卫±L**■.4i>LC1p*4-a-用户应用程序部署在/data/app目录中,而Android内置的应用程序部署在/system/app目录中。在DDMS中还可以查看正在运行的进程。

图11.正在运行的进程列表全面讨论Android应用程序的调试超出了本教程的范围,更多信息请参见参考资料。创建内容提供器和GoogleMaps应用程序您已经看到了一个完整的应用程序示例,现在简要讨论一下更加复杂的应用程序。内容提供器和GoogleMaps本教程中讨论的第二个应用程序适用于提供上门服务的专业人员,比如设备维修技术人员这些人必须找到去客户地址的路线。这个应用程序使用Android内置的联系人数据库作为记录存储库。本节将讲解如何访问内容提供器中的数据,还将看看intent的效果。我们将用联系人数据库中的地址数据执行GoogleMaps搜索。为了让这个应用程序在Android模拟器上正确运行,必须记录一些联系人,而且必须填写家庭地址字段。图12显示模拟器中与联系人应用程序相关的条目。

图12.模拟器中与联系人应用程序相关的条目下面是这个应用程序的一个代码片段。注意,这个应用程序的主Activity类扩展ListActivity。这是因为我们需要在列表中显示信息。清单8.第一个代码片段publicclassMobileServiceCallContactsextendsListActivity{finalStringtag=""MSCC";

.&1.22.23./**Calledwhentheactivityisfirstcreated.*/@0verridepublicvoidonCreate(Bundleicicle){super.onCreate(icicle);setContentView(R.layout.main);//GetacursorwithallpeopleCursorc=getContentResolver().query(People.CONTENT_URI,null,null,null,null);startManagingCursor(c);ListAdapteradapter=newSimpleCursorAdapter(this,android.R.layout.simple_list_item_1,c,newString[]{People.NAME},newint[]{android.R.id.text1});setListAdapter(adapter);}}复制代码注意,这里使用游标类查询联系人数据库。这个“结果集”游标通过ListAdapter类链接到UI。图13显示当设备上记录了联系人时应用程序的效果。注意,这个屏幕上的记录没有排序。

图13.应用程序的运行效果可以通过鼠标单击、按模拟器的中间按钮或按键盘上的Enter键选择一个联系人。选择联系人之后,代码必须查询所选联系人的地址。这要使用覆盖的onListItemClick()方法。这个方法的实现有四个重要参数,其中最重要的是dbidentifier。因为游标绑定到UI,所以在调用这个方法时,它实际上会获得底层数据源的标识符。可以使用dbidentifier字段在联系人数据库中查询所需的信息。还可以使用它启动联系人应用程序,所用的intent见清单9中被注释掉的代码。清单9.覆盖的onListItemClick()方法@OverrideprotectedvoidonListitemClick(ListViewlist,Viewview,intposition,longdbidentifier){super.onLis

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论