《Android系统原理和实战应用》-第四章_第1页
《Android系统原理和实战应用》-第四章_第2页
《Android系统原理和实战应用》-第四章_第3页
《Android系统原理和实战应用》-第四章_第4页
《Android系统原理和实战应用》-第四章_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章Android应用程序架构Android的软件层次结构包括了一个操作系统(os),中间件(MiddlcWasc)和应用程序(Application)。Android的软件框图如图4.1所示,Android软件层次可以分为5部分,分别是:LinuxKernel、AndroidRuntime、Libraries、ApplicationFramework、Applications.返回4.1架构简述4.1.1LinuxKernelAndroid基于Linux2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。LinuxKernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。如果学过计算机网络有关OSI/RM的知识,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。也就是说各层各尽其职,各层提供固定的SAP(ServiceAccessPoint),专业点可以说是高内聚、低藕合。如果只是做应用开发,就不需要深人了解LinuxKernel层。下一页返回4.1架构简述4.1.2AndroidRuntimeAndroid包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序都是Dalvik虚拟机中的实例,运行在它们自己的进程中。Dalvik虚拟机设计成在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件的格式是.dex,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。上一页下一页返回4.1架构简述大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。Dalvik虚拟机不能直接运行以.clan*为后缀的Java字节码,Dalvik虚拟机中专门设计了一套工具,可以将Java.class转换成.dex格式。一个dex文件通常会有多个.class。由于dex有时必须进行最佳化,会使文件大小增加1一4倍,以ODEX结尾。Dalvik虚拟机依赖于Linux内核提供基本功能,如线程和底层内存管理。上一页下一页返回4.1架构简述4.1.3LibrariesAndroid包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(applicationframework)暴露给开发者。下面列出一些核心库:系统C库—标准C系统库(libc)的BSD衍生,调整为基于嵌人式Linux设备。媒体库—基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4,H.264,MP3,AAC,AMR,JPG、PNG。上一页下一页返回4.1架构简述界面管理——管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层。LibWebCore——新式的Web浏览器引擎,驱动Android浏览器和内嵌的web视图。SGL-基本的2D图形引擎。3D库-基于OpenGLES1.0APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅。FreeType-位图和矢量字体渲染。sQLite-所有应用程序都可以使用的强大而轻量级的关系数据库引擎。上一页下一页返回4.1架构简述4.1.4ApplicationFramework通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知,等等。开发者可以完全使用核心应用程序所使用的框架APIs。这种应用程序的体系结构设训旨在使组件的重用更为简单,任何应用程序都能发布它的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。上一页下一页返回4.1架构简述所有的应用程序其实是一组服务和系统,包括:视图(View)—丰富的、可扩展的视图集合,可用于构建一个应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器。内容提供服务(ConlentProviders)—使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据。资源管理器(ResourceManager)—提供访问」卜代码资源,如本地化字符串、图形和布局文件。通知管理器(NotificationManager)—使所有的应用程序能够在状态栏显示自定义警告。活动管理器(ActivityManager)—管理应用程序生命周期,提供通用的导航回退功能。上一页下一页返回4.1架构简述4.1.5ApplicationsAndroid装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、口历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。更加丰富的应用程序有待我们去开发!从上面我们知道Android的架构是分层的,非常清晰,分工很明确。Android本身是一套软件堆叠(SoftwareSlack),或称为“软件叠层架构”,叠层主要分成三层:操作系统、中间件、应用程序。上一页返回4.2应用程序的结构

