Pro Android 4 第一章 Android 开发平台介绍

来源:互联网 发布:f1ash动画制作软件 编辑:程序博客网 时间:2024/05/16 05:16
     当今这个时代,计算比以往任何一个时代都距离人们更近。各种手持设备已经变身为计算平台。无论是平板和是手机,移动设备凭借其强大的通用计算能力,已经成为真正意义上的个人电脑(PC)。所有的传统计算机厂商已经开始生产各式各样的基于Android操作系统的设备。关于操作系统、计算平台、编程语言与开发框架的战役已经转移到移动设备之上。

     随着越来越多的IT应用转向移动端,我们看到移动编程的浪潮已经到来。通过学习本书,你可以学会如何将已有的Java知识转移到开源的,专门为智能手机和平板设计的google Android平台。相关介绍可参看google网站:http://developer.andoid.com/index.html

     注:Android作为一个高级的基于Java平台,使用了很多新的框架设计模式,尽管由于手机平台的限制,但这一切依然足以令人兴奋。

     本章,我们会大致介绍一下Android平台及其开发工具SDK,简要介绍一些关键包(package)以及本书概要。我们会指导你如何利用Android的源代码,从而更好的在Android平台下进行开发。

     为新型个人电脑打造的新的平台

     Android平台秉持为手持设备通过通用计算功能的理念。Android基于Linux操作系统进行设备、内存和进程的管理,提供的Java库涵盖了电话、视频、语音、图像、连接、UI编程等各个方面。

     注:尽管Android是为手持设备而设计,但是却显示出全方面的桌面编程特点。为此,google提供的软件编程套件SDK,我们称之为Android SDK。通过此套件进行开发,你鲜有为手机编程的感觉,因为你所接触的类库都是你在客户端或服务器编程所使用过的,甚至还又一个关系型数据库。

     Android支持Java SE大部分特性,不过AWT和Swing除外。取而代之的是Android扩展的更为先进的UI框架。既然我们在使用Java进行编程,那么你肯定会想到必然又一个Java虚拟机JVM来负责解释运行时java字节码。java虚拟机能够提供必要的优化,尽可能使java程序的运行效率接近c和c++。Adnroid针对手持设备必然面临的限制:如内存、处理器速度和电池等问题,对java 虚拟机进行了优化。该虚拟机也叫做Dalvik VM。后面章节“深入研究Dalvik 虚拟机”我们会进一步对此进行描述。
 
     注:由于使用了人们所熟悉而又简单的java语言作为开发语言,加之Android自带的类库,使得Android平台相当具有竞争力。
 
     图1-1描述了Android的软件结构,后面我们会详细的描述。
 
     


     Android的早期历史

      智能手机使用的操作系统格式各样,有塞班、微软的Windows Phone、Linux、Iphone OS(基于Mac OS X), Moblin(基于Intel)等。目前为止,还没有任何一个操作系统可以作为事实上的标准。可用的Api和环境限制性太强,而且远远落后于客户端开发。与此相反,Android提供了一个开放的、有能力的、源代码公开的、更重的是一个高端的、一站式的、可持续的开发框架。

     google于2005收购了Android 股份有限公司进行Android 平台的开发。该公司的关键成员包括Andy Rubin、Rich Miner, Nick Sears 和 Chris White。


      2007年11月,Android SDK作为"early look"版本发布。2008年9月T-Moblie发布了第一款基于Android平台的手机G1.从那时开始,我们已经可以看到2.0、 3.0、 4.0等SDK的发布,差不多每年发布一个版本。运行Android的手机,从无到有,呈澎湃之势。

     Android的一个主要目标是使应用程序之间能够进行通信,并且复用部分组件。可复用的组件不仅仅包括Service,而且还有数据Data和用户接口UI。
     
    Android的特性可以很好的支持云计算,并通过在本地存储数据使用户获得更好的体验,因此Android已经获得了一批早期的支持者,并且为开发者提供信心。而Android支持关系型数据库的特性也为其带来不少支持者。

     2008年发布的1.0和1.1版Android并不支持虚拟键盘,只支持物理按键。2009发布的1.5版解决了这个问题,同时引入了一些新的特性,例如先进的媒体录音技术、桌面小插件以及在线文件夹等。

     2009年9月发布的android 1.6以及10月份发布的android 2.0,及时在2009年的圣诞季引起Android设备的购买狂潮。同时新的版本还提供了先进搜索技术以及语音合成技术。

     在Android 2.3中引入的重要特性包括:由管理员账户远程擦除保密数据,可以在暗处拍摄照片和视频,wifi热点,显著的性能提升,改进的蓝牙功能,可以选择在外部sd卡安装应用,支持opengl es 2.0,改进的备份和搜索功能,支持信用卡近场通信,大大改进的手势和传感器(类似wii)支持,视频通话以及改进的Android市场。

     Android3.0主要支持平板电脑和双核处理器,例如NVDIA的Tegra 2.主要特性包括支持更大尺寸的屏幕。引进了一个重要的概念--Fragment。Fragment成为3.0的主要体验。提供更加类似于客户端的特性,比如Actionbar和拖曳功能。主屏的桌面小部件功能显著增强,提供更多的UI控件。在3D方面,通过渲染脚本RenderScript进一步增强了opengl 对ES 2.0的支持。对于平板来说,无疑是令人激动的功能。
     
     然而,Android 3.0仅仅支持平板,其发布的同时,Android 2.x依然支持手机,而3.0支持平板。从Android 4.0开始,google将两者合二为一。对于手机用户而言,主要的ui区别在于平板的UI体验带到了手机之上。

     Android 4.0的主要用户体验如下:
     在高分辨率的设备上提供一个新的名为Roboto的清新界面。
     在主界面提供更好的组织应用图标的方法。
     能够将应用拖进主屏底部托盘中,永远位于设备底部。
     优化的通知显示方式。对于小屏幕的设备,通知出现在顶端,对于大尺寸的设备,通知出现在底部。
     能够改变大小,并且可以滚动的桌面小插件Widget。
     多种解锁方式。
     拼写检查功能。
     改进的语音输入功能,并提供“speak continuously”选项
     提供更多的网络数据的控制方法
     提供改进的电话本,其具有个人分析功能。
     增强的日历功能。
     更为强大的照相功能:连续对焦,零延时拍摄,人脸识别,触摸对焦以及照片编辑器。
     实施显示照片和视频的傻瓜效应(Live effects on photo and video for silly effects)
     以更便捷的方式进行手机截屏的分享。
     浏览器性能提高两倍。
     改进的电子邮件。
     为NFC近场通信提供了一个新的概念--Android beaming
     支持wifi直连,从而概念机P2P服务。
     提供蓝牙医疗设备配置文件。
     Android 在开发支持方面的改进主要包括:
     提供基于对象(包括view)可变属性的动画效果。(Revamped animation based on changing properties of objects including views)。
     提供固定数量的基于列表的widget行为(Fixed number of list_based widget behaviors from 3.0)
     更加成熟的,同时集成了搜索功能的ActionBar。
     提供对更多手机标准的支持:Advanced Audio Distribution Profile(A2DP:可以使用外部扬声器),Realtime trasport Protocol RTP:ip层的音视频流播放。Media Transfer Protocal(MTP), Picture fast Protocol(PTP:通过连接电脑下载图片和媒体文件)和Bluetooth Headset profile(蓝牙耳机配置文件HSP)
     Full device encryption:全文件加密?
     数字版权管理。(DRM)
     存储和密码加密。
     社会化接口(social apis)
     增强的日历接口。
     语音邮件接口。

     深入理解Dalvik 虚拟机

     作为Android的一部分,google一直致力于为低功耗的手持设备提供更好的优化设计。手持设备在内存和速度上落后于桌面设备8到10年,同样电池也是其短板。因此,手持设备的运行性能的要求也变的极为苛刻,这就需要手机应用设计者对各方面进行优化。以Android目录下的package为例,这种设计相当有特色并且运用广泛。
     上述特征促使google重新设计了java 虚拟机的实现方式。Google的一位关键人物Dan Borstein重新实现了JVM,并以冰岛的一座塔的名字Dalvik对其命名。Dalvik虚拟机将java生成的java文件组成成一个或多个Dalvik可执行的文件(Dalvik executable files, .dex).Dalvik 虚拟机的最终目标是尽一切可能在空间、性能和电池使用时长等方面对JVM进行优化。

     最终Android上可以执行的文件并不是java字节码,而是dex文件。这也就意味着你不能直接执行java的字节码,而是要把java的class文件转换为.dex文件。

     深入理解Android的软件结构

     我们已经简要介绍了Android 的发展史以及包括dalvik在的内的一些优化,我们意识到我们还可以使用java的堆栈(???)。本章我们将介绍Android开发相关内容。图1-3就从开发者的角度展示了Android的软件层次结构。

      Android平台的核心是Linux内核,负责设备驱动、资源获取,电源管理以及其它的一些操作系统相关职责。提供的设备驱动包括显示器、键盘、相机、wifi、闪存、音频以及进程间通信。尽管内核是Linux,但是大部分的内容均是通过java进行开发,并运行在Dalvik虚拟机上。

     内核的上一个层次是一些c/c++库,包括OpenGL、Webkit、FreeType、Secure Sockets Layer(ssl),运行时c库(libc),SQLite和多媒体相关内容。基于BSD的c语言库,通过剪裁(大约一半左右),更加适合嵌入式Linux设备。多媒体库基于packet  video(pv)公司的openCore。(4.0以后不再使用openCore而是使用stagefright)。该库用来进行音视频的播放。Surface Manager用来管理2D和3D显示。
    
     注: 以上介绍的核心库有可能发生变化,因为这些仅仅是内部实现,并未将接口暴露给用户。我们介绍这些仅仅是告诉你Android的底层特性。更详细的内容可以参考Android开发网站。

     Webkit的主要功能是支持浏览器,该库与google的Chrome和Apple的safari内核相同。FreeType是用来进行字体支持。
