Android初级应用开发
上QQ阅读APP看书,第一时间看更新

1.3 技术准备

1.3.1 Android系统架构

Android系统的底层建立在Linux系统之上,该平台由操作系统、中间件、用户界面和应用软件4层组成,它采用一种被称为软件叠层(Software Stack)的方式进行构建。这种软件叠层结构使得层与层之间相互分离,明确各层的分工。这种分工保证了层与层之间的低耦合,当下层的层内或层下发生改变时,上层应用程序无须任何改变。图1-1所示为Android系统的体系结构。

Android系统平台由应用程序、应用程序框架、系统库、Android运行时,以及Linux内核5部分组成。下面详细介绍Android平台的系统结构。

图1-1 Android系统的体系结构

1.应用程序

Android平台默认包含了主要的应用程序,如电子邮件、短信、日历、地图、浏览器、联系人等,这些程序都是用Java语言来编写的,当然也可以用自己编写的软件来替代Android提供的程序。

2.应用程序框架

应用程序框架层是从事Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能的。该层简化了组件的重用,开发人员可以直接使用其提供的组件来进行快速的应用程序开发,也可以通过继承而实现个性化的拓展。

(1)Activity Manager(活动管理器):管理各个应用程序的生命周期以及通常的导航回退功能。

(2)Window Manager(窗口管理器):管理所有的窗口程序。

(3)内容提供器(Content Provider):使得不同应用程序之间存取或者分享数据。

(4)View System(视图系统):构建应用程序的基本组件。

(5)Notification Manager(通告管理器):使得应用程序可以在状态栏中显示自定义的提示信息。

(6)Package Manager(包管理器):Android系统内的程序管理。

(7)Telephony Manager(电话管理器):管理所有的移动设备功能。

(8)Resource Manager(资源管理器):提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等。

(9)Location Manager(位置管理器):提供位置服务。

(10)XMPP Service(XMPP服务):提供Google Talk服务。

3.系统库

系统库是应用程序框架的支撑,是连接应用程序框架层与Linux内核层的重要纽带。

(1)Surface Manager:执行多个应用程序时,负责管理显示与存取操作间的互动,另外也负责2D绘图与3D绘图进行显示合成。

(2)Media Framework:多媒体库,基于PacketVideo OpenCore;支持多种常用的音频、视频格式录制和回放,编码格式包括MPEG4、MP3、H.264、AAC、ARM。

(3)SQLite:小型的关系型数据库引擎。

(4)OpenGL|ES:根据OpenGL ES 1.0 API标准实现的3D绘图函数库。

(5)FreeType:提供点阵字与向量字的描绘与显示。

(6)WebKit:一套网页浏览器的软件引擎。

(7)SGL:底层的2D图形渲染引擎。

(8)SSL:在Andorid上通信过程中实现握手。

(9)Libc:从BSD继承来的标准C系统函数库,专门为基于Embedded Linux的设备定制。

4.Android运行时

Android应用程序采用Java语言编写,程序在Android运行时中执行,其运行时分为核心库和Dalvik虚拟机两部分。

(1)Core Libraries(核心库):核心库提供了Java语言API中的大多数功能,同时也包含了Android的一些核心API,如android.os、android.net、android.media等。

(2)Dalvik VM(虚拟机):Android程序不同于Java ME程序,每个Android应用程序都有一个专有的进程,并且不是多个程序运行在一个虚拟机中,而是每个Android程序都有一个Dalivik虚拟机的实例,并在该实例中执行。Dalvik虚拟机是一种基于寄存器的Java虚拟机,而不是传统的基于栈的虚拟机,并进行了内存资源使用的优化以及支持多个虚拟机的特点。需要注意的是,不同于Java ME,Android程序在虚拟机中执行的并非编译后的字节码,而是通过转换工具将Java字节码转成dex格式的中间码。

5.Linux内核

