admin管理员组

文章数量:1572325

2024年6月2日发(作者:)

andbook-Android编程

Android编程

由提供

1

Android编程

附带教程来自-Community

(本文仅供学习交流)原文版权属于

/

NicolasGramlich撰写

张劲锋译

在检查最新版本

由提供

2

Download at

andbook-Android编程

目录

序言/如何阅读本文………………………5

介绍………………………………………6

什么是Android--一款GPhone?………7

俯瞰Android…………………………………………8

开放性………………………………………………………………………8

所有应用程序都是平等地创建…………………………………………9

打破应用程序局限………………………………………………………9

快速&简单的应用程序开发…………………………………………9

第一周………………………………………………

(Java)==false………………………………

12

13

与普通Java虚拟机的差异……………………………………………13

AndroidCodeChallenge………………14

创建Android应用程序…………………15

剖析一个Android应用程序………………………15

Activity…………………………………………………………………15

IntentReceiver…………………………………………………………17

Service…………………………………………………………………17

ContentProvider………………………………………………………18

Android用户界面…………………………………19

屏幕元素层次…………………………………………………………19

AndroidUI元素与SwingUI元素比较………………………………22

文件………………23

一般的………………………………………………24

………………………………………………………………

………………………………………………………

……………………………………………………………

………………………………………………………

……………………………………………………………

由提供

25

25

25

25

25

3

……………………………………………………………

………………………………………………………………

………………………………………………………………

………………………………………………………………

27

27

27

28

资源和魔幻的文件………………29

资源…………………………………………………29

资源列表………………………………………………………………29

在代码中使用资源……………………………………………………30

参考资源………………………………………………………………31

可选资源和局部化…………………………………32

魔幻的………………………………………33

HelloWorld--Andoird方式……………34

安装AndroidSDK…………………………………35

Android开发工具(ADT)……………………………………………35

安装完毕,我们来写点代码…………………………37

创建一个新Android项目……………………………………………37

运行你第一个应用程序………………………………………………37

UI--Java方式………………………………………45

n(……)?…………………………46

LogCat…………………………………………………………………46

使用Intent………………………………49

启动(子)Activity………………………………………49

在Java代码中找到XML定义的View………………………………52

为View处理点击………………………………………………………53

从子Activity返回数值…………………………………………………56

给(子)Activity传递数据……………………………46

重要的Layout和ViewGroup…………60

RelativeLayout………………………………………60

由提供

4

Download at

andbook-Android编程

参考书目…………………………………61

缺失章节…………………………………62

社区……………………………………………………62

由提供

5

序言

/

如何阅读本文

本文为以前已经使用Java编程并想开始为Android平台开发

的开发者编写。我试着尽可能地多的"展开",在合适的每个地

方放上示例代码。我也试着尽可能多的插入很多图片,因为

它们可以活跃学习过程和吸引读者眼球。

但不庆幸的,不是每样都编上代码;你不得不学习一些

Android平台基础原理来完全理解它。那就是在第一页中描

述的。没有必要通读所有的那些描述页,但那样较好些。你

可以把它当成一种参考。当在"展开"-过程期间你应该读也被

说明了。因此你可以直接从HelloWorld--Android方式开始。

所有你在本文(所有工作空间)中看到的代码可以在以下站点

获得:

/sources

阅读愉快!!

由提供

6

Download at

andbook-Android编程

介绍

2007年11月12日,开放手机联盟(OpenHandsetAlliance

1

)

发布GoogleAndroidSDK,一周前已经宣布。冲击力是难以置

信的,几乎每个IT/编程相关的报纸放出关于AndroidSDK

发布的消息--在这一两天内,Google组织就以超过2000消息

而镇压群雄。

Android平台的思想是并且一直是一个震惊和一门每天都吸

引越来越多的开发者的课程。尤其是基于Inten和甚至可以

替换主页面应用程序开源的架构,该架构正真给予整个平台

很大数量的灵活性。

"Android——无限想象"

网站--管理员

由提供

7

什么是

Android---

一款

GPhone?

在Google发布AndroidSDK之前的几周和几月就有关于一个叫GPhone的许多

传言。它被说成是一种由Google生产并通过向该设备用户展示敏感-背景广告方

式提供免费通信的移动设备。

图1可能的GPhone三维图

但是到2007年11月5日AndyRubin

2

宣布:

"Anroid平台----更有深意和野心,而不是一个单纯的手机."

开放手机联盟成员Google为移动设备发布一套完整的软件:一个操作系统、中

间件和核心移动应用。一周前发布的不是一个最终产品,而是一个很多地方都

没实现的"预览SDK"。那些主要的新闻站点抓取一些说Android平台满是漏洞

并严重丢失文档的开发者的不适。但主要是说Android在该领域上比任何一个

别的软件小。

2AndyRubin--Google移动平台主管

由提供

8

Download at

andbook-Android编程

俯瞰Android

让我们开一下OHA在他的Android平台上强调的:

开放性

"Android从底层被构建,使开发者可以创造引人注意的手机应用程序充分利用

所有的付费手机,它被建构成正真的开放。例如,一个应用程序可以调用任何一

个手机的核心功能,例如打电话、发送短信或是使用照相机,它允许开发者为

用户创建丰富并身临其境的体验。"

这是真的,作为一个开发者你可以做每样事情,从发送短信只需2行代码,甚

至替换你手机的主屏幕。你可以几周内容易地创建完整定制的操作系统,不再

提供预置的Google应用程序给用户。

"Android基于开源的Linux内核构建。此外,它利用一个定制的虚拟机,这个

虚拟机专门设计来使在手机环境中的内存和硬件资源更完善。Android会是开源

的;它可以不受限制地扩展来融合新的技术(可移植的、可嵌入的,当这些技

术出现时)。这个平台将会继续促进开发者社区协同工作来创建创新的手机应用

程序。"

这里Google谈到了一个名叫Dalvik的虚拟机(DalvikVM),它是一个基于寄存

器的虚拟机,由DanBornstein和其他Google工程师设计编写,是Android平

台的一个重要部分。在"基于寄存器"处,我们发现了第一个和普通Java虚拟机

(基于堆栈)的不同点。参看"(Java)==false"章节来获取更多关于这

个讨论的细节。

由提供

9

所有应用程序都是平等地创建

打破应用程序局限

"Android打破创建新的、创新的应用程序的局限。例如:开发者可以让个人手机

上的数据和网站上的数据连接--如用户的联系人、日历、地理位置--提供了一个

更有意义的用户体验。开发者可以创建一个应用程序,这个程序可以使用户看到

他们朋友位置和改变后位置,当他们在附近时可以有机会和他们联系。"

快速&简单的应用程序开发

"Android提供了宽范围的有用类库和工具,用这些可以创建丰富的应用程序,

例如Android使开发者可以获得设备的地理位置,并允许设备通过同类对同类的