SQLite是一个嵌在Android中的关系型数据库,它是一个开源的数据库,并未与Android进行绑定,因此你可以使用其它的为Android SQLite开发的工具。

     大多数应用层的framework通过Dalvik虚拟机来访问这些核心库,因此Dalvik VM类似于Android平台的防火墙。如前所言,Dalvik VM被优化为可以运行多个实例。每个java应用程序通过各自的Dalvik VM来访问这些库。

     Android的java api包括电话、资源、位置、用户界面、内容提供者(content provider)、包管理器(包括安装、安全等)。开发者为终端用户开发的应用正是基于这些java的api,比如桌面、联系人、电话和浏览器等。

     Android又一个google定制的2D图像库,叫做Skia,由c和c++编写而成。同时,skia也是google的chrome浏览器的核心部分。Android的3D接口基于openGL ES(www.khronos.org)。openGL ES 是opengl的子集,专门为嵌入式系统定制。

     多媒体方面,android支持大多数音频、视频和图片的通用格式;无线通讯方面android api支持蓝牙、EDGE、wifi、GSM、3G,当然最终取决于手机的硬件。

     通过Androd SDK开发应用

     本章节,将会介绍开发一个应用所用到的高层的api,我们会快速的介绍一下Android的模拟器,组成模块、UI编程、服务(service)、视图(View)、电话、动画等内容。

     Android 模拟器

     Android SDK作为eclipse的一个插件提供,名为ADT。用户可以用这个集成开发环境(IDE)进行开发、调试以及测试。(第二章我们会深入讲解ADT)。当然,也可以使用命令行工具进行开发。这两种途径都提供了一个模拟器来进行开发、调试以及测试。应用开发中90%的内容无需真机即可进行。全功能的模拟器可以模拟手机的绝大多数功能。其缺陷在于USB连接、拍照和录制视频、耳机、电池分析、蓝牙、wifi,NFC以及openGL ES 2.0.

     Android的模拟器是基于一个开源的处理器模拟科技(QEMU),由Fabrice Bellard开发。(www.wiki.qemu.org/index.html)。这是一项可以让一个操作系统运行在其他操作系统之上,而无需关注处理器的模拟技术。QEMU可以模拟到CPU的级别。

     Android的模拟器的处理器是ARM处理器,而ARM处理器是基于精简指令集的(RISC).模拟器通过模拟的处理器来运行Android的linux版本。
     
     对于手持设备以及其他一些嵌入式设备,低功耗是相当重要的,因此ARM得到了广泛的应用。大多数手机采用的都是ARM处理器。

     通过http://developer.android.com/guide/developing/tools/emulator.html可以查看更多关于浏览器的详细信息。

     Android UI编程

     Android的ui框架与其他的桌面框架类似。事实上,Android UI框架更为现代,而且更具异步特色。如果说微软的以C语言为基础的框架作为第一代,以c++为基础的MFC作为第二代,以java为基础的swing框架作为第三代的话,那么Android的UI框架可以称之为第四代UI,远比MFC更具灵活性。这个全新的第四代UI框架引入了Android UI, JavaFX, Microsoft silverlight、Mozilla xml用户接口语音(XUL)。

     进行Android UI开发,需要在xml文件里声明接口,然后再加载这些xml文件,作为应用的窗口。这与基于html的网页相当类似。就像在html一样,你可以通过编写java代码,使用不同控件的id来对其进行操作。

     甚至就连菜单也是通过xml文件进行加载。在Android中,屏幕或者窗口是以activity的方式实现,其中集成了多种视图。用户通过处理这些视图,来实现最终的逻辑。视图View是Adnroid ui中最基本元素,多个视图可以组成视图组(view groups)
     
     视图的内部使用的是大家已经熟悉的元素,如canvas、painting、和其它的ui元素。Activity其实就是一个逻辑上的可以替换的UI组件,用来管理view和view group。
     
     Android 3.0引入了fragment的概念,可以使开发者在平板上更好的对view进行分块以便更好的显示。平板有足够的大的空间来显示activity的多个子视图,而fragment就是这些子视图的抽象。

     Android framework的核心之一就是activity的生命周期管理,只要遵循规定的协议,操作系统就可以自动管理activity隐藏、暂停、保存等状态。后面介绍Android开发环境时,会进一步介绍。

     Android的基本组件

     Android的ui框架和其它很多部分都依赖于一个新的概念Intent,其可以在Android进程内与进程间唤醒其它组件。

     组件的概念就是Android内部一个已经定义好生命周期的一小段代码。Android应用程序中用来提供一个显示窗口的Activity就是一个组件。在Android进程中运行的、为其它client提供服务的service也是一个组件。用来接收时间的receiver也是一个组件。

     就唤醒系统组件的角度来说,Intent的功能特性与视窗消息windowing message,动作actiocns,发布于订阅模型publish-and-subscribe model,进程间通信interprocess communication类似。下面是通过Intent启动浏览器的方法:
     
     

     本例中,我们通过Intent让系统启动一个合适的窗口来显示网页。Android会选用一个合适的浏览器(取决于已经安装的浏览器)来打开该网页。

     Android支持多种资源(resources),例如String, bitmap和一些其它看似不太常见的基于xml的视图(例如html)。Android Framework通过特别的方法来使用这些资源,因此其使用方法是非常简单的。下面的示例显示resources里定义的资源id是如何自动生成的:

