什么是 Android?
Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。 Beta 版的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。
特性
· 应用程序框架 支持组件的重用与替换
· Dalvik 虚拟机 专为移动设备优化
· 集成的浏览器 基于开源的 WebKit 引擎
· 优化的图形库 包括定制的 2D 图形库, 3D 图形库基于 OpenGL ES 1.0 (硬件加速可选)
· SQLite 用作结构化的数据存储
· 多媒体支持 包括常见的音频、视频和静态图像格式 (如 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF )
· GSM 电话技术 (依赖于硬件)
· 蓝牙 Bluetooth, EDGE, 3G, 和 WiFi (依赖于硬件)
· 照相机, GPS ,指南针,和加速度计( accelerometer ) (依赖于硬件)
· 丰富的开发环境 包括设备模拟器,调试工具,内存及性能分析图表,和 Eclipse 集成开发环境插件
下图显示的是 Android 操作系统的主要组件。每一部分将会在下面具体描述。
Android 会同一系列核心应用程序包一起发布,该应用程序包包括 email 客户端, SMS 短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用 JAVA 语言编写的。
开发人员也可以完全访问核心应用程序所使用的 API 框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。
隐藏在每个应用后面的是一系列的服务和系统 , 其中包括;
· 丰富而又可扩展的视图( Views ),可以用来构建应用程序, 它包括列表( lists ),网格( grids ),文本框( text boxes ),按钮( buttons ), 甚至可嵌入的 web 浏览器。
· 内容提供器( Content Providers )使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据
· 资源管理器( Resource Manager )提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。
· 通知管理器 ( Notification Manager ) 使得应用程序可以在状态栏中显示自定义的提示信息。
· 活动管理器( Activity Manager ) 用来管理应用程序生命周期并提供常用的导航回退功能。
有关更多的细节和怎样从头写一个应用程序,请参考 如何编写一个 Android 应用程序 .
Android 包含一些 C/C++ 库,这些库能被 Android 系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:
· 系统 C 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。
· 媒体库 - 基于 PacketVideo OpenCORE ;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
· Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了 2D 和 3D 图层的无缝融合。
· LibWebCore - 一个最新的 web 浏览器引擎用,支持 Android 浏览器和一个可嵌入的 web 视图。
· SGL - 底层的 2D 图形引擎
· 3D libraries - 基于 OpenGL ES 1.0 APIs 实现;该库可以使用硬件 3D 加速(如果可用)或者使用高度优化的 3D 软加速。
· FreeType - 位图( bitmap )和矢量( vector )字体显示。
· SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
Android 包括了一个核心库,该核心库提供了 JAVA 编程语言核心库的大多数功能。
每一个 Android 应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik 虚拟 机实例。 Dalvik 被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik 虚拟机执行( .dex )的 Dalvik 可执行文件,该格式文件针对小内存使用做了 优化。同时虚拟机是基于寄存器的,所有的类都经由 JAVA 编译器编译,然后通过 SDK 中 的 "dx" 工具转化成 .dex 格式由虚拟机执行。
Dalvik 虚拟机依赖于 linux 内核的一些功能,比如线程机制和底层内存管理机制。
Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。
Android 应用构成
一般情况 Android 应用程序是由以下四种组件构造而成的:
· 活动
· 广播接收器
· 服务
· 内容提供器
需要注意的是,并不是每个 Andorid 应用程序都必须构建这 4 个组件,有些可能由这些组件的组合而成。
一旦你确定了你的应用程序中需要的组件,那么你就应该在 AndroidManifest.xml 中列出他们。 这是一个 XML 配置文件,它用于定义应用程序中需要的组件、组件的功能及必要条件等。这个文件是必须的。 详情参见 Android manifest file documentation
四种组件说明如下:
活动
活动是最基本的 Andorid 应用程序组件,应用程序中,一个活动通常就是一个单独的屏幕。每一个活动都被实现为一个独立的类,并且从 活动 基类中继承而来 , 活动类将会显示由 视图 控件组成的用户接口,并对事件做出响应。 大多数的应用是由多屏幕显示组成。例如,一个文本信息的应用也许有一个显示发送消息的联系人列表屏幕, 第二个屏幕用来写文本消息和选择收件人, 再来一个屏幕查看消息历史或者消息设置操作等。这里每一个这样的屏幕就是一个活动,很容易实现从一个屏幕到一个新的屏幕并且完成新的活动。 在某些情况下当前的屏幕也许需要向上一个屏幕动提供返回值 -- 比如让用户从手机中挑选一张照片返回通讯录做为电话拨入者的头像。
当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态并且压入历史堆栈中。用户可以通过回退操回到以前打开过的屏幕。我们可以选择性的移除一些没有必要保留的屏幕,因为 Android 会把每个从桌面打开的程序保留在堆栈中。
Intent 和 Intent Filters
调用 Android 专有类 Intent 进行构屏幕之间的切换。 Intent 是描述应用想要做什么。 Intent 数据结构两最重要的部分是动作和动作对应的数据。典型的动作类型有: MAIN (活动的门户)、 VIEW 、 PICK 、 EDIT 等。而动作对应的数据则以 URI 的形式进行表示。例如:要查看某一个人的联系方式,你需要创建一个动作类型为 VIEW 的 intent ,以及一个表示这个人的 URI 。
与之有关系的一个类叫 IntentFilter 。当 intent 被要求做某事的时候, intent filter 用于描述一个活动(或者 BroadcastReceiver, 看下面)能够操作哪些 intent 。一个活动如果要显示一个人的联系方式时,需要声明一个 IntentFilter ,这个 IntentFilter 要知道怎么去处理 VIEW 动作和表示一个人的 URI 。 IntentFilter 需要在 AndroidManifest.xml 中定义。
通过解析各种 intent ,从一个屏幕切换到另一个屏幕是很简单的。当向前导航时,活动将会调用 startActivity(myIntent) 方法。然后,系统会在所有安装的应用程序定义的 IntentFilter 中查找,找到最匹配 myIntent 的 Intent 对应的活动。新的活动接收到 myIntent 的通知后,开始运行。当 start 活动方法被调用将触发解析 myIntent 的动作,这个机制提供了两个关键好处:
· 活动能够重复利用从其它组件中以 Intent 的形式产生的一个请求
· 活动可以在任何时候被一个具有相同 IntentFilter 的新的活动取代
广播接收器
你可以使用 BroadcastReceiver 来让你的应用对一个外部的事件做出响应。比如:当电话呼入时,数据网络可用时,或者到了晚上时。 BroadcastReceivers 不能显示 UI ,它只能通过 NotificationManager 来通知用户这些有趣的事情发生了。 BroadcastReceivers 既可以在 AndroidManifest.xml 中注册,也可以在代码中使用 Context.registerReceiver() 进行注册。但这些有趣的事情发生时,你的应用不必对请求调用 BroadcastReceivers ,系统会在需要的时候启动你的应用,并在必要情况下触发 BroadcastReceivers 。各种应用还可以通过使用 Context.sendBroadcast() 将它们自己的 intent broadcasts 广播给其它应用程序。
服务
一个 服务 是具有一段较长生命周期且没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个活动,让使用者可以选择歌曲并播放歌曲。 然而,音乐重放这个功能并没有对应的活动,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个活动会使用 Context.startService() 来启动一个服务,从而可以在后台保持音乐的播放。同时,系统也将保持这个服务一直执行,直到这个 service 运行结束。 ( 你可以通过阅读 Life Cycle of an Android Application 获取更多关于服务的介绍 ). 另外,我们还可以通过使用 Context.bindService() 方法,连接到一个服务上(如果这个服务还没有运行将启动它)。当连接到一个服务之后,我们还可以通过服务提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。
内容提供器
应用程序能够将它们的数据保存到文件、 SQLite 数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时,内容提供其将会很有用。一个内容提供器类实现了一组标准的方法,从而能够让其它的应用保存或读取此内容提供器处理的各种数据类型。 更详细的内容提供器资料,可以参考附带文档中的 Accessing Content Providers 。
<!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536881799 0 0 0 511 0;} @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0in; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink {mso-style-noshow:yes; mso-style-priority:99; color:blue; mso-themecolor:hyperlink; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:purple; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; mso-fareast-font-family:宋体;} @page WordSection1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;} div.WordSection1 {page:WordSection1;} -->
AndroidManifest.xml 是系统的控制文件,它告诉系统如何处理你所创建的所有 顶层组件 ( 尤其是 activities, 服务 ,Intent 接收器和后面描述的内容管理器 ) 。举例 来说,控制文件就是把你的活动( Activities )要接收的 Intents 连接在一起的 “ 胶水 ” 。
活动( Activity )就是一个有生命周期的对象。 一个 Activity 就是完成某些工作的代码块, 如必要的话,这部分工作还可能包括对用户 UI 界面的显示。不过这不是必须的,有些活 动从不显示 UI 界面。典型地,你将会指定你的应用程序中的一个活动为整个程序的入口点。
视图 (Views) 可以将其自身绘制到屏幕上。 Android 的用户界面由一系列的视图树 ( trees of views )构成。接口都是由一组以树的形式出现的视图组成的。开发者可 以通过创建一个新的视图的方法来使用自定义的图形处理技术 ( 比如开发游戏,或者是 使用了不常用的用户图形 (UI) 窗口界面 (widget)) 。
Intents 是一个简单的消息对象,它表示程序想做某事的 “ 意图 ” ( intention )。比 如如果你的应用程序想要显示一个网页 , 那么它通过创建一个 Intent 实例并将其传递给 系统来表示意图浏览这个 URI 。系统将定位于知道如何能处理这一 Intent 的代码(在当 前情况下就是浏览器),并运行之。 Intents 也可以用于广播系统范围内的有效事件 ( 例如通知事件 ) 。
服务是运行在后台的一段代码。它可以运行在它自己的进程 , 也可以运行在其他应用程 序进程的上下文( context )里面,这取决于自身的需要 . 。其它的组件可以绑定到一个服 务( Service )上面,通过远程过程调用( RPC )来调用这个方法。例如媒体播放器的服务, 当用户退出媒体选择用户界面,她仍然希望音乐依然可以继续播放,这时就是由服务 ( service )来保证当用户界面关闭时音乐继续播放的。
通知将以小图标的形式呈现在状态栏里,用户通过与图标的交互式操来接收消息。最常见 的通知包括短信息,通话记录,语音邮件,但是应用程序也可以创建它们自己的通知事件。 我们推荐采用通知事件实现提醒用户的注意。
内容管理器( ContentProvider )提供对设备上数据进行访问的数据仓库。典型的例子就 是使用内容管理器来访问联系人列表。你的应用程序也可以使用其它程序通过内容管理器提 供的数据,同时你也可以定义你自己的内容管理器来向其它应用提供数据访问服务。