方式的社交程序和其他设备通信。另外,Android包括一套完整的工具,这些工

具提供开发者高度的生产力和深度探究他们的应用程序。"

由提供

10

Download at

andbook-Android编程

自从Web2.0改革,这让内容丰富的应用程序顷刻间不再是幻想。Android带来

了未知的开发速度。让我举个例子:

一天,我在Android文档中的"DrivingDirections"这个时髦词汇处困惑。

构思完成

图2Google驾驶导航仪在Android上完成

上图中这个程序的开发过程花了一个半小时!!(包括简单的用户界面和所有你看

到的图像).你能否在其他手机平台上创建一个如此家喻户晓的经典程序?--不。

由提供

11

额外,用几行代码这个程序就能够使用当前流行的GPS-定位来丰富。

Google强调Android支持基础定位服务的能力。Android中的GoogleMap如

此整洁,就好像是专为Android开发的一样。通过添加3行Android默认应用

的Java代码和3行XML代码,你就可以综合一个完整的放大和拖拽地图的能

力。

在Android中别的易用的好的特性是动画和媒体回放。从m5版本,AndroidSDK

就包含了连续和背面的GeoCoding和mp3添入,支持:ogg-Vorbis,MIDI和

一些其他格式的回放。

由提供

12

Download at

andbook-Android编程

第一周

不走运,开发者不得不处理一个不完整实现的预览SDK(初始发布:"m3-rc20"),

里面甚至一些SDK关键部分被证实是不完整的。文档缺失导致Google开发组

中出现一个Android开发者组织。迟早,你不得不重视来自Google的声明:

"如果它没有被证实,就不意味着他可用"

许多开发者不了解第一个发布的SDK是预览或是开发者预览这个事实,改变了

的API要得等到。

其他让人厌的漏洞是模拟器声音突变,这个漏洞说是在四周后"m3-r37a"发布中

解决,但还是在一些m5安装中出现了。

由提供

13

(Java)==false

为什么叫"Dalvik"?--Dalvik虚拟机由Bornstein命名,在Eyjafjörður(冰岛)

渔村后面的Dalvík,他祖先曾住的地方。

正如你可能听说的一样,Dalvik是Android虚拟机的名称。它是一个执行

Dalvik可执行格式(*.dex)文件的只直译程序虚拟机,这种.dex格式使高效存储和

内存映射执行更完善。Dalvik虚拟机基于寄存器,并能运行被java编译器编译

过的class,这个class已经被包含的"dx"工具转换成Dalvik自己的格式了。这

个虚拟机运行在Linux2.6内核上,虚拟机依靠它来获得底层服务(例如线程管理

和底级内存管理)。Dalvik虚拟机也被优化在多个实例中以很低的内存空间运行。

各自的虚拟机保护它的应用程序不被其他破坏程序阻碍。

与普通Java虚拟机的差异

现在,几乎在任何一个桌面计算机上都可以找到的Java虚拟机是基于堆栈的虚

拟机(VM)。另一方面,DalvikVM是基于寄存器,由于手机处理器为基于寄存

器执行而被优化。基于寄存器的VM在程序代价上也允许更快速的执行时间,

哪些程序在编译后会更大。

由提供

14

Download at

andbook-Android编程

Android

代码挑战竞赛

AndroidCodeChallenge(ADC)是Google为了鼓励社区为Android平台创建超酷

的应用程序的一个策略,通过奖励提交的前50名最有前途的应用程序方式进行

挑战竞赛。

图3Android开发者挑战竞赛Logo

当然,Android开发者挑战竞赛--有总共100,000,000美金作为奖励金额,吸引了

更多的软件开发者来创建一系列的正真有用的应用程序。另一边,在SDK发布

的第一个重要月份中,许多声音表示,选择Google不是一个好的主意,因为它会

导致少量的代码共享,由于许多人害怕和社区共享他们的主意。

有两个挑战竞赛计划:

Android开发者挑战竞赛I:截止到2008八月14日。

�Android开发者挑战竞赛II:这部分将在2008第二季中期首款基于Android

手机来临时启动。

Android开发者挑战竞赛I中,到八月14日前提交的50个最有前途的作品将会

被授予25,000美金奖励来做后期开发。这些被选中的若接下来符合主要认证鉴

定并通过,有10个257,000金额的奖励和10个100,000金额的奖励。

提交到挑战竞赛的应用程序应该是创新和证明了Android平台功能的,像基础定

位服务,媒体消费,游戏和社交关系网络等丰富手机体验的。

由提供

15

创建

Android

应用程序

本章节我们特别集中在创建Android应用程序。

Android应用程序剖析

对于一个Android应用程序有四种构成部分

Activity

�IntentReceiver

�Service

�ContentProvider

不是每一个的应用程序都需要所有这四个部分,但是你的应用程序将会用这些的

组合来编写。

一旦你决定了你应用程序需要哪些组件,你应该在一个名叫

文件中列出它们。这是一个XML文件,在里面声明你应用程序组件和它们的功

能和需求是什么。我们将马上讨论,负责什么作用。

Activity

Activity是Android四个构建模块中最普通的一个。一个Acitivity通常在你应用

程序中是一个单独的屏幕。每一个Activity是被实现作为一个继承于Activity基

类的单独的类。你的Class将要显示一个由View和响应事件组成的用户界面。

多数应用程序由多个屏幕组成。例如:一个文本消息发送程序可能有一个显示

要发送信息的联系人列表的屏幕,有一个给选中的联系人编辑短信的屏幕,并

且另外的屏幕显示以前信息或是更改设置。每一个这些屏幕应该作为一个

Activity被实现。移动到另外的屏幕上是通过启动一个新的Activity来完成。由

于一些原因,一个Activity可能会向先前的Activity返回一个值——例如:一个

让用户选择一个Photo的Activity将会返回选中的photo到caller应用程序上。

由提供

16

Download at

andbook-Android编程

当一个新的屏幕开启,先前的屏幕被暂停并且压入历史堆栈。用户可以向后导航

返回到在历史记录中先前打开的屏幕。当它们遗留不适当时,屏幕也可以选择从

历史堆栈中删除。Andriod为每一个从Home屏幕上运行的每一个应用程序保留

历史堆栈。

Intent和IntentFilter

Android使用一个名叫Intent的特殊类来让应用程序从一个屏幕移动到另一个屏

幕。Intent描述了一个应用程序想要干什么。Intent数据结构的两个最重要的部

分是:要响应的action和data。典型的action值是MAIN(应用程序的入口),VIEW、

PICK、EDIT,等等。Data表示成一个统一资源定界符(URI).例如:要在浏览器

中查看一个网站,你将创建一个带有VIEWaction的Intent和设置了网站URI的

data。

有一个名叫IntentFilter的相关类。当一个Intent是一个有效地请求来做什么事,

一个IntentFilter是:一个Activity(或Intentreceiver,参见下面)能够处理什么