public final class R {
    public static final class anim {
        public static final int progress_round=0x7f040000;
        public static final int umeng_socialize_fade_in=0x7f040001;
        public static final int umeng_socialize_fade_out=0x7f040002;
        public static final int umeng_socialize_slide_in_from_bottom =0x7f040003;
        public static final int umeng_socialize_slide_out_from_bottom =0x7f040004;
    }
    public static final class array {
        public static final int UMageList=0x7f0b0000;
        public static final int UMgenderList=0x7f0b0001;
    }
。。。。
}

     所有自动生成的ID都与一个xml文件中的元素或者整个xml元素相绑定。所以你可以在任何地方只通过生成的id来使用这些xml定义的内容。通过这种间接引用,可以在多语种、多屏幕尺寸的支持方面起到重要作用。(第三章会仔细讲解R.java和resources)
     
     Android中另一个新的概念就是content provider。content provider是对数据的一种抽象,用以提供数据共享功能。content provider是android开发中一个非常重要的工具,其底层为SQLite 数据库。我们会在第四章进行介绍。第三、四、五章我们将会看到intent、resources和content provider是如何使Android更具有开发特质的。

     更加高级的UI概念

     基于xml的页面布局(类似于html的view page)在Android的UI系统中起着相当重要的作用。我们通过下面的例子来看一下如何使用xml定义一个简单的只含有一个TextView的布局的。

            

          使用时需要在activity中引用自动为sample_page1生成的id来显示布局。(第6章会具体介绍)Android支持各种菜单,包括普通菜单和context菜单。(第7章介绍)你会发现在Android中使用菜单是非常容易的,因为菜单也是通过xml定义的,而且菜单元素的id也是自动生成的。下面的例子显示如何在xml里定义一个菜单。

     

     Android还支持对话框dialog。所有的dialog都是异步的。这就对那些已经习惯了在某些视窗框架中使用同步dialog的开发者带来了一定的挑战。我们会在第9章详细介绍。

     Andriod支持多种动画效果。有三种基本的方式来说实现动画。你可以使用frame-by-frame动画,也可以通过view的转换矩阵(tranformation matrix),改变位置、大小、旋转和透明度来实现渐变tweening动画。另外,你还可以通过改变对象的属性来实现tweening动画。这种基于对象属性的动画是在3.0版本引入的,是最具弹性、推荐使用的实现动画方式。所有的动画效果在21章介绍。

     另外,Android允许在xml文件中定义这些动画效果。下例中就展示了通过播放一系列的图片来实现frame-by-frame动画效果。

           

     Android实现了openGL ES 1.0和2.0标准,从而可以支持3D图像。openGL ES与openGL类似,都是基于c语音的平台api。由于Android SDK提供的基于java的api,因此需要通过java binding来引用OpenGL ES。Java ME 早已经通过jsr 239(java specifaction request)定义了java binding,而Android也是用的同样的java binding。如果你不熟悉openGL编程,学习起来会比较困难,本书第四版并未介绍相关内容,不过在第三版中我们已经用了100多页的篇幅进行阐述。

     Android围绕通过指尖操作桌面的动作提出了很多新的概念。第一个就是live folders。通过live folder,你可以用一个文件夹来讲不同的元素集合在一起。而集合中的元素会根据底层数据的改变而变化。这些底层的数据可以是设备本身提供,也可以是从网络处获取。篇幅有限,我们未能在第四版中介绍live folder。不过,第三版中已经包含了相应的扩展。

     第二个基于桌面的概念就是桌面小插件。桌面小插件通过一个UI插件来在桌面显示信息。显示的内容可以定期更新。e-mail插件就是一例。我们在25章介绍widget。从3.0开始,widget可以支持Listview,并且能够随数据变化而更新。这些改进会在26章介绍。

     集成的搜索框是第三个新的概念。通过集成的搜索框,不但可以搜索本地信息,同时可以搜索网络信息。Android的搜索框已经超越了一般意义上的搜索,它允许用户通过搜索控制发出命令。(fire off commands through the search control)。通用,篇幅有限,本书不做解释,详情可以参考第三版。

     Android同样支持触摸及手势。通过gestrue你可以记录任何触摸动作。然后这些gesture可以被应用程序设置为特定的动作。我们在27章介绍触摸和手势相关内容。

     传感器已经成为手机的重要组成部分,我们会在29章具体介绍。

     由于手机可以动态的改变自身的状态,因此要求Android能够给以相应的支持。例如,可以很轻易的通过横竖屏切换,使手机视图的方向发生改变。或者把手机瞬间变成便携式电脑。Android 3.0通过引入fragment的概念可以很容易支持这些特性。第8章介绍fragment,而第12章将会介绍如何适配配置的改变。

     我们会在第10章介绍actionbar。Actionbar在Android 3.0引入,在4.0中得到了很大的增强。

     drag-and-drop是Adnroid 3.0中为平板引入的特性,4.0中手机也可以使用该特性。我们会在28章进行介绍。

     手持设备正广泛的接入互联网。而网络请求中重要的一点就是避免ANR(Application not response)错误。我们会在第18章具体介绍如何进行异步操作。

     除了 Android SDK,还有很多其他独立的发明时软件开发更加刺激和简便。例如:XML/VM, PhoneGap和Titanium。其中Titanium允许使用html编写基于webkit的android浏览器。我们在第二版介绍过Titanium,处于篇幅限制,本版将不再介绍。

     Android的service组件
     
     Android平台的一个基石之一就是安全。在Android中,安全贯穿着整个应用的生命周期,从设计时的策略到允许时边界校验。我们会在第14章介绍安全及权限相关内容。

     15章中,我们会介绍如何创建和使用一个service,特别是HTTP service。同时,会介绍如何进行进程间通信(同一设备上不同的应用之间进行通信)。

     LBS(Location base service)是android的另一个令人兴奋的组件。SDK提供了api来显示并使用地图,同时能够获取设备的实时位置。我们会在第22章介绍相关细节。

     Android的多媒体和电话组件

     Android提供音频、视频和通话的api。第23章会介绍通话的api,第24章会介绍音频和视频的api。

     从2.0版本开始,Android集成了Pico Text-to-Speech 引擎。本书的第三版进行了介绍,本版不再介绍。

     最后但并非不重要的是,Android通过定义一个xml文件来将整个应用的组件整合到一起。这个xml文件就是AndroidMenifest.xml。例如:

     

     Activity在此文件中定义,而service和content provider在其中注册,所需权限也在其中声明。具体的细节会贯穿本书始终。
     

     Android Java Package

     通过Android中的java包可以快速的对Android的结构有一个大致的认识。因为Android与java 标准的jdk发布版本有所不同,所以研究Android支持哪些内容,不支持哪些内容很有必要。下面是Android SDK所包含的重要的java包:

     android.app:用来实现Android的应用模型。主要的类报刊Application,用来表示应用的开始和结束。还有一些与Activity相关的类,比如fragment、dialog、controls、alerts和notifications。这些类将会贯穿本书始终。

     android.app.admin:提供管理权限,使人们对设备使用权限进行控制,类似于企业管理员。

     android.accounts:账号管理,提供了一些来来管理类似于google、facebook的账号。主要的类报刊AccountManager和Account。我们在第30章讨论联系人模块时会对此进行简要介绍。

     android.animation:提供所有的动画类,21章会具体介绍。

     android.app.backup:当用户更换手机时,为用户的应用程序提供hook,来备份、存储用户的数据。

     android.appwidget:提供桌面小部件的相关功能。我们在25章和26章会具体分析,当然也包括基于列表的widget。

     android.bluetooth:提供与蓝牙通信相关类,主要类包括:bluetoothAdapter、BluetoothDevice、BluetoothSokect、BluetoothServerSocket和BluetoothClass。你可以通过BluetoothAdapter来控制本地已经安装的蓝牙适配器。例如你可以打开、关闭、寻找蓝牙设备。BluetoothDevice代表着远端与你相连接的蓝牙设备。而这两个Socket类用来使两个蓝牙设备建立连接。而BluetoothClass会包含与你相连接的蓝牙设备的相关信息。

      android.content:实现content provider。而content provider是数据访问和存储的抽象。同时,还实现了Android的核心概念:intent以及统一资源定位符--Uris。这些类会在第四章介绍。

     android.content.pm:实现包管理器相关类。包管理器可以获取应用权限、已安装包、已安装的content provider、services和activity等组件、已安装应用等信息。

     android.content.res:提供结构化的和非结构化的资源的访问。主要类包括AssetManager(用于非结构化资源)和Resources。其中一些类会在第三章介绍。

     android.database:提供了抽象数据库的实现。主要的类是Cursor接口。包中的一些类将会在第4章介绍。

     android.database.sqlite:以SQLite作为实体数据库来实现android.database包中的相关抽象,主要类有SQLiteCursor、SQLiteDatabase、SQLiteQuery、SQLiteQueryBuilder和SQLiteStatement。然而,你大部分的接口还是要和android.database中的类进行交互。

     android.drm:android中的数字版权保护相关内容。

     android.gesture:负责管理所有与用户自定义手势相关的类。主要的类包括Gesture、GestureLibrary、GestureOverlayView、GestureStore、GestureStroke和GesturePoint。Gesture其实就是一系列GestureStroke和GesturePoints的集合。Gestures由存储在GestureLibrary里,而GestureLibrary又存储在GestureStore里。Gestures已被命名,这样可以作为Action进行识别。其中一些类在27章会介绍。

     android.graphics:包含的类有Bitmap、Canvas、Camera、Color、Matrix、Movie、Paint、Path、Rasterizer、Shader、SweepGradient和TypeFace。

     android.graphics.drawable:实现绘画协议以及背景图片,允许drawable 对象显示动画。

     android.graphics.drawable.shapes:实现各种形状,如:ArcShape、OvalShape、PathShape、RectShape和RoundRectShape。

     android.hardware:实现物理上的Camera相关类。该Camera指的是物理上的照相机,而android.graphics.camera指的是图像层面的Camera,两者不是一个概念。

     android.hardware.usb:允许你与USB设备进行通信。

     android.location:包含类有:Address、GeoCoder、Location、LocationManager和LocationProvider。Address类表示一种简化的扩展地址语音extensive address language(XAL)。GeoCoder使你能够为经纬坐标设定一个位置。与此对应,Location可以根据一个位置返回经纬度。其中一些类在22章会具体介绍。

     android.media:包含类有MediaPlayer、MediaRecorder、Ringtone、AudioManager和FaceDetector。MediaPlayer用来播放音频和视频,同时也支持流媒体播放。MediaRecorder可以用来录制音频和视频。Ringtone类用来播放简短音频作为铃声和提示音。AudioManger用来控制音量。你可以通过FaceDetector来检查bitmap中的面部。其中一些类24章会介绍。

     android.media.audiofx:提供各种音效。

     android.meida.effect:提供各种视频效果。

     android.media.mtp:提供接口与Camera和音乐设备交互。

     android.net:提供套接字级别(socket-level)的网络连接api。主要类包括Uri、ConnectivityManager、LocalSocket和LocalServerSocket。Android在浏览器级别和网络级别支持HTTPS并在浏览器中支持JavaScript。

     android.net.rtp:支持流媒体协议。

     android.net.sip:支持VOIP
         
      android.net.wifi:管理wifi连接。主要类有WifiManger和WifiConfiguration。WifiManger用来展示已经配置好的wifi网络已经当前活动的wifi网络。

     android.net.wifi.p2p:支持wifi-direct的点对点连接。

     android.nfc:支持近距离免接触商业支付,例如信用卡刷卡业务。

     android.opengl:提供一系列工具类来支持openGL ES 1.0和openGL ES 2.0。主要实现类借用jsr239,分布在不同的包中。这些包有:javax.microedition.khronos.opengl javax.microdetion.khronos.egl 、javax.microeditons.khronos.nio。这些包是针对已经用c和c++实现的opengl es的轻量级的包装。
     
     android.os:包含了可以通过java调用的系统服务。其中一些重要的类包括:BatterryManager,Binder,FileObserver、Handler、Looper和PowerManager。Binder是一个可以运行进程间通信的类。FileObserver保存着文件变化的标签。你可以用Handler来使任务运行在消息线程上,而用Looper来启动一个消息线程。

     android.preference:允许用户用统一方式来管理应用的偏好设置。主要类包括PreferenceActivity、PreferenceScreen和各种Preference的子类,如CheckboxPreference和SharePreference。其中一些类会在13章和25章介绍。

     android.provider:包含一些已经建好的,基于android.content.ContentProvider接口的content provider。这些content provider包括Contacts、MediaStroe、Browser和settings。这些接口和类存储着内部的数据结构。我们会在第30章介绍。
     
     android.sax:包含一组高效简洁的xml的api(sax simple api for xml)。主要的类包括Element、RootElement和一些ElementListener接口。

     android.speech.*:提供文字转语音支持。最主要的类是TextSpeech。你可以传入文本文件,并请求一个实例来将文字转变为语音。当语音结束后,你有很多回调函数进行监控。Adnroid使用的是SVOX中的TTS引擎(Pico Text-to-Speech)。
     
     android.telephony:包含CellLocation、PhoneNumberUtils和TelephonyManager。TelephonyManager控制着手机定位、电话号码、网络运营商名称、网络类型、电话类型、SIM串号(Subscriber Identity Module)。其中一些类在23章介绍。

     android.telephony.gsm:可以是你通过信号塔来获取手机位置,并且发送短信。本包之所以叫做GSM,是因为gsm中最先定义了SMS的标准。

     android.telephony.cdma:为CDMA手机提供相关服务。

     android.test、android.testmock、android.test.suitbuilder:为编写android应用的单元测试提供支持。

     android.text:提供文本处理类。

     android.text.method:支持通过不同设备输入文字。

     android.text.style:为文本区域提供各种样式支持。

     android.utils:包含类有Log、DebugUtils、TimeUtils和Xml。

     android.view:包括:Menu、View、ViewGroup和一些listener和callback

     android.view.animation:为Tween 动画提供支持。主要类有Animation,一系列动画插值器和一组特别的动画类:AlphaAnimation,ScaleAnimation,TranslationAnimation和RotationAnimation。其中一些类在21章介绍。

     android.view.inputmethod:实现了input-method 框架。

     android.webkit:包含一些类来显示浏览器,主要类有WebView、CacheManager、CookieManager。

     android.widget:包含所有的UI控件,这些控件通常继承自View类。主要的控件包括:Button、Checkbox、Chronometer、AnalogClock、DatePicker、DigitalClock、EditText、ListView、FrameLayout、GridView、ImageButton、MediaController、ProgressBar、RadioButton、RadioGroup、RatiingButton、Scroller、Scrollview、Spinner、TabWidget、TextView、TimePicker、VideoView和zoomButton。

     com.google.android.maps:包含MapView、MapController和MapActivity以及一些依赖于google map的基础类。

     以上就是Android中的关键类,从这个列表中,你可以看到Android核心平台的深度。

     注:Android中的java api包含50个以上的包,1000以上的类,并且数量随着版本升级而上升。

      另外,Android提供了java包,其域名样式为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.interface, security.spec, sql, text, util, util.concurrent, util.concurrent.atomic, util.concurrent.locks, util.jar, util.logging, util.prefs, util.regex, 和util.zip。

     还有一些javax域名内的类:crypto, crypto.spec, microedition.knronos.egl, microedtion.knronos.opengles, net, net ssl, security.auth, security.auth.callback, security.auth.login, security.auth.x500, securiyt.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.xmlpul.v1.sax2。这些类一起为手持设备应用开发提供了丰富的资源支持。

     充分利用源码

     Android的说明文档还是有一点欠缺,而Android的源码则可以弥补相关空缺。

     Android的源码及其所有工程都是基于Git进行管理。Git是一套开源的源码管理系统,为大小项目提供快捷服务。Linux内核源码和Ruby on Rail工程都是基于Git管理。

     Android的版本发布细节可以通过http://source.android.com了解。源代码于2008年10月份开源。开放手持设备联盟(Open Handset Alliance)的目标之一就是创建一个免费的、高度可定制的移动平台。

     在线浏览源代码     
     
     Android 4.0以前,可以在http://android.git.kernel.org获取Android源码发布版本。而现在Android发布在自己的主页上:http://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.0.1的分支。
     我们希望这两个网站都能持续发布最新版本,这样你就能够在线阅读源码了。

     使用Git下载Android源代码
     
     如果以上方法都不行,那么你就需要安装Git工具,并通过Git下载Android的源码了。如果你使用Linux,那么就可以根据http://source.android.com的说明进行下载。
     如果你使用windows,那么就有点困难了。首先,你需要下载一个git工具,然后下载想要的Android 包。

     注:我们关于如果用git下载源码的研究可以在http://androidbook.com/item/3919找到。

     安装Git

     在http://code.google.com/p/msysgit/downloads/list中下载并安装msysGit。如果你完成安装,就会看到生成了C:\git目录(假设你安装在C:\)。

     测试Git安装效果

     其中C:\git\bin是关键路径。可以通过clone一个公共的仓库来检验git是否能正常工作:
     git clone git://git.kernel.org/pub/scm/git/git.git
     运行此命令会在你本地磁盘clone一个仓库。

     下载Android仓库(Repository)

     运行git clone https://android.googlesource.com/platform/manifest.git查看Android工程有多少个repository。运行命令后会下载一个文件夹manifest。然后找到manifest\default.xml文件。 
     (译者注:如果在git使用过程中出现SSL certificate problem: self signed certificate git问题,可以通过下面的命令解决: export GIT_SSL_NO_VERIFY=true)
     该文件里面有需要android的repository。下面是其中的两个repository:

       <project path="frameworks/base"  
            name="platform/frameworks/base" />
  <project path="frameworks/compile/libbcc" 
              name="platform/frameworks/compile/libbcc" />

     你可以在http://androidbook.com/item/3920看到android4.0的全文。我们已经上传了文档可供快速查阅,不过请牢记这并不一定是最新的文档。

     现在你就可以获得base目录下的代码了:
     git clone https://android.googlesource.com/platform/frameworks/base.git

     同样,你可以可以通过下面方式获取联系人provider的代码:
     git clone https://android.googlesource.com/platform/packages/providers/ContactsProvider 
     
     本书的示例工程
      
     本身中可以找到很多示例工程。每章末尾的参考部分附有代码的下载目录。所以的代码可以在下面地址处下载:

     http://androidbook.com/proandroid4/projects 

     如果对于下载或编译这些示例有任何问题,可以通过e-mail联系我们:satya.komatineni@gmail.com 或者davemac327@gmail.com.
 
     我们会持续将我们所学到的内容更新到androidbook.com。希望我们的努力能对您的学习有所帮助。

     总结:
      
     本章,我们想激起你对android的兴趣,如果你是一个Java程序员,你将会从这个令人激动的、非常棒的通用平台上获取相当大的益处。我们希望你能有条理、有深度的阅读本书剩余部分,以便更好的理解Android SDK。
原创粉丝点击