Android是基于Linux 2.6内核,其核心系统服务如安全性、内存管理、进程管理、网络协议,以及驱动模型都依赖于Linux内核。它作为硬件和软件应用之间的硬件抽象层(Hardware Abstraction Layer,HAL),使得应用程序开发人员不需关心硬件细节。但是,对于硬件开发商而言,如果想使Android平台运行到自己的硬件平台上,就必须对Linux内核进行修改,为自己的硬件编写驱动程序。

1.3.2 开发环境搭建

工欲善其事,必先利其器。在学习Android之前,首先需要安装开发工具。市场上的Android开发工具多种多样,在此使用当前大多数Android开发者所使用的工具Eclipse软件。应用此软件开发Android需用3个工具:JDK(Java开发工具包)、Eclipse(开发平台)和Android SDK(开发工具包)。

1.安装Sun JDK及配置环境变量

(1)登录Oracle公司的网站http://www.oracle.com,下载适合Windows平台的JDK版本到计算机的文件夹中,直接双击下载的JDK文件进入安装界面,按照默认配置进行安装。

(2)JDK安装成功后,还需要在Windows系统中对其进行配置。主要需要配置两个环境变量:PATH和CLASSPATH。PATH用于指定JDK命令的所在路径;CLASSPATH用于指定JDK类库的所在路径。

①右击“我的电脑”图标,选择“属性”命令,弹出“系统属性”配置对话框,选择“高级”选项卡,如图1-2所示。

②单击“环境变量”按钮,打开“环境变量”配置对话框,如图1-3所示。其中已经列出一些定义好的环境变量。在配置界面中有用户变量和系统变量两种,其中用户变量所配置的环境变量适用于某个用户,例如本例中的Administrator;系统变量所配置的环境变量适用于本机上的所有用户。

图1-2 “系统属性”对话框

图1-3 “环境变量”对话框

③单击“新建”按钮,弹出“新建用户变量”对话框,如图1-4所示。

④输入变量名PATH,变量值为C:\ProgramFiles\Java\jdk1.6.0_21\bin的用户变量,如图1-5所示(变量值的存放位置和JDK的安装目录有关,需要先查找到JDK的目录,然后再获得JDK的bin目录的完整路径)。

图1-4 “新建用户变量”对话框

图1-5 编辑用户变量

⑤单击“确定”按钮,采用第③步的操作,输入变量CLASSPATH,变量值设为.;C:\ProgramFiles\Java\jdk1.6.0_21\lib,如图1-6所示。(变量值中的“.”表示当前目录,用“;”和JDK的库目录隔开,与④步类似,注意变量值的位置同样和JDK的安装目录有关)

⑥新用户变量完成后,可看到在“Administrator的用户变量”列表中增加了两个新的变量,分别为CLASSPATH和PATH,如图1-7所示。单击“确定”按钮,完成JDK的配置。

图1-6 新建用户变量

图1-7 新建用户变量完成

2.检验安装配置

查看JDK是否安装配置成功,可在DOS环境下进行测试。

(1)进入DOS环境,选择Windows的“开始”→“运行”命令,在弹出的“运行”对话框输入cmd,单击“确定”按钮,如图1-8所示。

(2)进入DOS界面。在DOS界面中,输入java-version、javac命令,如果提示找不到命令,就说明JDK的环境变量没有正确设置。图1-9所示为使用java-version命令测试环境变量,系统所返回的JDK版本信息。

图1-8 进入DOS环境的方法

图1-9 使用Java命令测试环境变量的配置

3.安装Android SDK并创建配置虚拟机配置界面

(1)登录Android官方网站http://developer.android.com/sdk/index.html。选择Windows平台下的installer_r18-windows.exe,单击即可进行下载,下载完成后解压,以便后续开发使用。

(2)双击下载的SDK,按提示一步步安装,安装成功后使用SDK工具进行升级。打开SDK管理界面,如图1-10所示。在管理界面上列出了各种Android版本的API包,可以根据开发需要选择下载。

图1-10 选择SDK安装包

1.3.3 安装配置Eclipse ADT及Eclipse的几个常用快捷键

1.Eclipse软件下载