样的Intent的描述。一个为个人设计的有能力显示联系人信息的Activity应该发

布一个当申请表示一个人的数据时,可以说是知道如何处理actionView的

IntentFilter。Activity在文件中发布它们的IntentFilter。

从一个屏幕到另一个屏幕的导航通过解决Intent来完成。要向前导航,一个

Activity调用startActivity(myInte)。系统接下来查找所有应用程序的IntentFilter

并选取一个IntentFilter最适合myIntent的Activity。新的Activity被这个让它运

行的Intent通知,解决Intent的过程发生在运行时候,即当startActivity()被调用

时。startActivity()提供了两个关键益处:

Activity可以从其他组件上简单地通过以一个Intent格式做请求来重用功能

Activity可以在任何时候被一个新的带有相等的IntentFilter的Activity替换

由提供

17

IntentReceiver

当你想要在你的应用程序中编码来执行对外部事件的响应,你可以使用一个

IntentReceiver。例如:当电话响铃,或当数据网络可用时,或当午夜时。虽然

IntentReceiver不显示一个UI,但它们也许会显示一个通知来提醒用户是否有令

人感兴趣的事件发生。IntentReceiver也是在中被注册,但

你也可以在代码中使用"erReceiver()"来注册它们。它的

IntentReceiver被调用时,你的程序不是非得运行的;假如必要时,当一个

IntentReceiver被触发时,系统将会调用你的应用程序。通过使用

"astIntent()",应用程序也能发送它们自己的"IntentBroadcast"给别

的应用程序。

Service

一个service是长期存活并且运行时不带UI的编码。这个Service的好例子是

MediaPlayer从一个播放列表中播放歌曲。在一个MediaPlayer应用程序中,可

能有一个或更多的Activity,这些Activity允许用户选择歌曲和开始播放歌曲。

然而,音乐回放本身不应该被一个Activity处理,因为用户将期望在导航到一个

新的屏幕后音乐保持播放。这种情况中,MediaPlayerActivity应该使用

"erver()"来启动一个服务在后台运行来保持音乐继续播放。接下来

系统将保持音乐回放Service运行,直到这个Service被停止。(通过阅读Android

应用程序生命周期,你可以学到更多关于先前给出的系统中的Service。的信息。)

记住,你可以使用"rver()"方法来连接一个Service(如果还没有运

行,并开启它)。当连接到一个Service,你可以通过一个Service显露出来的

Interface来和它通信。对于音乐Service,这可能允许你暂停、倒回,等等。

ContentProvider

应用程序可以把他们的数据存储到文件中,一个SQLite数据库中,设置中,或

是任何其他的有意义结构中。如果你想要你的应用程序的数据和其他应用程序共

享,一个ContentProvider是有用的。一个ContentProvider是一个类,它实现了

方法的一个标准设置来让其他应用程序存储和恢复被ContentProvider处理的数

据类型。

由提供

18

Download at

andbook-Android编程

Android用户界面(UI)

Android中的用户界面可以用两种方式来创建,通过定义XML-代码或通过编写

Java-代码。在XML中定义GUI结构是非常好的,因为正如你从MVC(Model-

Viewer-Control)原理中所知的,UI应该总是从项目逻辑中分离出来。另外,使一

个项目从一个屏幕到另一个更加简单了。

在XML中定义一个UI是和创建一个普通的HTML文件非常相似,这个文件是

你有的,换而言之,如此简单的文件:

PageTitle

Thecontentofthebodyelement.

和Android的XML-布局一样。每一样结构好并且能够通过树形结构来表达。

"1.0"

encoding=

"utf-8"

?>

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=

"HelloWorld!"

/>

由提供

19

屏幕元素层次

Android应用程序基本功能单元是Activity——一个ty类的物件

(Object)。一个Activity能够做许多事情,但是通过它自己它不会出现在屏幕上。

为了让你的Activity出现在屏幕上和设计它的UI,你使用View和ViewGroup(—

—表现在Android平台上的基本用户界面单元)来工作。

View

一个View是一个继承于基类的物件。它是一种数据结构,它

的属性为一个特殊的屏幕矩形域存储布局(layout)和Content。一个View物件

处理它描绘的屏幕区域的尺寸、布局、绘制、焦点改变、翻屏和按键或手势。

View类作为一个基类为所有的widget——一系列完整实现的绘制交互屏幕元素

的子类服务。Widget处理它们自己的尺寸和绘制,因此,你可以使用它们来更

快速地构建你的UI。可获得的widget列表包括:(换言之)TextView、EditView、

Button、RadioButton、Checkbox、ScrollView,……

Viewgroup

一个Viewgroup是一个oup类物件。顾名思义,一个viewgroup

是一个特殊类型的view物件,它的功能是用来包含和管理一系列下属view和其

他viewgroup,Viewgroup让你给你的UI添加结构和构建起复杂的可以称为一个

单独的实体屏幕元素。

Viewgroup类作为一个基类为layout——一系列完整实现的提供普通类型屏幕元

素的子类服务。Layout给你一种方式来为一系列view创建一个结构。

由提供

20

Download at

andbook-Android编程

树形结构UI

在Android平台上,如下图所示,你使用一个树形View和Viewgroup节点定义

一个Activity的UI。这个树形可以简单或复杂,如你所需来创建它,并且你可以

使用Android一系列的预定义Widget和Layout或是你自己创建的CustomView

类型来构建它。

图4AndroidUI——树形结构

为了描述把树和屏幕联系起来,你的Activity调用它的setContentView()方法和传

递一个树形根节点物件的引用。一旦Android系统拥有这个树形根节点引用物件,

它就可以直接使用该节点来工作,使无效、尺寸度量和绘制树。当你的Activity

变成激活和聚焦,系统通知你的Activity并请求根节点度量尺寸并绘制出树。根

节点接着请求它的子节点轮流绘制子节点自己,树中每一个Viewgroup节点有责

任绘制它直系子节点。

如前面陈述,每一个Viewgroup有责任度量它的可用空间尺寸,布局它的子节点,

并在每个子节点上调用draw()来它表述自己。子节点可能会在父节点中请求一个

尺寸和位置,但是父物件有每一个子View放哪里、有多大的最终决定权。

由提供

21

AndroidUI元素与SwingUI元素比较

一些正在阅读本文、大概已经用SwingUI编过程的开发者会觉得Android和

SwingUI元素有一些相似。

Activity在Android中差不多和Swing中的(J)Frame相参考

View在Android中和Swing中的(J)Components相参考

TextView在Android中和Swing中的(J)Lable相参考

EditText在Android中和Swing中的(J)TextField相参考

Button在Android中和Swing中的(J)Button相参考

在Android中给一个View设置监听器和在Swing中几乎相同。

//Android

