Chinaunix首页 | 论坛 | 博客
  • 博客访问: 642350
  • 博文数量: 99
  • 博客积分: 4335
  • 博客等级: 中校
  • 技术积分: 931
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-26 14:11
文章分类

全部博文(99)

文章存档

2012年(14)

2011年(17)

2010年(14)

2009年(54)

分类: 嵌入式

2009-09-19 21:31:01

Anatomy of an Android Application(中文翻译)

一个Android应用程序由下面四种组件构成:

  • Activity
  • Intent Receiver
  • Service
  • Content Provider

并不是每一个应用程序需要全部的以上四个组件, 但是你会用他们的不同组合来完成你的应用程序。

一旦你决定你的应用程序需要哪些组件,你应该把他们写入一个叫做AndroidManifest.xml的文件。 这个文件是一个XML文件, 在这个文件里

你声明了程序的组件以及组件的功能和前提条件。更多的内容,请看下面的连接:android/devel/bblocks-manifest.html



Activity

Activitiy 是四种组件中最常用的一种, 一个activity经常表现为你程序中的一个屏幕,每个activity都是通过对Activity基类的继承来实现

的。你的这个activity类应该显示一个由View组成的用户界面,并且能够对事件做出反映。大部分的应用程序由多个屏幕组成。例如, 一个文

字短信程序由第一个屏幕显示一个联系人列表用来发送信息,而第二个屏幕用来写短信息,另外一个屏幕查看短信息或对程序进行设置。每个

屏幕都是由一个activity来实现的。通过开始一个新的activity你可以进入到新的屏幕中。在某些情况下一个activity会给前一个activity返

回一个值--例如一个让用户进行照片选择的activity会把选择的照片送回至使用过它进行选择的那个activity。

当一个新的屏幕打开了, 前一个屏幕就暂停了,并且进入了一个堆栈。用户可以通过“向后”来直达以前用过个一个屏幕。如果它没有保留价值

了,屏幕也可以从堆栈中移出。Android从初始屏幕开始为每个应用程序保留一个堆栈。


Intent and Intent Filters


Android使用一个特殊的叫做Intent的类从一个屏幕移动到另一个屏幕。一个Intent描述了一个应用程序要完成的事情。Intent中最重要的两个

数据结构是行为(Action)以及这个行为所要操作的数据(the data to act upon)。 典型的行为是MAIN(activity的前门),VIEW,PICK,EDIT

等等。那些被操作的数据表现为URI。例如,为了看一个人(A)的Contact信息,你应该创建一个Intent,这个Intent拥有一个VIEW行为和一个

数据集,这个数据集通过URI指向了A。

与此相关的,有一个类叫做IntentFilter。如果说Intent是说明了对做某事提供了有效的反应,那么Intent Filter就是要说明一个对

activity(或者intent recevier,见下文)的哪些请求能够进行处理。一个能够显示某人联系信息的activity应该声明一个intetfilter,当VIEW指向了某人的时候,此

interfilter声明了它知道如何处理VIEW的行为,Acitivity的相关IntenFilter声明要写入AndroidManifest.xml文件中

从一个屏幕转换到另外一个屏幕是通过解析一个目的来完成的。例如:“向前”。一个activity执行startActivity(myIntent)。系统于是开始在

intent filter中寻找所有安装过的程序然后选择那个和myIntent最为匹配的那个activity.一个新的activity因为这个intent所驱动,开始运

行。当startActivity()被执行时, 一个intent的解析就开始进行处理了。这样做有两点好处:

1. 只需要简单以intent的形式发出一个请求,那么一个Activity的功能就可以从其他组件中开始复用了。
2. 一个activity可以在任何时候被新的、含有相同IntentFilter的Activity替代。



Intent Receiver

你可以利用IntentReceiver编程,如果你希望你的应用程序能够对一些扩展事件做出反映。例如,当有电话打进来时,当网络空闲,午夜等。

Intent Recevier不会显示一个UI,尽管如果有些有趣的事情发生了,他们也许会用到NotficationManager去警告用户。Intent Receivers应该

在AndroidManifest.xml中被声明,但是你也可以通过Context.registerReceiver()来声明。如果有必要当一个Intent Receiver被触发时,系统

会启动你的程序,你的程序不必运行它的IntentFilter以等待被呼叫。应用程序也可以通过Context.broadcastIntent()来对他们的intent进行

广播。



Service

服务是一直运行,但是没有用户界面的程序。一个好的例子就是媒体播放器播放曲目表中的歌曲。在一个媒体播放器程序中, 也许会有一个或

多个Activity,他们被用来进行选择和播放歌曲。然而一个正在播出的歌曲的句柄不能够被交出去,因为用户希望即使他们已经切换到了另外一

个屏幕,歌曲还是一直在播放的。这个时候媒体播放器应该用Context.startService()来启动一个服务在后台继续播放音乐。系统会保持歌曲

的播放直到它结束为止。(通过阅读 你可以了解到更多的关于系统中的优先权的信

息)注意:你可以通过Context.bindService()来连接并(启动)一个服务(如果它不在运行中)。当你连接到一个服务的时候,你可以通过

它开放的接口和这个服务进行通讯。例如音乐播放,通过开放接口可以让你暂停或重播。

Content Provider

程序可以把他们的数据存储到一个文件中, 数据库中或者其它任何有对于它来说有意义的媒介中,如果你想让你的程序和其它的程序进行数据交换的话Content Provider是非常好用。content provider是一个类,它实现了一套标准的方法集,用来让其它程序存储和恢复数据,这些数据用来和他们(其他的程序)自己的content provider进行交换。更多的内容请看:android/devel/data/contentproviders.html
阅读(1939) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~