登录Eclipse软件下载主页http://www.eclipse.org,单击downloads按钮,选择Eclipse IDE for Java Developers选项,单击相应平台的版本软件,即可进入具体下载位置,如图1-11所示。下载完成后,解压即可使用Eclipse IDE开发软件,软件主界面如图1-12所示。

图1-11 Eclipse下载界面

图1-12 Eclipse软件主界面

2.ADT插件的安装及配置

(1)打开Eclipse IDE,选择菜单栏中的Help→Install New Software命令,打开插件安装界面,如图1-13所示。

图1-13 插件安装界面

(2)单击Add按钮,弹出对话框要求输入Name和Location:Name可随意命名,Location文本框中输入ADT(Android Developer Tools)的在线安装地址http://dl-ssl.google.com/android/eclipse,如图1-14所示。

图1-14 ADT设置界面

(3)确定返回后,在Work with框下拉列表框中选择刚才添加的ADT,会看到下面出现Development Tools,将其展开,级联选项中包括Android DDMS和Android Development Tools选项,将其选中,如图1-15所示。

图1-15 ADT安装界面

(4)按提示一步步地单击Next按钮,完成后单击Restart Now按钮,重启Eclipse。

在Eclipse中安装好ADT并重启后,下一步就是通过ADT将前面安装的Android SDK加入到Eclipse中。

(5)选择Windows中Preference命令,单击Android选项,然后单击Browse按钮,找到SDK安装目录(即之前下载安装的SDK路径),如图1-16所示。

图1-16 添加SDK界面

(6)单击OK按钮,完成向Eclipse中加入Android SDK。这样,Eclipse的菜单中即包含了SDK和AVD(Android Virtual Device)的管理命令,可以打开SDK和AVD的管理界面进行设置,分别如图1-17和图1-18所示。至此,整个Android开发环境搭建完毕。

图1-17 SDK管理界面

图1-18 Eclipse中的AVD管理界面

1.3.4 创建Android应用程序

在完成前面所介绍的平台搭建后,创建第一个Android项目。

(1)打开Eclipse,选择File→New→Android Application Project命令。如果New子菜单中没有Android Application Project,可选择Other命令,在弹出对话框的Android下找到此项,如图1-19所示。

图1-19 创建Android项目

(2)弹出Android项目创建界面,填写项目名称、项目默认的存储路径、目标版本、应用程序名(默认与项目名一致)、包名、创建的Activity的名字、最小SDK版本(默认与目标版本API一致,不要修改),如图1-20所示。

图1-20 设置工程名、目标平台等参数

(3)单击Finish按钮,项目创建完成。在创建完成项目的过程中,ADT会自动生成一些目录和文件,后续生成的项目目录如图1-21所示。

(4)对于上述新建的Android项目,即使没有书写任何一行代码,也已经可以运行。但是要注意:这个项目需要在Android模拟器(Emulator)上运行。首先需要创建一个Android Virtual Devices。在Eclipse的菜单栏中选择Window→AVD Manager命令,打开Android Virtual Device Manager窗口,如图1-22所示。

图1-21 Android工程目录结构

图1-22 Android Virtual Device Manager窗口

(5)单击New按钮,创建新的AVD,在弹出的对话框中设置AVD的名称、目标平台API版本、SD卡的大小、模拟设备默认的皮肤等参数,如图1-23所示。

图1-23 设置创建AVD的参数

(6)单击Create AVD按钮,成功创建的AVD在对话框中显示,如图1-24所示。

图1-24 创建的AVD

(7)单击Start按钮,启动运行AVD模拟设备,运行界面如图1-25所示。

图1-25 启动后的AVD模拟器界面

(8)右击需要运行的项目,在弹出的快捷菜单中选择Run as→Android Application命令。系统默认启动已经创建的模拟器运行项目,如图1-26所示。

图1-26 模拟器运行显示

1.3.5 Android应用结构分析

下面详细了解一下Android程序框架,了解即使未写一行代码程序也能运行的原因。

1.应用程序结构

首先看一下应用程序的构成。展开Package Explorer窗口中已经创建的项目Counter,可以看到如图1-27所示的目录结构。

图1-27 应用程序目录结构

