Android计算平台简介
计
算正逐渐变得比以往更为易懂。手持设备已转变成计算平台。
移动设备(手机或平板电脑)正成为非常强大的通用计算平台,势必成为真正的PC。据预测,所有传统PC制造商都在计划推出基于Android的各种规格的设备。各种操作系统之间、计算平台之间、编程语言之间,以及开发框架之间的竞争将转而在移动设备上重演。
我们还预测,随着越来越多的IT应用程序开始推出移动版本,IT行业将掀起一场移动编程热潮。为了帮助读者从这一趋势中受益,本书将介绍如何使用Java为运行在谷歌公司Android平台(http://developer.android.com/index.html)上的设备开发应用程序。Android是一个面向移动开发和平板电脑开发的开源平台。
说明 Android令我们非常激动,因为它是一个引入了众多全新的框架设计模式的先进的基于Java的平台(即使受到移动平台的限制)。
本章将概述Android及其SDK,简短介绍一些重要的包,引出每章将涉及的主题,展示如何利用Android源代码,并**介绍一下为Android平台编程的美好前景。
1.1 面向新PC的全新平台
Android平台融入了面向手持设备的通用计算理念。它是一个综合平台,包含一个基于Linux的操作系统,用于管理设备、内存和进程。Android中的Java库涵盖了电话、视频、语音、图形、连接、UI编程和设备的其他许多方面。
说明 尽管是针对移动设备和平板设备而构建,但Android平台具备全功能桌面框架的所有特征。谷歌公司通过Android
SDK(Software Development Kit,软件开发工具包)将此框架提供给Java程序员。在使用Android
SDK时,很难感受到是在向移动设备编写应用程序,因为你能够访问在桌面或服务器(包括关系数据库)上使用的大部分类库。
Android SDK支持大多数Java SE(Java Platform, Standard
Edition),但并不支持AWT(Abstract Window
Toolkit,抽象窗口工具包)和Swing。对于AWT和Swing,Android
SDK拥有自己的扩展现代UI框架(extensive modern UI
framework)。因为你在使用Java编写应用程序,所以可以想到,需要一个JVM(Java Virtual
Machin,Java虚拟机)来解释运行时Java字节码。JVM通常会提供必要的优化,以使Java能够达到与C和C++等编译语言相当的性能水平。Android提供了自己的经过优化的
JVM来运行已编译的Java类文件,以克服手持设备在内存、处理器速度和功率等方面上的限制。这个虚拟机称为Dalvik
VM(1.3节将详细介绍)。
说明 Java编程语言的简单性和人们对它的熟悉,再加上Android丰富的类库,使Android成为了富有吸引力的编程平台。
图1-1简单展示了Android软件栈(1.4节将更详细地介绍它)。
图1-1 Android软件栈的总体结构
1.2 Android的历史
各种手机使用着不同的操作系统,比如Symbian OS、微软公司的Windows Phone OS、Mobile
Linux、iPhone OS(基于Mac OS
X)、Moblin(来自英特尔公司)以及许多其他专用操作系统。迄今为止,没有一个操作系统成为事实标准。可用于开发移动应用程序的API和环境具有诸多限制,似乎远远落后于桌面框架。对比之下,Android平台具有开放、经济和代码开源的特点,更重要的是,它还包含一个高端、高度集成且一致的开发框架。
谷歌公司于2005年收购了新兴公司Android,开始开发Android平台(参见图1-2)。Android公司的重要成员包括Andy
Rubin、Rich Miner、Nick Sears和Chris White。
2007年11月,Android SDK**发布“预览”版。2008年9月,T-Mobile发布了T-Mobile
G1,这是**部基于Android平台的智能手机。从那以后,我们相继看到了SDK2.0、3.0及现在的4.0,基本上是一年一个新版本。应用Android操作系统的设置一开始只是涓涓细流,现如今已是波涛汹涌。
图1-2 Android的发展历程
Android的一个重要架构目标是使应用程序能够彼此交互,重用彼此的组件。这种重用不仅适用于服务(service),还适用于数据和用户界面(UI)。
由于功能完善成熟,Android也吸引了一些早期追随者利用Web资源所提供的云计算模型,使用手机自身的本地数据存储增强云计算体验。Android对手机上的关系数据库的支持也是吸引早期采用者的一个重要因素。
1.0和1.1版(2008年发布)的Android不支持软键盘,设备需要配备物理键盘。2009年4月发布的1.5
SDK解决了这个问题,该版本还包含许多其他功能,比如**媒体录制功能、部件和活动文件夹(live folder)。
2009年9月发布了Android 1.6,在一个月内又发布了Android
2.0,这有力地推动了2009年圣诞节众多Android设备的上市。这个版本引入了**搜索功能和文本到语音的转换功能。
Android
2.3包括以下重要的功能:由管理员远程擦除**数据、在光照不足条件下使用照相机和视频、Wi-Fi热点、重大的性能改善、改进的蓝牙功能、可选择将应用程序安装在SD卡上、OpenGL
ES
2.0支持、备份改进、搜索实用性改进、针对信用卡处理的近场通信支持、显著改进的动作和传感器支持(类似于Wii)、视频聊天以及改进的Market。
Android 3.0主要针对基于平板电脑的设备和强大得多的双核处理器,比如NVIDIA Tegra
2。此版本的主要功能包括支持使用较大的屏幕,引入了一个名为“碎片”的重要的新概念。这个概念渗透到了3.0版的体验中。Android
3.0还引入了更加类似于桌面的功能,比如action
bar和拖放。主屏幕部件得到了显著改进。现在有更多UI控件可用。在3D领域,OpenGL使用Renderscript得以改进,为ES
2.0提供了进一步的补充。它对于平板电脑而言是一项激动人心的功能。
然而,3.0版本仅支持平板电脑。在3.0发布时,Android
2.x版本分支继续支持手机,而3.x分支则支持平板电脑。从4.0开始,Android将这些版本分支合并在一起,形成一个SDK。对于手机用户而言,平板电脑体验的主要UI差别也移植到了手机上。
4.0版本用户体验的主要方面如下。
使用新字体Roboto,在高清屏幕上显示清新效果。
采用一种更好的方法,在首页上将应用组织到文件夹。
支持将应用和文件夹拖到收藏托盘,使它们总是显示在屏幕底部。
基于设备类型进行通知优化。在小型设备上,通知显示在上面,而对于大型设备,则显示在底部的系统栏。
支持可变尺寸和可滚动的小部件。
各种屏幕解锁方法。
拼写检查程序。
通过“连续说话”选项改进语音输入。
更多网络数据使用控制方法。
改进联系人应用,增加与社会化网络相似的个人账号管理。
改进日历应用。
优化照相机应用:连续对焦、无快门滞后、人脸识别、触控对焦和照片编辑器。
照片逼真效果和视频傻瓜效果。
快速抓取和分享屏幕截图。
浏览器性能提升了两倍。
改进电子邮件。
提出新概念:通过基于NFC共享的Android Beam发送数据。
支持Wi-Fi Direct,推进P2P服务。
支持蓝牙HDP(Bluetooth Health Device Profile)。
4.0增加的主要***支持如下。
修正基于对象(包括视图)属性变化的动画。
修复3.0中多个基于列表小部件行为。
更成熟且集成搜索的工具栏。
支持大量的移动标准:**音频分发模型(Advanced Audio Distribution Profile,
A2DP:支持使用外部扬声器)、实时传输协议(Realtime Transport Protocol,
RTP:通过IP传输流式音频/视频)、媒体传输协议(Media Transfer Protocol,
MTP)、图片传输协议(Picture Transfer Protocol,
PTP:连接计算机下载照片和媒体文件)和蓝牙耳机模块(Bluetooth Headset Profile, HSP)。
全设备加密。
数字版权管理(DRM)。
加密存储与密码。
包括个人账号的社会化API。
增强的日历API。
语音邮件API。
1.3 Dalvik VM剖析
作为Android平台的一部分,谷歌公司花了大量时间思考针对低功耗手持设备的优化设计。与桌面设备相比,手持设备在内存和速度方面落后8~10年。它们的计算能力也有限。结果,手机的性能需求变得很严格,要求手机设计人员优化所有因素。如果查看Android中的包列表,你将会看到它们的功能全面而丰富。
这些问题使谷歌公司在许多方面重新审视标准JVM实现。(Dan
Bornstein对谷歌公司的这个JVM实现作出了重要贡献,他编写了Dalvik
VM,Dalvik是冰岛一个小镇的名称。)首先,Dalvik
VM获取生成的Java类文件,将它们组合为一个或多个Dalvik可执行文件(.dex)。Dalvik
VM的目标是找到所有可能的方式来优化JVM空间、性能及电池寿命。
采用Dalvik
VM的一个结果是,Android中*终的可执行程序代码不是基于Java字节码,而是基于.dex文件。这意味着无法直接执行Java字节码,必须首先得到Java类文件,然后将它们转换为可链接的.dex文件。
1.4 理解Android软件栈
到目前为止,我们介绍了Android的历史和它的优化功能,包括Dalvik
VM,还提到了可用的Java软件栈。本节将介绍与Android开发有关的内容。图1-3显示了从开发人员的视角所得出的Android软件栈。
图1-3 Android SDK软件栈详细结构
Android平台的核心是Linux内核,它负责设备驱动程序、资源访问、电源管理和完成其他操作系统的职责。提供的设备驱动程序包括显示器、照相机、键盘、Wi-Fi、闪存、音频和IPC(Inter-Process
Communication,进程间通信)。尽管核心是Linux,但Android设备(比如Motorola
Droid)上的绝大部分应用程序都是使用Java开发,通过Dalvik VM运行的。
我们看一下另一层,内核之上是许多C/C++库,比如OpenGL、WebKit、FreeType、SSL(Secure Sockets
Layer,**套接字层)、libc(C运行时库)、SQLite和媒体。基于BSD(Berkeley Software
Distribution,伯克利软件套件)的系统C库针对嵌入式Linux设备进行了调优(大小约为原始大小的一半)。媒体库基于PacketVideo(www.packetvideo.com/)的OpenCORE。这些库负责录制和播放音频和视频格式的内容。一个名为Surface
Manager的库控制对显示系统的访问,支持2D和3D。
说明 这些核心库可能会发生变化,因为它们都属于Android的内部实现细节,不会直接加到已发布的Android
API上。这里对核心库进行介绍,只是希望读者了解Android的底层特性。请参考Android***网站,了解*新更新和未来变化。
WebKit库负责浏览器支持,WebKit也是谷歌公司的Chrome和苹果公司的Safari使用的库。FreeType库负责字体支持。SQLite(www.sqlite.org/)是一个可在设备自身上使用的关系数据库。SQLite也是关系数据库的一项独立的开源成果,没有直接绑定到Android。适用于SQLite的工具也可用于Android数据库。
大多数应用程序框架都通过Dalvik VM访问这些核心库,Dalvik
VM就像Android平台的入口。前面几节已经提到,Dalvik经过了优化,可以运行多个VM实例。访问这些核心库时,每个Java应用程序都会获得自己的VM实例。
Android Java
API的主要库包括电话、资源、位置、UI、ContentProvider(数据)和包管理器(安装及**等)。程序员使用此Java
API开发*终用户应用程序。设备上的一些*终用户应用程序示例包括Home、Contacts、Phone及Browser等。
Android还支持谷歌公司一个名为Skia的自定义2D图形库,这个库是使用C和C++编写的。Skia也是Google
Chrome浏览器的核心组件。然而,Android中的3D API基于来自Khronos小组(www.
khronos.org)的一个OpenGL ES实现。OpenGL ES包含OpenGL中面向嵌入式系统的子集。
从媒体角度讲,Android平台支持*常见的音频、视频和图像格式。从无线角度讲,Android的API可支持蓝牙、EDGE、3G、Wi-Fi和GSM(Global
System for Mobile Communication,全球移动通信系统)电话,而具体则取决于设备硬件。
1.5 使用Android SDK开发*终用户应用程序
本节将介绍用于在Android上开发*终用户应用程序的**Android Java
API。我们将简单介绍Android模拟器、Android基础组件、UI编程、服务、媒体、电话、动画和OpenGL等。
1.5.1 Android模拟器
Android SDK包含一个Eclipse插件,名为ADT(Android Development
Tools,Android开发工具)。这个IDE(Integrated Development
Environment,集成开发环境)工具用于开发、调试和测试Java应用程序。(第2章将深入介绍ADT。)也可以单独使用Android
SDK,使用命令行工具代替ADT。两种方法都支持使用模拟器来运行、调试和测试应用程序。甚至90%的应用程序开发工作都不需要真实设备。全功能的Android模拟器能够模拟大部分的设备功能。模拟器不能模拟USB连接、照相机与视频采集、耳机、电池仿真、蓝牙、Wi-Fi、NFC和OpenGL
ES 2.0。
Android模拟器使用一种名为QEMU的开源“处理器模拟器”技术来完成它的工作,此技术由Fabrice
Bellard(http://wiki.qemu.org/Index.html)开发。这项技术还支持在一个操作系统上模拟另一个操作系统,而不用考虑采用了何种处理器。QEMU支持在CPU级别上进行模拟。
在Android模拟器中,处理器基于ARM(Advanced RISC
Machine,**精简指令集机器)架构。ARM是一种基于RISC(Reduced Instruction Set
Computer,精减指令集计算机)的32位微处理器架构,其设计上的简单性和较高的速度通过指令集中精减的指令来实现。模拟器在此模拟处理器上运行Linux的Android版本。
ARM被广泛应用于手持设备和其他嵌入式电子设备中,低功耗对这些设备非常重要。移动市场也广泛使用了基于此架构的处理器。
可以在Android
SDK文档中找到关于该模拟器的更多详细信息:http://developer.android.com/
guide/developing/tools/emulator.html。
1.5.2 Android UI
Android使用的UI框架类似于其他基于桌面的全功能UI框架。实际上,它在本质上更加先进,更具异步特征。如果将基于C的传统Microsoft
Windows API看做**代UI框架,将基于C++的MFC(Microsoft Foundation
Classes,Microsoft基础类)看做第二代,基于Java的Swing
UI框架可以看做第三代,它比MFC具有更高的设计灵活性。从本质上来讲,Android UI是第四代UI框架。Android
UI、JavaFX、Microsoft Silverlight和Mozilla XUL(XML User Interface
Language,XML用户界面语言)都是第四代UI框架的新成员,它们的UI是声明性的,具有独立的主题。
说明 在Android中,即使编程的目标设备是手持设备,也会使用一种时尚的用户界面模式。
在Android
UI中编程涉及在XML文件中声明界面。然后将这些XML视图(view)定义作为窗口加载到UI应用程序中。这与基于HTML的web页面很相似。与HTML一样,通过其ID及使用Java代码操作它们来找到(掌握)单独控制。
甚至Android应用程序中的菜单也是从XML文件加载的。Android中的屏幕或窗口通常称为活动(activity),包含用户完成一个逻辑动作单元所需的多个View。View是Android中的基本UI构建块,可以对它们进一步组合形成名为视图组的复合视图。
View在内部使用我们熟悉的画布、绘图和用户交互概念。在Android中,承载这些复合视图(包括View和视图组)的Activity是逻辑上可替换的UI组件。
Android
3.0引入了另一个名为碎片的UI概念,允许开发人员将视图和功能在平板电脑上分块显示。平板电脑为多窗格活动提供了充足的屏幕空间,而碎片提供了这些窗格的抽象。
Android框架的一个重要概念是Activity窗口的生命周期管理。Android采用一些协议在用户隐藏、还原、停止和关闭Activity窗口时管理状态。第2章将介绍这些基本的思想,还将介绍如何设置Android开发环境。
1.5.3 Android基础组件
Android
UI框架以及Android的很多其他部分都依赖于一种名为Intent(意图)的新概念。Intent是调用Android组件的intra-及interprocess机制。
在Android中,组件是指一段具有确切生命周期的代码。显示Android应用窗口的活动就是一个组件。Android进程中服务其他客户端的服务是一个组件。唤醒事件响应的接收器也是Android的一个组件。
虽然Intent的主要作用是调用组件,但是它同时也可以服务于窗口化消息、操作、发布订阅模型和进程间通信等组件。下面就是一个使用Intent类调用或启动Web浏览器的例子:
在这个例子中,通过一个Intent,我们要求Android启动合适的窗口来显示一个网站的内容。根据设备上安装的浏览器列表,Android将选择合适的浏览器来显示该网站。第5章将更详细地介绍Intent。
Android还支持广泛的资源,包括我们熟悉的字符串和位图,以及一些不太熟悉的基于XML的View(布局类似于HTML)定义。该框架以新颖的方式使用资源,使资源使用变得简单、直观和方便。下面这个例子为在XML文件中定义的资源自动生成资源ID:
这个类中每个自动生成的ID都与XML文件中的一个元素或整个文件对应。在希望使用这些XML定义的地方,使用这些生成的ID来代替。当基于场所及器件尺寸等来详细说明资源时,这种间接性具有很大帮助。(第3章将更详细地介绍R.java文件和资源。)
Android中另一个新概念是ContentProvider(内容提供程序)。ContentProvider是对数据源的抽象,使它看起来像RESTful服务的发出者和使用者。底层SQLite数据库使这个ContentProvider成为了应用程序开发人员的强大工具。第4章将探讨ContentProvider。第3章~第5章将介绍Intent、资源和ContentProvider如何促进Android平台中的开放性。
1.5.4 **UI概念
XML网页布局定义(类似于HTML网页)在描述Android UI的过程中扮演着重要角色。让我们通过下面这个例子,看看Android
layout XML文件如何在包含文本视图的简单布局中发挥作用:
我们将使用为此XML文件生成的ID来将此布局加载到Activity窗口中。(第6章将进一步介绍此过程。)Android还提供了对菜单的广泛支持(第7章将详细介绍),从标准菜单到上下文菜单。在Android中使用菜单很方便,因为它们也是作为XML文件加载的,而且这些菜单的资源ID是自动生成的。下面这段代码展示了如何在XML文件中声明菜单:
尽管Android支持对话框,但Android中的所有对话框都是异步的。对于习惯于一些窗口框架中的同步模态对话框的开发人员,这些异步对话框带来了一种特殊的挑战。第7章将更全面地介绍菜单,第9章将详细介绍对话框。
Android提供了对动画的大量支持。实现动画的基本方式有3种。分别是创建逐帧动画、通过修改视图变换矩阵(位置、尺寸、旋转和透明度)而创建的补间动画或通过修改对象属性创建补间动画。Android3.0引入了基于属性的动画,这是实现动画的*灵活方式,也是人们**使用的方式,我们将在第21章详述这些动画。
此外,Android还允许在XML资源文件中定义这些动画。在下面这个示例中,逐帧动画中播放了一系列带有编号的图像:
Android还通过其OpenGL ES 1.0和2.0标准提供了对3D图形的支持。与OpenGL一样,OpenGL
ES是一个基于C的平面API。由于Android SDK是一种基于Java的编程API,所以它需要使用Java绑定来访问OpenGL
ES。Java ME已经通过JSR(Java Specification Request)239为OpenGL
ES定义了这一绑定,Android在其实现中为OpenGL
ES使用了相同的Java绑定。如果还不熟悉OpenGL编程,那么学习起来可能比较困难。受篇幅的限制,我们无法在本书这一版本中讲解OpenGL,但是在第3版中却有超过100页的讲解。
使用主页,Android实现了大量让信息流于指尖的新理念。**个理念是活动文件夹。使用活动文件夹,可以用文件夹的形式在主页上发布一个项目集合。这个集合中的内容会随着底层数据的更改而更改。不断变化的数据可以来自设备,也可以来自因特网。受篇幅的限制,我们无法在本书的这一版本中讲解活动文件夹。不过,本书第3版中对此有大量介绍。
第二个基于主页的理念是主屏幕部件。主屏幕部件用于使用UI部件在主页上绘制信息。此信息可以定期变化。电子邮件存储中的电子邮件数量就是这方面的一个例子。第25章将介绍主屏幕部件。主屏幕部件在3.0版中得到了改进,包含可在底层数据更改时更新的列表视图。这些改进将在第26章中介绍。
集成Android搜索是第三个基于主页的理念。使用集成搜索,既可以在设备上搜索内容,也可以在网络上搜索内容。Android搜索超越了传统搜索的概念,支持通过搜索控件不断发出命令。受限于篇幅,我们无法在本书这一版本中讲解搜索API。不过,本书第3版中有详细介绍。
Android还支持触摸屏以及基于手指在设备上移动的手势。Android支持将手指在屏幕上的随机移动记录为命名的手势。应用程序然后可以使用这一手势来执行特定操作。第27章将介绍触摸屏和手势。
传感器现在成为了移动体验的重要部分。第29章将介绍传感器。
移动设备所需的另一项必要创新是其配置的动态性。例如,很容易在纵向和横向之间更改手持设备的查看模式。或者可以为手持设备连接扩展坞以转变为平板电脑。Android
3.0引入了碎片这一概念来有效地处理这些变体。第8章将专门介绍碎片,第12章介绍如何处理配置的变化。
第10章还将介绍3.0版中的操作栏功能(在4.0中得到大幅改进)。操作栏将Android提升到了与桌面菜单栏模式类似的水平。
3.0版本为平板电脑引入了拖放操作。这个特性现在也移植到手机上。本书将在第28章介绍拖放操作。
手持设备能够完全感知基于云的环境。在执行服务器端HTTP调用时,一定要理解线程模型,否则会遇到应用未响应错误。这一点很重要。本书将在第18章介绍异步处理机制。
在Android
SDK外部,还有大量独立的创新,它们使应用程序开发既令人激动又非常简单。一些示例包括XML/VM、PhoneGap和Titanium。Titanium支持使用HTML技术来编写基于WebKit的Android浏览器。本书的第2版介绍了Titanium,但由于时间和篇幅的限制,这一版不再介绍Titanium。
1.5.5 Android Service组件
**性是Android平台的一个基本部分。在Android中,**性贯穿应用程序生命周期的所有阶段——从设计时策略考虑到运行时边界检查。第14章将详细介绍**性和权限。
第15章将介绍如何在Android中构建和使用Service,尤其是HTML
Service。这一章还将介绍进程间通信(同一设备上各应用程序之间的通信)。
基于位置的服务是Android
SDK中另一个更加激动人心的组件。SDK的这部分为应用程序开发人员提供了API来显示和操作地图,以及获取实时设备位置信息。第22章将详细介绍这些概念。
1.5.6 Android媒体和电话组件
Android拥有处理音频、视频和电话组件的API。第23章将介绍电话API。第24章将详细介绍音频和视频API。
从Android
2.0开始,Android就加入了Pico文字转语音引擎。由于篇幅所限,本书第4版去掉了文字转语音的内容。第3版包含有文字转语音API的内容。
*后但同样重要的是,Android通过创建一个XML文件来定义应用程序包,将所有这些概念融入到一个应用程序中。这个XML文件就是应用程序的描述文件(AndroidManifest.xml)。下面给出了一个示例:
Android描述文件可用于定义Activity,注册服务和ContentProvider,以及声明权限。我们在探索每种理念时将介绍关于描述文件的各种细节。
1.5.7 Android Java包
快速了解Android平台的一种方式是查看Java包的结构。因为Android源于标准的JDK发行版,所以了解受支持的内容和不受支持的内容非常重要。下面简单介绍一下Android
SDK中重要的包。
android.app:实现Android的应用程序模型。主要的类包括Application(表示开始和结束语义),以及众多与Activity相关的类、片段、控件、对话框、提醒和通知。本书将介绍这些类中的大部分。
android.app.admin:为企业管理者等人员提供设备控制功能。
android.accounts:包含管理各种账户的类,如谷歌及Facebook等。主要的类有AccountManager和Account。本书将在第30章介绍联系人API时对这个API进行简单介绍。
android.animation:包含所有新的特性动画类。第21章将对这些类进行详细介绍。
android.app.backup:包含可以在更换设备时使用的应用程序备份和数据恢复功能类。
android.appwidget:包含首页小部件功能类。第25章和第26章将对这个包进行详细介绍。注意,提到首页小部件时,也包括基于列表的小部件。
android.bluetooth:提供一些类来处理蓝牙功能。主要的类包括BluetoothAdapter、Bluetooth-
Device、BluetoothSocket、BluetoothServerSocket和BluetoothClass。可以使用Bluetooth-
Adapter控制在本地安装的蓝牙适配器。例如,可以启用它、禁用它和启动发现流程。BluetoothDevice表示所连接的远程蓝牙设备。两个蓝牙套接字用于在设备之间建立通信。Bluetooth类表示所连接的蓝牙设备的类型。
android.content:实现ContentProvider概念。ContentProvider将数据访问从数据存储中抽象出来。这个包还实现了一些围绕Intent和Android
URI(Uniform Resource Identifiers,统一资源标识符)的核心理念。本书第4版将讲解这些内容。
android.content.pm:实现与包管理器相关的类。包管理器知道各种权限、安装的包、安装的提供程序、安装的服务、安装的组件(比如Activity)和安装的应用程序。
android.content.res:用于访问结构化和非结构化资源文件。主要的类包括AssetManager(面向结构化资源)和Resources。该包中的一些类在本书第3版中有所介绍。
android.database:实现抽象数据库的理念。主要的接口是Cursor接口。该包中的一些类在本书第4版中有所介绍。
android.database.sqlite:实现android.database包中的概念,该包将SQLite用作物理数据库。主要的类包括SQLiteCursor、SQLiteDatabase、SQLiteQuery、SQLiteQueryBuilder和SQLiteStatement。但是,大部分交互操作将会与抽象android.database包中的类进行。
android.drm:与DRM相关的类。
android.gesture:此包包含处理用户定义的手势所需的所有类和接口。主要的类包括Gesture、GestureLibrary、GestureOverlayView、GestureStore、GestureStroke和GesturePoint。Gesture是GestureStrokes和GesturePoints的集合。手势都收集在GestureLibrary中。手势库存储在GestureStore中。手势都具有名称,这样可以将其标识为动作。该包中的一些类在第27章中有所介绍。
android.graphics:包含类Bitmap、Canvas、Camera、Color、Matrix、Movie、Paint、Path、Rasterizer、Shader、SweepGradient和TypeFace。
android.graphics.drawable:实现绘制协议和背景图像,支持可绘制对象动画。
android.graphics.drawable.shapes:实现各种形状,包括ArcShape、OvalShape、PathShape、RectShape和RoundRectShape。
android.hardware:实现与物理照相机相关的类。照相机指的是照相机硬件,而android.
graphics.Camera表示一种图形概念,与物理照相机完全无关。
android.hardware.usb:使你能够对Android的USB设备讲话。
android.location:包含类Address、GeoCoder、Location、LocationManager和LocationProvider。Address类表示简化的XAL(Extensible
Address
Language,可扩展地址语言)。GeoCoder可用于获取给定地址的纬度/经度坐标或给定纬度/经度坐标处的地址,反之亦然。Location表示纬度/经度。该包的一些类将在第22章中有所介绍。
android.media:包含类MediaPlayer、MediaRecorder、Ringtone、AudioManager和FaceDetector。MediaPlayer支持流媒体,用于播放音频和视频。MediaRecorder用于录制音频和视频。Ringtone类用于播放可用作铃声和提示音的短声音片段。AudioManager负责控制音量。可以使用FaceDetector在位图中检测人脸。该包中的一些类会在第24章中有所介绍。
android.media.audiofx:提供音频处理类。
android.media.effect:提供视频处理类。
android.mtp:提供照相机和音乐设备的交互类。
android.net:实现基本的套接字级网络API。主要的类包括Uri、ConnectivityManager、LocalSocket和LocalServerSocket。这里需要注意,Android在浏览器级和网络级提供了HTTPS支持。Android还支持在其浏览器中使用JavaScript。
android.net.rtp:支持流媒体协议。
android.net.sip:支持VOIP。
android.net.wifi:管理Wi-Fi连接。主要的类包括WifiManager和WifiConfiguration。WifiManager负责列出已配置的网络和目前处于活动状态的Wi-Fi网络。
android.net.wifi.p2p:通过Wi-Fi Direct支持P2P网络连接。
android.nfc:支持设备的近距离交互,实现无触控交易,如销售柜台的信用卡处理。
android.opengl:包含围绕OpenGL ES 1.0和2.0操作的实用程序类。主要的OpenGL ES类在来自JSR
239的一组不同的包中实现。这些包是javax.microedition.khronos.opengles、javax.microedition.khronos.egl和javax.microedition.khronos.nio。这些包都是围绕OpenGL
ES的Khronos实现的瘦包装器,是使用C和C++编写的。
android.os:表示可通过Java编程语言访问的操作系统服务。一些重要的类包括BatteryManager、Binder、FileObserver、Handler、Looper和PowerManager。Binder类支持进程间通信。FileObserver监视对文件的更改。Handler类用于运行与消息线程有关的任务,Looper用于运行消息线程。
android.preference:使应用程序能够让用户以统一的方式管理它们针对该应用程序的**项。主要的类包括PreferenceActivity、PreferenceScreen和各种由**项派生出来的类,比如CheckBoxPreference和SharedPreferences。该包中的一些类将在第13章和第25章有所介绍。
android.provider:包含一组附加到android.content.ContentProvider接口的预先构建的ContentProvider。ContentProvider包括Contacts、MediaStore、Browser和Settings。这一组接口和类存储底层数据结构的元数据。该Contracts
Provider包中的很多类都将在第30章介绍。
android.sax:包含一组**的SAX(Simple API for
XML,XML简单API)解析实用程序类。主要的类包括Element、RootElement和许多ElementListener接口。
android.speech*:提供从文本到语音转换的支持。主要的类是TextToSpeech。获取文本后,可以请求此类的一个实例对要转换为语音的文本进行排队。例如,可以使用大量回调来监控语音何时结束。Android使用来自SVOX的Pico
TTS(Text to Speech,文本到语音转换)引擎。
android.telephony:包含类CellLocation、PhoneNumberUtils和TelephonyManager。Telep-
honyManager可用于确定手机位置、电话号码、网络运营商名称、网络类型、电话类型和SIM(Subscriber Identity
Module,用户身份模块)序列号。该包中的一些类将在第23章中介绍。
android.telephony.gsm:可用于根据基站来收集手机位置,还包含负责处理SMS消息的类。这个包名为GSM,是因为全球移动通信系统是*初定义SMS数据消息标准的技术。
android.telephony.cdma:提供对CDMA电话的支持。
android.test、android.test.mock、android.test.suitebuilder:这些是为Android应用编写单元测试的包。
android.text:包含文本处理类。
android.text.method:提供为各种控件输入文本的类。
android.text.style:为各种文本提供多种样式设置机制。
android.utils:包含类Log、DebugUtils、TimeUtils和Xml。
android.view:包含类Menu、View、ViewGroup以及一系列监听器和回调。
android.view.animation:提供对补间动画的支持。主要的类包括Animation、一系列动画插值器,以及一组特定的动画绘制类,包括AlphaAnimation、ScaleAnimation、Translation
Animation和RotationAnimation。该包中的一些类将在第21章中讲解。
android.view.inputmethod:实现输入方法框架架构。
android.webkit:包含表示Web浏览器的类。主要的类包括WebView、CacheManager和CookieManager。
android.widget:包含通常派生自View类的所有UI控件。主要的部件包括Button、Checkbox、Chronometer、AnalogClock、DatePicker、DigitalClock、EditText、ListView、FrameLayout、GridView、ImageButton、MediaController、ProgressBar、RadioButton、RadioGroup、RatingButton、Scroller、ScrollView、Spinner、TabWidget、TextView、TimePicker、VideoView和ZoomButton。
com.google.android.maps:包含类MapView、MapController和MapActivity,它们在本质上是处理谷歌地图所需的类。
以上是一些重要的特定的Android包。从这个列表可以看到Android核心平台的深度。
说明 总体而言,Android Java API包含50多个包和1000多个类,并且每一版的数量在不断增加。
此外,Android还提供了java.*命名空间中的许多包。它们包括awt.font、beans、io、lang、lang.annotation、lang.ref、lang.reflect、math、net、nio、nio.channels、nio.channels.spi、nio.charset、security、security.acl、security.cert、security.interfaces、security.spec、sql、text、util、util.concurrent、util.concurrent.atomic、util.
concurrent.locks、util.jar、util.logging、util.prefs、util.regex和util.zip。
Android还包含javax命名空间中的以下包:crypto、crypto.spec、microedition.khronos.egl、microedition.khronos.opengles、net、net.ssl、security.auth、security.auth.callback、security.auth.
login、security.auth.x500、security.cert、sql、xml和xmlparsers。
除了这些以外,它还包含来自org.apache.http.*的许多包以及org.json、org.w3c.dom、org.xml.
sax、org.xml.sax.ext、org.xml.sax.helpers、org.xmlpull.v1和org.xmlpull.v1.sax2。总而言之,无数的包为针对手持设备编写应用程序提供了一个功能丰富的计算平台。
1.6 利用Android源代码
Android文档在许多地方比较欠缺。Android源代码可用于填补这些空白。
Android及其所有项目的源代码由Git源代码控制系统管理。Git(http://git.scm.com/)是一个开源的源代码控制系统,旨在迅速、方便地处理各种规模的项目。Linux内核和Ruby
on Rails项目也依赖于Git进行版本控制。
Android源代码分布明细介绍见http://source.android.com。2008年10月左右,源代码正式开源。开放手机联盟的目标之一是使Android成为完全定制的免费移动平台。
1.6.1 在线浏览Android源代码
在Android
4.0之前,Android源代码发布在http://android.git.kernel.org/上。Android现在托管在独立的Git网站https://android.googlesource.com上。然而,在本书编写时,源代码还不支持在线浏览。网上有传言说很快就会支持在线浏览。
另一个访问量比较大的Android源代码在线浏览网站是www.google.com/codesearch/p?hl=
en#uX1GffpyOZk/core/java/android/。
然而,有传言称代码搜索项目可能很快就会关闭。 即使不会关闭,这个网站也无法搜索到Android
4.0的代码。例如,在这里无法找到新的联系人API。
另一个有用的网站是www.grepcode.com/search/?query=google+android&entity=project。
这里似乎有一个Android 4.01分支。
希望这些网站继续发布*新代码,这样我们就能够在线浏览源代码。
1.6.2 使用Git下载Android源代码
除此之外,我们就不得不在计算机上安装Git,然后手动下载源代码。如果有Linux发行版本,可以按照http://source.android.com的文档说明下载*新源代码。
如果使用Windows操作系统,那么下载源代码的过程会是一个挑战。首先,必须要安装Git,然后使用它下载想要的Android源码包。
说明 关于使用Git下载Android的研究记要见http://androidbook.com/item/3919。
1. 安装Git
使用下面的URL在Windows上安装msysGit软件包:
http://code.google.com/p/msysgit/downloads/list。
在安装完成之后,文件系统上会出现一个目录:C:\git(假设安装在c:\中)。
2. 测试Git安装
其中关键的目录是C:\git\bin。使用下面的命令来复制一个公共库,可以测试Git是否安装成功:
git clone git://git.kernel.org/pub/scm/git/git.git。
这条命令可以将库复制到本地硬盘。
3. 下载Android源码库
运行以下命令,来看一下有多少个Android Git源码库:
git clone https://android.googlesource.com/platform/manifest.git。
这条命令会下载目录manifest,查找文件manifest\default.xml。
这个文件中记录了多个Android源码库名称。下面从该文件截取的内容:
这个关于Android4.0的文件的完整内容已经上传到http://androidbook.com/item/3920,我们已经贴出了文件目录,以供浏览一下。记住,这个文件没有更新到*新版本。
现在,执行下面的命令,就可以获得基础包android.jar的源代码:
git clone https://android.googlesource.com/platform/frameworks/base.git。
采用相同的逻辑,执行下面的命令,可以获得联系人组件的源码包:
git clone
https://android.googlesource.com/platform/packages/providers/ContactsProvider。
1.7 本书的示例项目
本书包含许多能够正常执行的示例项目。各章末尾都有一节“参考资料”,其中包含本章示例项目的下载地址。所有这些示例项目都可以从以下地址下载:
http://androidbook.com/proandroid4/projects。
如果在下载或编译项目时遇到问题,请通过电子邮件satya.komatineni@gmail.com或davemac327@
gmail.com与我们联系。
我们将持续更新本书的支持网站androidbook.com。如果能够帮助读者进一步学习Android,我们乐意为之。
1.8 小结
在本章中,我们希望激发你对Android的好奇。如果你是Java程序员,这正是从这个令人激动、功能强大的通用计算平台获益的**机会。请阅读本书剩余内容,来系统及深入地理解Android
SDK。