Android应用程序框架开发者也完全可以访问核心应用程序所使用的API框架。该应用程序架构用来简化组件软件的重用;任何一个应用程序都可以发布它的功能块并且任何其他的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。该应用程序重用机制使得组件可以被用户替换。以下所有的应用程序都由一系列的服务和系统组成,包括:1、一个可扩展的视图(Views)—可以用来建应用程序,包括列表(lists、网格(grids)、文本框(textboxes)按钮(buttones),甚至包括一个可嵌人的WEb浏览器。下一页返回4.2应用程序的结构2、内容提供服务(ContentProviders)—使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据。3、一个资源管理器(ResourceManager)—提供非代码资源的访问,如本地字符串、图形和分层文件(layoutfiles)。4、一个通知管理器(NotificaetionManager)—使得应用程序可以在状态栏中显示客户通知信息。5、一个活动类管理器(ActivityManager)—用来管理应用程序生命周期并提供常用的导航回退功能。上一页下一页返回4.2应用程序的结构对于一个Android应用程序来说,是由四种构造块组织而成的,如下:1、Activity2、IntentreceiverIntent3、Service4、Contentprovider但是,并不是每一个Android应用程序都需要这四种构造块,某些时候,只需要这四种中的几种组合而成。上一页下一页返回4.2应用程序的结构当明确了应用需要哪些构造块后,就需要在AndroidManifest.xml中登记这些构造块的清单。这是一个XML配置文件,这个配置文件用于定义我们的应用程序的组件、组件的功能及必要条件等。这个配置文件是每个Android应用必需的。对于AndroidMainfest.xml的Schema,参考SDK包附带的文档。以下对四种构造块做一些说明。上一页下一页返回4.2应用程序的结构4.2.1ActivityActivity是Android构造块中最基本的一种,在应用中,一个Activity通常就是一个单独的屏幕。每一个Activity都被实现为一个独立的类,并且继承于Activity这个基类。这个activity类将会显示由几个Views控件组成的用户接口,并对事件做出响应。大部分的应用都会包含多个屏幕。例如,一个短消息应用程序将会有一个屏幕用于显示联系人列表,第二个屏幕用于写短消息,同时还会有用于浏览旧的短消息及进行系统设置的屏幕。每一个这样的屏幕,就是一个activity。从一个屏幕导航到另一个屏幕是很简单的。在一些应用中,一个屏幕甚至会返回一个值给前一个屏幕。上一页下一页返回4.2应用程序的结构当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史堆栈中。用户可以返回到历史堆栈中的前一个屏幕。当屏幕不再使用时,还可以从历史堆栈中删除。默认情况下,Android将会保留从主屏幕到每一个应用的运行屏幕。Android使用了Inlenl这个特殊类,实现在屏幕与屏幕之间移动。Intent类用于描述一个应用将会做了1‘么事。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。典型的动作类型有:MAIN(activity的门户)、VIEW,PICK,EDIT等。而动作对应的数据则以URI的形式进行表示。例如:要查看一个人的联系方式,需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI.上一页下一页返回4.2应用程序的结构与Intent有关系的一个类叫IntentFiller。相对于inlcnl是一个有效的做某事的请求,一个IntentFiller则用于描述一个Activity(或者IntentReceiver)能够操作哪些Intent。一个Activity如果要显示一个人的联系方式时,需要声明一个IntentFiller,这个IntentFiller要知道怎么去处理VIEW动作和表示一个人的URI.IntentFiller需要在AndroidManifest.xml中定义。上一页下一页返回4.2应用程序的结构通过解析各种Intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity将会调用startActivity(InlenttnyIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFille:中查找,找到最匹配myIntent的Intent对应的activity.新的activity接收到myIntent的通知后,开始运行。当startActivity方法被调用将触发解析myIntent的动作,这个机制提供了两个关键好处:1、Activities能够重复利用从其他组件中以Intent的形式产生的一个请求。2、Activities可以在任何时候被一个具有相同InlcnlFiller的新的Activity取代。上一页下一页返回4.2应用程序的结构4.2.2BroadcastIntentReceiver当你希望你的应用能够对一个外部的事件(如当电话呼人时,或者数据网络可用时,或者到了晚上时)做出响应,可以使用一个IntentReceiver。虽然IntentReceiver在感兴趣的事件发生时,会使用NotlificationManager通知用户,但它并不能生成一个UI.IntentReceiver在AndroidManifcsl.xml中注册,但也可以在代码中使用Context.registerReceiver()进行注册。当一个IntentReceiver被触发时,你的应用不必对请求调用IntentReceiver,系统会在需要的时候启动你的应用。各种应用还可以通过使用Context.broadcastIntent()将它们自己的IntentReceiver广播给其他应用程序。上一页下一页返回4.2应用程序的结构使用BroadcastReceiver让应用对外部事件(如当电话呼人时,或者数据网络可用时,或者到了晚上时)作出反应。但它并不能生成一个UI,所以对用户是透明的。BroadcastReceiver使用NotificationManager通知用户这些事情发生了。BroadcastReceiver在AndroidManifest.xml中注朋1,但也可以在代码中使用Context.registerReceiver()进行注朋1。只要是注册了,当事件来临时,即使程序没有启动,系统也在需要时启动程序。各种应用还可以通过使用Context.sendBroadcast()将它们自己的intentbroadcasts广播给其他应用程序。上一页下一页返回4.2应用程序的结构4.2.3Service一个Service是一段长生命周期的,没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其他屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity会使用Context.bindService()来启动一个Service,从而可以在后台保持音乐的播放。同时,系统也将保持这个Service一直执行,直到这个Service运行结束。另外,还可以通过使用Context.bindService()方法,连接到一个Service上。当连接到一个Service之后,还可以Service提供的接口与它进行通讯。上一页下一页返回4.2应用程序的结构4.2.4ContentProvider应用程序能够将它们的数据保存到文件中、SQL数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其他的应用共享时,ContentProvider:将会很有用。一个ContentProvider:类中实现了一组标准的方法,从而能够让其他的应用保存或读取此ContentProvider:处理的各种数据类型。上一页返回4.3AndroidManifest.xml详解4.3.1AndroidManifest.xml文件的作用AndroidManifest.xml文件的作用如下:1、它决定哪些进程将容纳应用程序组件。2、它声明了本应用程序必须拥有哪些许可,以便访问API的被保护部分,以及与其他应用程序交互。3、它声明了其他应用程序在和该应用程序交互时需要持有的许可。4、它列出了Instrumentation类,可以在应用程序运行时提供简档和其他信息。这些声明仅在应用程序开发和测试过程中被提供;它们将在应用程序正式发布之前被移除。5、它声明了该应用程序所需的AndroidAPI的最小化水平。下一页返回4.3AndroidManifest.xml详解6、它列出了该应用程序必须链接的库。4.3.2AndroidManifest.xml的结构大纲<tnanifest>根节点,描述了程序包的所有内容。<uses一permission>请求一个在正常运行所需的安全授权,必须被授予该权限,程序包才能正确的操作。一个tnanifesl可以包含零个或多个这样的节点。<permission>声明一个安全授权,决定哪些程序可以访问程序包内的功能组件和功能。可以包含零个或多个这样的节点。<instrumentation>声明了用来测试这个package或其他packag。指令组件的代码。一个manifest能包含零个或多个这样的节点。上一页下一页返回4.3AndroidManifest.xml详解<uses一sdk/>指定当前应用程序兼容的最低SDK版本号。<application>包含。ackagc中application级别组件声明的根节点。该节点能够描述应用程序的全局(和/或)默认属性,例如标签、图标、主题、需要的授权,等等。包含零个或一个这样的节点。<activity>activity是应用于用户交互的最主要机制。当一个应用运行的时候,用户看到的第一个屏幕就是activity,并且用户所使用的其他绝大多数屏幕(界面)也会是activity。<intent-filter>声明了指定的一组组件支持的Intent值。<receiver>一个IntenReceiver:可以让应用接收到一次数据变化和一次行为发生的通知,甚至这个应用没有在运行也可以。同activity标签一样,可以选择包含一个或多个<intent-filter>元素。上一页下一页返回4.3AndroidManifest.xml详解<Service>Service是一个在后台任意时刻都可以运行的组件。同activity标签一样,可以选择包含一个或多个<intent-filter>元素。<provider>ContentProvide:组件是用来管理数据持久化及数据发布的,发布的数据可以被其他的应用访问。下面是按照字母顺序排列的所有可以出现在manifest文件里的元素。它们是唯一合法的元素,不能加人自己的元素或属性。上一页下一页返回4.3AndroidManifest.xml详解4.3.3AndroidManifest.xml的一些规则AndroidManifest.xml文件的结构、元素以及元素的属性,可以在AndroidSDK文档中查看详细说明。而在看这些众多的元素以及元素的属性前,需要先了解一下这些元素在命名、结构等方面的规则:元素:在所有的元素中只有<tnanifest>和<application>是必需的,且只能出现一次。如果一个元素包含有其他子元素,必须通过子元素的属性来设置其值。处于同一层次的元素,这些元素的说明是没有顺序的。属性:按照常理,所有的属性都是可选的,但是有些属性是必须设置的。那些真正可选的属性,即使不存在,其也有默认的数值项说明。除了根元素<manifest>的属性,所有其他元素属性的名字都是以android:为前缀的。上一页下一页返回4.3AndroidManifest.xml详解定义类名:所有的元素名都对应其在SDK中的类名,如果自定义类名,必须包含类的数据包名,如果类与application处于同一数据包中,可以直接简写为“.”。多数值项:如果某个元素有超过一个数值,这个元素必须通过重复的方式来说明其某个属性具有多个数值项,且不能将多个数值项一次性说明在一个属性中。资源项说明:当需要引用某个资源时,其采用如下格式:@[package;]type;name.例如<activityandroid:icon=“@drawable/icon"…>。字符串值:类似于其他语言,如果字符串中包含有字符“\”,则必须使用转义字符“\\’’。上一页下一页返回4.3AndroidManifest.xml详解4.3.4AndroidManifest.xml属性介绍<application>中将可能包含Android程序的四种对象:Activity,Service,ConlcnlProvid-er以及Receiver.当添加上面四种类型中的任一种新对象时,我们都需要在androidmani-fest.xtnl文件中添加相应节点。每一个activity必须要一个<activity>标记对应,无沦它给外部使用或是只用于自己的package中。如果一个activity没有对应的标记,就不能运行它。此文件一个重要的地方就是它所包含的intent-filters,这些filters描述了activity启动的位置和时间。上一页下一页返回4.3AndroidManifest.xml详解每当一个activity(或者操作系统)要执行一个操作,它需创建出一个intent的对象。它能承载一些信息描述了想做了1‘么,想处理了1‘么数据,数据的类型和一些其他信息。Android比较了intentl对象中和每个application所暴露的intent-filters中的信息,找到最合适的activity来处理调用者所指定的数据和操作。有关AndroidManifest.xml文件的application分支有必要了解一些常见的属性,这里可以看到一些实用的选项,比如允许调android;debuggable、任务关系android:taskAffinity,比如用常见的方式创建一个新的任务实用标记FLAGACTIVITYNEWTASK,为程序制定一个主题,可以使用android:theme指向一个主题文件。上一页下一页返回4.3AndroidManifest.xml详解平时创建的程序使用一些安全敏感项,会需要请求系统许可权限,这里可以使用android;permission来制定相关的许可,每个程序的service,activity,content

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论