目录中各文件详细介绍如表1-1所示。

表1-1 应用程序目录中文件详细介绍

2.代码分析

上面从结构上对一个Android项目中所包含的主要目录结构做了简单的介绍,下面从程序的角度进行分析。

(1)AndroidManifest.xml

在Eclipse中双击AndroidManifest.xml,选择Manifest选项卡,如图1-28所示。

图1-28 AndroidManifest.xml界面

打开AndroidManifest.xml,会看到如下代码:

代码清单1-1(Counter/AndroidManifest.xml)

在代码清单1-1中,intent-filters描述了Activity启动的位置和时间,每当一个Activity要执行一个操作时,它将创建出一个Intent的对象,这个Intent对象能够承载的信息可描述想要做什么、想处理什么数据、数据的类型以及一些其他的信息。Android将Intent对象中的信息与所有公开的intent-filter比较,找到一个最能适当处理请求者要求的数据和动作的Activity。AndroidManifest.xml中的其他标签的作用如表1-2所示。

表1-2 AndroidManifest.xml分析

注意:在代码中的<android:icon="@drawable/icon">中的"@drawable/icon"表示对res/drawable目录下的ic launcher的引用。其他的依此类推。

(2)stringt.xml

打开位于res/values目录下的string.xml,在文件中定义了程序中所用到的一些常量,具体如下:

代码清单1-2(Counter/res/values/strings.xml)

这个文件很简单,只有两个标签,分别定义了字符串app_name的值为Couner,字符串"Hello_world"的值为"Hello world!"。这些资源的应用会在后续章节中详细介绍。

(3)布局文件activity_main.xml

打开位于res/layout下的main.xml,会看到如下源代码。

代码清单1-3(Couner/res/layout/activity_main)

下面分析一下代码清单1-3中所包含的内容:

● <LinearLayout>:线性布局格式,在此标签中,所有的组件都是线性排列组成的。在后面的章节中会详细介绍Android中内置的几种布局。

● android:orientation:用来确定LinearLayout的方向,值可以为vertical或者horizontal。其中,vertical表示从上到下垂直布局,horizontal表示从左到右水平布局。

● android:layout_width和android:layout_height:用来指明在父控件中当前控件的宽和高,可以设定值,但是更常用的是fill_parent和wrap_content。其中,fill_parent表示填满父控件,wrap_content表示大小刚好足够显示当前控件中的内容。

● <TextView>标签定义了一个用来显示文本的控件,其属性值layout_width为填满整个屏幕,layout_height则可以根据文字的大小进行更改。Android:text定义了在文本框中所要显示的文字内容,这里引用了strings.xml中的hello_world所定义的字符串资源,即“Hello World,HelloAndroid!”也就是在程序运行时看到的字符串。

(4)R.java

打开位于gen目录下的R.java,代码如下:

代码清单1-4(Counter/gen/R.java)

在代码清单1-4中可以看到这里定义了很多常量,也许会发现它们的名字都与res文件夹下的文件名相同,这再次证明了R.java文件中所存储的是该项目所有资源的索引。有了这个文件,程序便可以很快地找到要使用的资源。由于这个文件是只读的,不能手动编辑,所以当项目中加入了新的资源时,只要刷新项目,R.java文件便自动生成了所有资源的索引。

(5)HelloAndroid.java

打开src下的MainActivity.java,源代码如下:

代码清单1-5(Counter/src/MainActivity.java)

最后,分析主程序中的内容。第1行定义了Java包。第2行、3行和第4行导入了程序中使用到的Android Java包。接下来的是对counter Activity的定义。主程序MainActivity类继承自Activity类。重写了void onCreate()方法,onCreate()方法在Activity创建时就将被调用,也就是说程序启动时onCreate()就将运行。在onCreate()中只有两行代码,其中第一句是对基类的onCreate()方法的调用,用来获取Activity的状态,第二句用setContentView(R.layout.activiy_main)来设定Activity所要显示的布局文件,它是通过对R类的引用来实现的,实际上就是位于res/layout/main.xml的文件。