lickListener(newOnClickListener(){...

//Swing

ionListener(newActionListener(){...

由提供

22

Download at

andbook-Android编程

是所有Android应用程序必须的文件。它位于应用程序的根

目录中,并且为你的套件描述全局变量,包括套件向外界暴露的应用程序组件

(Activity、Service、等等),你的每个Activity和co.可以处理什么样的数据,和

它们如何被运行。

该文件提及到一个重要的事情是它调用IntentFilter。这些Filter(过滤器)描述了哪

里和什么时候Activity能够启动。当一个Activity(或是操作系统)想要执行一个动

作,例如打开网页或是打开一个选择联系人屏幕,它创建一个Intent对象。这个

Intent-对象能够保存许多描述了你要干什么的信息,什么数据需要完成和其他小

信息。Android在一个Intent对象中使用每个应用程序暴露出来的IntentFilter比

较这个信息,并找出最适合的Activity来处理这个数据或是被拨号器指定的动作。

假如有超过一个应用程序能够处理那个Intent,Android就会询问用户喜好哪一

个应用程序来处理它。

除了声明你应用程序的Activity、ContentProvider、Service和IntentReceiver,你

也可以在中指定许可。

由提供

23

一般的

一个非常简单的文件像这样的:

"1.0"

encoding=

"utf-8"

?>

xmlns:android=

"/apk/res/android"

package=

"_android"

>

"@drawable/icon"

>

".Hello_Android"

android:label=

"@string/app_name"

>

android:name=

""

/>

android:name=

"ER"

/>

�几乎每一个(也包含许多AndroidXML文件)在它第一个

元素中都会包括名字空间声明

(xmls:android=/apk/res/android)。这样在该文件中做了一

种标准的Android属性值。这个属性将会用来为该文件中元素支持多数数据。

�几乎每一个Manifest都包括了一个单独的标签,该标签会包含

许多描述在本程序中可用的Application(应用程序)、IntentReceiver,等等的标

签。

如果你想要让一个Activity通过用户可直接运行,你将需要让他支持MAIN

动作和LAUNCHERcategory(种类),它的结果如下所示:

图5可直接运行的Activity

由提供

24

Download at

andbook-Android编程

以下是一个AndroidManifest文件结构的详细列表,描述了所有可用的标签,

每一个附有示例:

这是每一个的根节点。它包含了指向任何包里面Activity外

层的套件属性。其他的Activity-路径将会c对的基于它的值。

xmlns:android=

"/apk/res/android"

package=

""

描述一个为了让你应用程序操作正确(换句话说,当你想要发短信或是使用电话

练习薄时)它必须被授予的安全许可。在安装你的应用程序期间,这个许可通过

用户授予。数量级:0

+

"E_SMS"

/>

声明一个安全许可,可以用来限制哪些应用程序可以访问你套件中的组件和特性

(或其他的)。数量级:0

+

声明一个编排组件的代码,它可用来测试组件的功能或是其他套件。参看更多

instrumentation的详细内容。数量级:0

+

根元素,包含了套件中包含的应用程序级组件的声明。该元素也可以为应用程序

包括全局且/或默认属性,例如一个Label文本标签,icon,theme主题,必须的

许可,等。数量级:0或1

"@drawable/icon"

>

由提供

25

+

你可以把0替换成下面的每个子元素:

一个Activity是应用程序和用户交互的主要事物。当运行一个应用程序时用户看

到的首显屏幕是一个Activity,并且多数用户使用的其他屏幕将会作为独立的

Activity通过添加Activity标签声明被实现。

".Welcome"

android:label=

"@string/app_name"

>

注意:不论它被展露给世界或只是有意在它自己套件中使用,每

一个Activity在Manifest中必须含有一个标签。如果一个Activity在

Manifest中没有符合的Activity标签,你将不能运行它。

+

元素来声明该随意地,为了支持新的运行时更新,你可以包含1

Activity支持的动作。

声明了一个组件支持什么类型的Intent。除了多种能在这个元素下被说明的值以

外,这里给出的属性也可以为已经描述的动作action支持一个单独的label、icon

和其他信息。

一个该组件支持的动作类型。例如:

""

/>

由提供

26

Download at

andbook-Android编程

一个该组件支持的category类型。例如:

"ER"

/>

一个该组件支持的MIME类型,URI体系、URI权威或路径。

你也可以用你的Activity来联合1

+

个meta-data片段:

添加一个meta-data片段到Activity中,客户可以通过ta

来检索。

一个IntentReceiver允许一个应用程序被告知交换数据和发生的动作,即使它现

在没有运行。因为有了Activity标签,你可以随意地包括1

+

素,这个是该Receiver支持的或是值,就像

一样。

".SMSReceiver"

>

一个Service是一个任意时间量内可以在后台运行的组件。由于有了Activity标

签,你可以随意包含一个或多个元素,这个是该Service

支持的或是值;更多信息参看Activity的

描述。

一个ContentProvider是一个管理持续数据并发布它来让其他应用程序访问。你一

可以随意附加一个或多个值,正如Activity的描述一样描

写。

当然,所有标签不得不使用或是直接地来结束。

由提供

27

资源和魔幻的

文件

一个项目的资源和是非常紧密相关的。

资源

资源是被你代码使用和在构建时编译进你的应用程序中的额外的文件(非代码文

件)。Android支持一些不同种类的资源文件,包括XML、PNG和JPEG文件。

XML文件根据它们描述的不同而有不同的格式。资源比源代码更具体化,XML

文件被编译成二进制码,由于高效的原因,这是快速加载的格式。字符串被压缩

进更高效的存储格式中。

资源列表

资源类型和它们存放位置:

�布局文件"/res/layout/"

图片"/res/drawable/"

卡通动画"/res/anim/"

�风格、字符串、数组"/res/values/"

○名称不是必须严格的像这样:

○''定义数组

○''定义颜色

#RGB#ARGB#RRGGBB#AARRGGBB

○''定义尺寸

○''定义字符串

○''定义风格对象

未加工文件:mp3/video"/res/raw/"

由提供

28

Download at

andbook-Android编程

在代码中使用资源

在代码中使用资源只是一个知道完整资源ID和你资源已被编译成什么类型的问

题。这里是相关资源的语法:

ce_ce_name

ce_ce_name

resource_type是R的子类,该子类拥有指定类型的资源。resources_name是在XML

文件中定义的资源的名称属性,或者是被定义成其他文件格式资源的文件名(除

扩展名)。每种类型的资源将会被加载到一个特殊的R子类中,依赖于该资源的

类型。

被你自己的应用程序编译的资源可以不用包套件名(如

ce_ce_name一样简单)就可以引用。Android包含了一些标准

资源,例如:屏幕风格和按钮背景。为了把这些资源引用到代码中,你必须用

android来表述它们,例如:_background。

由提供

29

资源引用

在一个属性中(或资源中)提供的值也可以是一个其他资源的引用。这经常用在

layout文件中来提供字符串(因此它们可以局部化)和图片(在其他文件中存在的),

而一个引用可以是任何包含颜色和整数的资源类型。

例如,如果我们有颜色资源,我们可以编写一个设置文本颜色大小的layout文件,

颜色、大小是包含于这些资源中的值:

"fill_parent"

android:layout_height=

"fill_parent"

android:textColor=

"@color/opaque_red"

android:text=

"Hello,World!"

/>

注意这里'@'字首的使用来引入一个资源引用--紧跟的文本是一个处于

@[package:]type/name结构中的资源名称。由于这样,我们不需要指定套件名,

因为我们在我们自己套件包中引用一个资源。要引用一个系统资源,你应该需要

编写:

"fill_parent"

android:layout_height=

"fill_parent"

android:textColor=

"@android:color/background_light"

android:text=

"Hello,World!"

/>

像其他示例一样,当在一个layout文件中提供字符串你应该总是使用资源引用,

以便它们能够被局部化:

"fill_parent"

android:layout_height=

"fill_parent"

android:textColor=

"@android:color/opaque_red"

android:text=

"@string/hello_world"

/>

由提供

30

Download at

andbook-Android编程

可选资源&局部化

可选资源和局部化是一个非常有用的结果,你将会喜爱Android这样。期待你会

同时设计出一个像风景的GUI和好的肖像屏幕定位--那是几乎不可能的。

你可以根据UI语言或是设备的硬件配置为你应用程序提供不同资源。记住即使

你可以包括不同的字符串、布局和所有其他资源,SDK没有显露出方法来让你

指定设置哪一个可选资源被使用。Android为硬件、地域察觉适合的设置,并合

适的家在它们。只有用户可以使用设备上的设置面板选择可选语言设置。

为了包含可选资源,使用破折号-分隔的修饰语添加到文件夹名称中,创建平行

资源文件夹,指出它实用的配置(语言、屏幕方位、dpi、解析、……)

例如,这有一个工程区分English和German值资源(这里只是字符串):

MyApp/

res/

values-en/

values-de/

Android支持许多修饰类型,每一个带有不同的值。把这些修饰类型加到资源文

件夹名的后面,被破折号分割开。你可以添加多个修饰类型到每个文件夹名中,

但是他们必须是像它们在这被列出的规则一样出现。例如,为一个完全特定的配

置而包含drawable资源的一个文件夹应该像这样:

MyApp/

res/

drawable-en-rUS-port-92dpi-finger-keyshidden-12key-dpad-480x320/

更典型地,你将是指定一少许一个资源被定义的特定配置选项。你可以从完成的

列表中丢弃任何一个值,只要留下的值任然处于相同的规则。

MyApp/

res/

drawable-en-rUS-finger/

drawable-port/

drawable-port-160dpi/

drawable-qwerty/

Android将会在运行期间选择一个在资源文件下面的哪一个值最合适,这依赖于

当前设备配置。

由提供

31

魔幻的

一个工程的是一个自动生成文件,它索引了所有你项目的资源。你在你的

源代码中作为一种快捷方式使用这个类来索引你已经包括在你项目中的资源。这

是显著强劲的带有代码自动完成的IDE特色,这种IDE如:Eclipse,因为他让

你快速地和交互地找出你在寻找的指定引用。

此外,你要使用的资源确实存在,你就获得了编译时安全。

由提供

32

Download at

andbook-Android编程

HelloWorld--Android

方式

在这本第一手教程中你将学习如何使用一个XML布局来创建一个Android应用

程序。记住,使用XML-Layouts是非常好的。

最终的现实结果像这样:

图6第一个Android应用程序--最终显示(SDK-version:m5)

在所有之前,你需要下载和安装AndroidSDK……

由提供

33

安装AndroidSDK

最新AndroidSDK--Windows、Mac和Linux版本总可以从以下URI获得:

/android/

它只需要加载并解压到你合适的地方。

Android开发工具(ADT)

Android提供了一个叫"ADT"的Eclipse插件来让开发和调试更简单。

ADT提供了LogCat简单访问,Android-Manifest(应用程序配置)/Resource-

Editor(资源编辑)/File(文件)/Thread(线程)和HeapControl(堆栈控制)、打进来的电

话/短信仿真,等等。--从SDKversionm5,所有的多种模拟器都同时得到证实。

由提供

34

Download at

andbook-Android编程

安装Eclipse插件(ADT)

要下载和安装ADT插件,跟着Google提供给开发者的步骤:

1.

2.

3.

4.

启动Eclipse,接着选择"Help">"SoftwareUpdates">"FindandInstall"

在出现的对话框中,选择"Searchfornewfeaturestoinstall"点击"New"

点击"NewRemoteSite"

在结果对话框中,为远程站点键入一个名称(如:AndroidPlugin)并键入

这个URL作为它的URL:

/android/eclipse/

点击OK。

5.现在你应该看到新站点加载到搜索列表中(并选中),点击"Finish"。

6.在后来搜索结果对话框中,选择"AndroidPlugin">"DeveloperTools"复选

框。这将会选择"AndroidDeveloperTools"和"AndroidEditors"特性。

AndroidEditors特性是可选的,但是推荐。如果你选择安装它,你需要在

本文早先提及到的WST插件。

现在点击"Newt"

7.

8.

9.

10.

11.

阅读许可协议,选择"Accepttermsofthlicenseagreement",点击"Next"

点击"Finish"

ADT插件没有被签名;总之,你可以点击"InstallAll"接受安装

重启Eclipse

在重启后,跟新你的Eclipse配置来指向SDK目录:

a.选择"Window">"Preferences"来打开配置面板。(MacOS

X:"Eclipse">"Preferences")

b.从左边面板中选择"Android"

c.对于主面板中"SDKLocation",点击"Browse"并选中SDK目录位置

d.点击"Apply",接着点"OK"

更新ADT插件

更新ADT插件遵循更新一个普通Eclipse插件的标准步骤:

1.选择"Help">"SoftwareUpdates">"Findandinstall"

2.选择"Searchforupdatesofthecurrentlyinstalledfeatures"并点击"Finish"

3.如果任何ADT跟新可用,选中并安装。

由提供

35

安装完毕,我们来写点代码

在我们能够开始编写代码前,我们明显地不得不创建一个新的Android项目。

创建一个新的Android项目

1.需要为每一个Android应用程序做的第一件事是创建一个新的Android

项目。要这样,简单地打开Eclipse中的Package浏览器,在一些空白处右键

并选择:

New>Project……

2.

图7第一个Android应用程序-步骤1

选择:Android>AndroidProject

图8第一个Android应用程序-步骤2

由提供

36

Download at

andbook-Android编程

3.用适合你应用程序意图的值来填写表单

图9第一个Android应用程序-步骤3

4.这是你第一个Android-应用程序的所有文件(别惊慌,它们中大多数是资

源文件)

图10第一个Android应用程序-步骤4

由提供

37

哈哈,所有那些文件可以干什么?

当你现在已经创建类你第一个Android项目,你将看到一串文件出现在新项目中。

MainActivity

当你导航到:"/src/your_package_Structure/Hello_"

你将看到一些像下面的默认代码:

_Android;

ty;

;

publicclassHello_AndroidextendsActivity{

/**Calledwhentheactivityisfirstcreated.*/

@Override

publicvoidonCreate(BundlesavedInstanceState){

te(savedInstanceState);

setContentView(.

main

);

}

}

我们可以立即我们的应用程序但是让我也阐释一下其他文件。

XML-Layout()

ADT为你创建了这个非常基本的Activity。正如我们知道的,Activity在某方面

就像Swing中的JFrame。在Android中,我们继承自Activity并需要重写一个单

独的方法,叫做"onCreate()"。在此方法中,我们不得不调用,换句话说,

setContentView()。这让我们的Activity使用也被ADT创建的

文件。

"1.0"

encoding=

"utf-8"

?>

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=

"@string/hello"

/>

我们有一个"全屏"垂直的线性布局LinearLayout,它包含一个显示预设字符串的

单个TextView

由提供

38

Download at

andbook-Android编程

我们看看:

"1.0"

encoding=

"utf-8"

?>

xmlns:android=

"/apk/res/android"

package=

"_Android"

android:versionCode=

"1"

android:versionName=

"1.0"

>

android:icon=

"@drawable/icon"

android:label=

"@string/app_name"

>

".Hello_Android"

android:label=

"@string/app_name"

>

""

/>

android:name=

"ER"

/>

"2"

/>

我们拆分开它

每一个xml文件以下面一行开始,它定义了xml-version和xml-文本编码类型。

只是把它复制粘贴到每一个新文件中。

"1.0"

encoding=

"utf-8"

?>

如我们所知,每一个xml文件中最外层的标签应该包含这个属性:

xmlns:android=

"/apk/res/android"

因为它让各种类的普通Android属性在该文件中可用。

xmlns:android=

"/apk/res/android"

package=

"_Android"

>

标签是包含所有包含在套件中的应用程序级别的组件声明的根元

素。该元素也可以包括应用程序的全局和、或者默认属性,例如一个label标签,

icon、theme主题、需求许可,等等。

由提供

39

这里我们将只是定义icon,通过"@-引用"到一个放在"/res/drasable"下的图片。

android:icon=

"@drawable/icon"

>

标签中,我们需要定义所有需要通过Intent来启动的

Activity/IntentReceiver。在本例中我们只有一个简单的Activity。

android:name=

".Hello_Android"

android:label=

"@string/app_name"

>

.....

你大概已经认识到来自标签的Packag-属性和来自标签的

android:name属性一起总是产生到Activity被描述的完成的包路径中。

最内层的标签是标签,它定义了哪个Intent我们想要监听。这里我

们想要Hello_AndroidActivity可以在模拟器中通过点击图标(在

签中定义了的)来运行。

""

/>

android:name=

"ER"

/>

注意:Android应用程序调试过程像一个普通Java应用程序一样严密。

由提供

40

Download at

andbook-Android编程

运行你第一个应用程序

现在我们需要创建一个"

选择"OpenRunDialog"

-配置"。在Eclipse上菜单中打开"下拉列表"并

图11打开运行-对话框

图12创建运行配置

由提供

41

从现在开始,你可以通过点击来运行你的应用程序。完成后你将看到这个:

图13第一个Android应用程序-结果(SDKversionm5)

在第一次部署后,你也可以看到你的应用程序被列入快速-菜单中,用默认图标

来显示。

图14第一个Android应用程序-添加到快速菜单(SDKversionm5)

由提供

42

Download at

andbook-Android编程

UI--Java方式

我们用XML代码做的同样的事可以通过编写一些Java代码行来实现。

记住我们在xml例子中如何把我们的设置成为ContentView。我们通过

进行以下步骤来完成:

/*Makethisapplicationuse

**-layout-file.*/

tentView();

tentview()也接受一个View作为参数。我们将使用该方法来设置一

个简单的TextView作为我们的ContentView。

_Android;

ty;

;

ew;

publicclassHello_AndroidextendsActivity{

/**Calledwhentheactivityisfirstcreated.*/

@Override

publicvoid

onCreate(Bundleicicle){

te(icicle);

/*Wewanttoviewsomeverysimpletext,

*soweneedaTextViewassociatedwiththisActivity.*/

TextViewtv=newTextView(this);

/*PutsometexttothenewlycreatedTextView*/

t("HelloAndroid-by:"

+"Thisissoooosimple=D");

/*TellourActivitytodisplaythatTextView*/

tentView(tv);

}

}

由提供

43

……)?

n(n(…………)?

在Android中调试不能用n(……)来做,因为如我们所知:Android

不是运行在一个普通虚拟机上,而是在DalvikVM上的模拟硬件中运行。(老实

说,这可以进行,但是明确地不是你的选择)

但是别担心,Android提供了许多强劲的调试特性--LogCat

LogCat

LogCat是DDMS(Dalvik调试监视器服务)的一部分。它提供了一个收集和查看

系统调试输出的机制。来自不同应用程序的Log和系统部分被收集到可以查看

和过滤的LogCat中。

如果你看不到A,那就进行B方式

图15打开DDMS视图

由提供

44

Download at

andbook-Android编程

使用LogCat

每一个AndroidLog信息有一个tag标签和一个跟它联系的优先级。

Log信息的tag是一个指示了信息从那个系统组件发出来(例如视图系统的"View"

)的短字符串。

Priority是以下字符值的一个,从最低到最高的优先级:

V---详细信息(最低优先级)

D---调试

I---信息

W---警告

E---错误(最高优先级)

当我们正使用Eclipse时,我们能通过点击LogCat视图中的"V-D-I-W-E"按钮

(你可以在下面看到)以优先级来简单的过滤。由于那个特性,你将会喜爱上ADT

插件,因为在全部系统生成的输入中,要找到没有被过滤的任何信息都是十分困

难的。

图16LogCat

在代码中用法十分简单。你需要做一个单独的导入:

;

接着你就可以使用调试陈述,像这样:

Log.

d

("DEBUGTAG","Mydebug-message.");

当一些危险性事件发生时,你就可以通过Throwable/Exception到Log.e(……),

得到打印的错误StackTrace输入到LogCat中。

try

{

thrownewException();

}catch(Exceptione){

Log.e("DEBUGTAG","Erroroccured",e);

}

由提供

45

使用

Intent

如我们所知,需要被做的事件用Intent意图目的来表达。Intent换句话说被用来

开启其他Activity。

启动(子)Activity

在一个应用程序生命期中一个基本的事情是比HelloWorld应用程序更精密的,就是启动其

他Activity,尤其是子Activity。让我们假设以下情况:

我们想要一个像输入框这样的。用户可以在该输入框中写一个他想要在Google上查询的关

键字。

因此我们将像我们以前已经做过的一样来创建一个Android项目。第一件事就是添加一个我

们将叫做"MySecondActivity"的第二个Activity。

一开始,代码框架像这样:

ngsubactivities;

import

ty;

;

publicclassMySecondActivityextendsActivity{

/**Calledwhentheactivityisfirstcreated.*/

@Override

publicvoidonCreate(Bundleicicle){

te(icicle);

setContentView();

}

}

由提供

46

Download at

andbook-Android编程

我们现在将添加一个Button到第一个Activity中。我们修改来完成,当然,不通

过选择JavaUI来完成。

浏览"/res/layout/"并且你将看到和下面相似的代码:

"1.0"

encoding=

"utf-8"

?>

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=

"HelloWorld,StartingSubactivities"

/>

注意:也许Eclipse用它自己的xml-编辑器(对我们没有任何用处的编辑器)打开这个

。从SDK-versionm5开始,ADT插件提供了一个带有高亮洁语法的Resource-

Editor。

图17打开Resource-Editor

如果我们现在启动该应用程序,它像这样的:

由提供

47

图18默认布局(SDK-versionm5)

当我们想要在我们应用程序中有一个Button时,我们将不得不加一些xml代码:

android:layout_width=

"fill_parent"

android:layout_height=

"wrap_content"

android:text=

"OpenSearch-Dialog"

/>

如你可以想象的,"fill_parent"让一个View使用所有父View提供的空间,"wrap_content"只

是使用它需要正确地显示自己内容的布局空间。

因此我们的button将宽度填充满整个屏幕,包装我们键入的android:text属性"OpenSearch-

Dialog"。

我们的应用程序现在像这样:

图19带有按钮的布局(SDK-versionm5)

当我们现在点击该按钮--当然,没有事件发生。我们不得不申请一个监听器,是特殊的一个

OnClickListener,来处理在这个按钮上的点击事件。

但是等等……我们怎样在Java代码中引用到那个按钮?

由提供

48

Download at

andbook-Android编程

在Java代码中找到XML定义的View

为了找到一个在XML被定义的View,我们第一不得不添加那个View的一单行

定义到XML定义中,一个android:id属性。在此例我们将给它"btn_open_search"

这个id:

android:id=

"@+id/btn_open_search"

android:layout_width=

"fill_parent"

android:layout_height=

"wrap_content"

android:text=

"OpenSearch-Dialog"

/>

在Java代码中找到那个View同样简单。在一个Activity中你可以使用

"findViewByID(intresourceID)"方法,使用已经在XML中定义的android:id来得

到一个View的引用。

同样其他继承于View的类也可以这样做,换句话说,就是EditText、TextView、

MapView等等……

但是"findViewByID(intresourceID)"只能被用在View上面。这些

View是放进布局中的。而这个Layout布局被Activity使用setContentView()

来加载的。

回到我们例子中,我们添加了以下代码到onCreate(),在setContentView()的右边:

/*FindtheButtonfromourXML-layout.*/

Buttonb=(Button)

this

.findViewById(.

btn_open_search

);

如果Eclipse不能找到Button类,只是敲击"Ctrl+Shift+O"即可,它将会组织导入

和自动添加(本例中):

;

由提供

49

为View处理点击

我们现在记得我们曾想让我们的Button按钮可点击。因此我们简单的设置一个

未命名的OnClickListener到我们的Button上。

lickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

//

TODO

Auto-generatedmethodstub

//PlacecodetohandleButton-Clickhere.

}

});

注意:Eclipse可能不会自己不会认识到以下的导入:

kListener;

现在我们将添加一个Intent到onClick事件中。该事件会启动我们的子Activity:

/*CreateanIntenttostart*

*MySecondActivity.*/

Intenti=

newIntent(,);

/*SendintenttotheOStomake

**itawarethatwewanttostart

**MySecondActivityasaSubActivity.*/

startSubActivity(i,0x1337);

startSubActivity()第二个参数可以是任何唯一整数。他将在后面有用(当我们将替

换它向我们的Activity声明为final时),当我们想要从SubActivity中返回一个结

果时。

以上方法已经不用了,在新的SDKversion1.5中,使用以下方法:

/*CreateanIntenttostart*MySecondActivity.*/

Intenti=newIntent(,);

/*SendintenttotheOStomake

**itawarethatwewanttostart

**MySecondActivityasaSubActivity.*/

startActivity(i);

startSubActivity()方法已经不用了。要从SubActivity中返回一个结果,使用以下

两个方法:

startActivityForResult(intent,requestCode);

startActivityFromChild(child,intent,requestCode);

由提供

50

Download at

andbook-Android编程

如果我们现在就运行我们的代码并且点击我们的按钮,我们将会收到以下错误信

息:

图20Activity没有在中定义

注意:显示的信息中一些十分有用,阅读它们。

我们也需要在文件中定义我们的"MySecondActivity".只要

在第一个标签后面编写:

android:name=

".MySecondActivity"

android:label=

"@string/app_name"

>

""

/>

android:name=

"T"

/>

这时我们不为选择"MAIN",并且也不为选择"LAUNCHER",

因为不需要让"MySecondActivity"从我们应用程序外部运行。

现在"MySecondActivity"可以通过点击该按钮来达到了。但是他也引用到我们的

setContentView(.

main

);

由提供

51

因此我们不得不为"MySecondActivity"创建一个额外的Layout.该Layout经包含

一个叫做EditText的(在Swing术语中叫做TextField)和其他返回到我们"主"-

Activity的Button:

android:id=

"@+id/et_keyword"

android:layout_width=

"fill_parent"

android:layout_height=

"wrap_content"

/>

android:id=

"@+id/btn_return"

android:layout_width=

"fill_parent"

android:layout_height=

"wrap_content"

android:text=

"Submit"

/>

当然,两个都需要一个我们在Java代码中使用到的android:id。现在我们可以修

改"MySecondActivity"的setContentView成:

;

import

ty;

;

;

;

kListener;

;

publicclassStartingSubactivitiesextendsActivity

implementsOnClickListener{

privateButtonopen;

privateIntenttoIntent;

@Override

publicvoidonCreate(BundlesavedInstanceState){

te(savedInstanceState);

setContentView(.

main

);

open=(Button)findViewById(.

btn_open_search

);

lickListener(this);

}

@Override

publicvoidonClick(Viewv){

if(()==.

btn_open_search

){

toIntent=

new

Intent();

ss(,

);

startActivity(toIntent);

}

}

}

由提供

52

Download at

andbook-Android编程

从SubActivity返回值

从SubActivity返回数值给调用者也非常简单:(灰色部分)

;

ty;

;

;

;

kListener;

;

xt;

publicclassMySecondActivityextendsActivity

implements

OnClickListener{

privateEditTextgetText;

privateButtonback;

privateStringgetString;

privateIntentbackIntent;

privateBundlebackBundle;

@Override

protectedvoid

onCreate(BundlesavedInstanceState){

//

TODO

Auto-generatedmethodstub

te(savedInstanceState);

setContentView(.

second

);

getText=(EditText)findViewById(.

et_keyword

);

back=(Button)findViewById(.

btn_return

);

lickListener(this);

}

@Override

publicvoidonClick(Viewv){

//TODOAuto-generatedmethodstub

if(()==.

btn_return

){

getString=t().toString();

backIntent=

new

Intent();

backBundle=newBundle();

ing("GET_TEXT",getString);

ras(backBundle);

setResult(

RESULT_OK

,backIntent);

finish();

}

}

}

由提供

53

你可以额外地通过一个叫做Bundle的来返回给调用者(或多或少是一个

HashMap),但是我马上会告诉你更多它的信息。

明显地调用者不得不响应SubActivity指定返回的行为。为了达到那样,我们不

得不重载一个单独的来自于Activity类的方法。它叫做onActivityResult():

@Override

protectedvoid

onActivityResult(

int

requestCode,

intresultCode,Intentdata){

//TODOAuto-generatedmethodstub

vityResult(requestCode,resultCode,data);

if(requestCode==tCode){

if

(resultCode==

RESULT_CANCELED

){

setTitle("ResualtCanceled");

}

else

{

StringgetStringFrom=ingExtra("GET_TEXT");

setTitle(getStringFrom);

}

}

}

你可能认识到第一个参数叫做requestCode--是的它和我们早期传给

startActivityForResult(toIntent,requestCode);

的requestCode相同。因此,假如我们有更多的SubActivity,我们能使用

requestCode来区分哪一个SubActivity返回。

贴士:Eclipse提供一个你将喜爱的非常有用的方法,尤其是如果你正在继承一

个基类时并在寻找重载的方法:

图21使用Eclipse来找到重载的方法

由提供

54

Download at

andbook-Android编程

因此,我们现在可以简单的选择requestCode和创建其他的Intent来做Google搜

索。

switch

(requestCode){

case

MYSECONDACTIVITY_REQUESTCODE:

/*

*CreateanewIntentto

*showtheGoogle-SearchPage*

*withthekeywordreturned.

*/

IntentwebIntent=

new

Intent(Intent.

ACTION_VIEW

,

Uri.

parse

("/search?q="+getStringFrom));

startActivity(webIntent);

break;

}

当你这时大概已经认识到这个了,我们将用其他方式创建Intent。上次我们像这

样说:"我们想要开启",但是这次我们描述了我们想要得到。我们想要

查看一个URI(统一资源定界符),它可以通过使用rts("……")来构造。

我们的应用程序现在能开启一个(子)Activity,抓取它的返回结果和用一个Intent

来运行浏览器。

但是如何来传递数据给一个(子)Activity?

由提供

55

给(子)Activity传递数据

再次,传递数据给(子)Activity不是难于控制的。你可以使用叫做Bundle的从来

从一个Activity携带信息到另一个Activity。这个Bundle或多或少是个普通的

HashMap,它只可以携带普通的数据类型。只是记住上一章中我们在哪里启动我

们的子Activity:

/*CreateanIntenttostart*MySecondActivity.*/

Intenti=newIntent(,);

/*SendintenttotheOStomake

**itawarethatwewanttostart

**MySecondActivityasaSubActivity.*/

startActivity(i);

在这两行的右边,我们将放入下面的代码:(灰色部分)

toIntent=newIntent();

ss(,);

BundlepassBundle=newBundle();

ing("MY_DEFAULTSTRING_ID","");

ras(passBundle);

startActivity(toIntent);

MY_DEFAULTSTRING_ID可以是任意你想象中的识别字符串。也有个

ra(……,……)方法,此方法每次调用只携带一个信息,我们也应该用

它。

现在我们不得不从我们子Activity中抽取那个信息。通过调用getIntent(),每个

Activity可以访问原开启该Activity的Intent。如果有一个Bundle绑定到这个Intent

上,我们可以通过使用getIntent().getExtras()来抓取到该Bundle。在本例中,我

们将填充EditText,它里面用户会键入带有我们通过Intent传过去的DefaultString

的关键字:

protectedvoidonCreate(BundlesavedInstanceState){

te(savedInstanceState);

setContentView(.

second

);

getText=(EditText)findViewById(.

et_keyword

);

back=(Button)findViewById(.

btn_return

);

lickListener(this);

BundlegetBundle=getIntent().getExtras();

Stringdefault_keyword=

ing("MY_DEFAULTSTRING_ID");

t(default_keyword);

}

由提供

56

Download at

andbook-Android编程

让我们重新回顾一下我们在这里学到了些什么:

使用XML布局创建一个简单的应用程序

用基于Java的布局来创建

运行Android应用程序

使用Logcat来调试

使用Intent来开启(子)Activity

找到在XML中定义的View、在Java代码中使用它们

为View处理点击事件

从SubActivity返回值

使用Bundle传递数据给SubActivity

现在还不糟糕

由提供

57

重要

Layout

ViewGroup

Android提供了一些更多的Layout而不是只有我们在这里使用过的

LinearLayout。除了LinearLayout以外,你将在这里更进一步了解最重要的Layout:

�RelativeLayout(View被放在相对其他View的位置)

�TableLayout(像在HTML中一样使用表格)

额外地我下面将会向你介绍真正经常使用的ViewGroup:

GridView(和TableLayout相似,支持"Adapters"适配器)

ScrollView(如果你超过了屏幕尺寸,你将需要滚屏)

TabHost(在制表中显示内容)

RelativeLayout

根据它的名称,当使用RelativeLayout时,你可以定义View相对于其他"相邻

View"的位置。

由提供

58

Download at

andbook-Android编程

参考书目

nsetAlliance.[Online]

/

dDiscussionGroups.[Online]

/android/

.[Online]

ch,dDevelopmentCommunity|AndroidTutorials.[Online]

,ndroid.[Online]

/

,dCommunity.[Online]

/

as,thecode![Online]

/

由提供

59

缺失章节

社区

从第一天开始,一组社区就从Internet深处成立了。提到(依赖于Alexa-stats(3))

的最重要的社区网站是(4),它是转为GoogleAndroi设置的最新的一个

可视化的教程、社区平台。知名的也有社区平台(5)和

(6)。最后的但明确地不是最新的提及到的是

-Blog(7),它们提供了一些非常简单的代码,是许多开发者

找到好的入门资源的地方。

一些站点更多、一些更少有指望,因此,观察者迟早会把他们指定到以上更重要

的站点清单中。

翻译&学习完毕

时间:2009年5月9日凌晨3:09

译者:张劲锋

职业:学生

专业:软件工程

邮箱:zyf19870302@

谢谢!!

由提供

60

Download at

andbook-Android编程

封面

由提供

61

本文标签: 应用程序资源使用屏幕代码