【网学网提醒】:网学会员编辑为广大网友搜集整理了:android简介绩等信息,祝愿广大网友取得需要的信息,参考学习。
Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。
简介
Android是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟(OpenHandsetAlliance)开发。是一个包含操作系统,中间件和关键应用
程序的移动设备软件堆层(softwarestack,又名以软件叠层)。AndroidSDK中提供了必要的开发工具和APIs,用于在Android平台上使用Java编程语言进行开发。另外,为了推广此技术,Google和其它几十个手机公司建立了开放手机联盟。版本:2008年10月2009年2月2009年5月2009年9月2009年11月2009年12月2010年1月推出了Android第一个版本BASE。第一版的更新,官方成为BASE_1.1.Android1.5即Cupcake(纸杯蛋糕)。Android1.6即Donut(炸面圈)。Android2.0即éclair(长型松饼)。Android2.0.1Android2.1ECLAIR_MR1。
Android平台的研发队伍阵容强大,包括Google:著名
搜索引擎公司,提供多种网络服务。:摩托罗拉:美国最大的手机制造商,全球芯片制造、电子通讯的领导者。摩托罗拉HTC(台湾宏达国际电子台湾宏达国际电子):全球最大的智能型手机代工厂商,全球最大的WindowsMobil台湾宏达国际电子e智能型手机生产厂商,微软WindowsMobile最紧密的合作伙伴之一,垄断了WindowsMobile手机80%左右的市场份额。PHILIPS(荷兰):(荷兰):):是世界上最大的电子公司之一,欧洲最大的电子跨国公司。飞利浦公司以生产家用电器、军用和民用通讯设备、医疗设备、电脑、仪表和显示系统等著称于世。它也是西欧最大的军火企业之一,从人造卫星、“阿波罗”登月飞船到最新的航天飞机,都有飞利浦的产品。美国军舰也使用飞利浦的雷达。T-Mobile:是一家跨国移动电话运营商。它是德国电信的子公司,属于Freemove:联盟.T-Mobile在西欧和美国运营GSM网络并通过金融手段参与东欧和东南亚的网络运营。该公司拥有1.09亿用户,是世界上最大的移动电话公司之一。):以在CDMA(CodeDivisionMultipleAccess),技术方面处于领先地位而高通(美):
闻名,而CDMA技术已成为世界上发展最快的无线技术。魅族:珠海市魅族电子科技有限公司,以研发和生产高品质的MP3系列随身听为主的高新企业,是目前国内的有自主研发能力的MP3企业之一。三星:仅次于诺基亚的全球第二大手机制造商。韩国最大的企业集团。LG:韩国第三大公司:中国移动
:全球最大的移动运营商。英特尔:英特尔:英特尔公司是全球最大的半导体芯片制造商,世界著名微处理器厂商。惠普HP:美国的资讯科技公司,主要专注生产于打印机、数码影像、软件、计算机与资讯:服务等业务。全球第一大PC厂商。Nvidia(英伟达)(:是一家以设计显示芯片和主板芯片组为主的半导体公司。nVIDIA最出):名的产品线是为游戏而设的GeForce显示卡系列,为专业工作站而设的Quadro显卡系列,和用于
计算机主板的nForce芯片组系列。等34家企业,都将基于该平台开发手机的新型业务,应用之间的通用性和互联性将在最大程度上得到保持。“开放手机联盟”表示,Android平台可以促使移动设备的创新,让用户体验到最优越的移动服务,同时,开发商也将得到一个新的开放级别,更方便的进行协同合作,从而保障新型移动设备的研发速度。34家企业的加盟,也将大大降低新型手机设备的研发成本,完全整合的“全移动功能性产品”成为“开放手机联盟”的最终目标。这34家企业中并不包含把持Symbian的诺基亚,以及凭借着iPhone风光正在的苹果公司,美国运营商AT&;T和Verizon,当然微软没有加入,独树一帜的加拿大RIM和他们的Blackberry也被挡在门外。
特性
???????
应用
程序框架让组件的重用和重置成为可能。Dalvik虚拟机移动设备最优化的虚拟机整合浏览器基于开源的WebKit引擎最优的绘图定制的2D绘图类库;绘图类库基于OpenGLES1.0规范3D(硬件加速可选)SQLite结构化数据存储多媒体支持一般音频,视频和
图片格式(MPEG4,H.264,MP3,AAC,AMR,JPG,PNG,GIF)GSM电话服务(需要硬件支持)
?
??
Bluetooth,EDGE(EnhancedDataRateforGSMEvolution)增强型数据速率GSM演进技术,3G,和WiFi(WirelessFidelity无线高保真技术,802.11b)(需要硬件支持)照相机,GPS,指南针,and加速仪(需要硬件支持)丰富的开发环境包括一个设备模拟器,调试工具,内存和性能分析,还有EclipseIDE的插件。
Android体系结构
下图展示了Android操作系统的主要组件.每一部分接下来都有详细的描述。
应用
程序 Android拥有一套核心的应用程序包括email客户端,短信程序,计算器,地图,浏览器,电话簿和其他应用程序。所有的应用
程序都是用Java编程语言写的。
应用
程序框架
开发人员可以完全访问与核心应用程序相同的框架APIs。应用程序架构设计用于简化重用组件。任何应用程序可以发布它的性能,任何其他应用
程序可以使用这些性能(安全约束
问题由框架强制执行。)这种相同的机制允许用户重置组件
。底层的所有应用
程序是一个服务和系统的集合包括:
?????
一个丰富可扩展的视图集合,可用于创建应用程序,包括列表,网格,文本框,按钮,和一个内置浏览器。ContentProviders(内容提供者)能使应用程序操作其他应用程序的数据(例如电话簿)或者共享自己的数据。ResourceManager(资源管理器),提供处理非代码资源如本地字符串,图形和布局文件。NotificationManager(通知管理器)能使所有应用程序在状态栏中显示定制的警告ActivityManager(活动管理器)管理应用
程序的生命周期和供给普通后台导航堆栈
类库
Android包含一个C/C++类库集合,被很多Android系统的组件使用。这些性能通过Android应用
程序框架暴露给开发人员。下面列出部分核心类库:
??
??????
系统C类库–一个BSD(BerkeleySoftwareDistribution伯克利软件套件)衍生实现的标准C系统类库(libc),用于基于嵌入式Linux设备。多媒体类库–基于PacketVideo公司的OpenCORE;类库支持重放和录制多种流行的音频和视频格式,而且包括静态
图片文件,包括MPEG4,H.264,MP3,AAC,AMR,JPG,andPNG等格式。Surface管理器–管理操控显示子系统和无缝合成的复合应用程序的2D和3D图形层LibWeb内核–一个流行的web浏览器引擎支持Android浏览器和嵌入式web视图。SGL–基础的2D绘图引擎。3D类库–基于OpenGLES1.0APIs的实现;类库利用硬件3D加速(可用情况)或者内置高度优化的3D光栅化软件。FreeType–位图和向量字体绘制SQLite–一个强大的,轻量级关系型数据库引擎,可用于所有应用
程序。
Android运行机制
Android包含一个核心类库集合,在核心类库中为Java编程语言提供了大量的可用功能。在Dalvik虚拟机中,每个Android应用程序运行在它自己的进程里。Dalvik是一个有效的可运行复合虚拟内存系统设备。Dalvik虚拟机在DalvikExecutable(.dex)格式中执行文件,能够达到最佳的最小化占用内存。虚拟机是基于
注册的,利用Java语言编译器运行由内置的“dx”工具转换为.dex的被编译的类。Dalvik虚拟机依赖于Linux内核的底层性能如线程处理和低级内存管理。
Linux内核
Android基于Linuxversion2.6作为核心系统服务如安全性,内存管理,进程管理,网络堆栈和驱动模型。内核还是硬件和其他软件堆栈的抽象层。
Android应用程序构成
一般情况Android应用程序是由以下四种组件构造而成的:
????
活动广播接收器服务内容提供器
需要注意的是,并不是每个Andorid应用程序都必须构建这4个组件,有些可能由这些组件的组合而成。一旦你
确定了你的应用程序中需要的组件,那么你就应该在AndroidManifest.xml中列出他们。这是一个XML配置文件,它用于定义应用程序中需要的组件、组件的功能及必要条件等。这个文件是必须的。四种组件说明如下:
活动
活动是最基本的Andorid应用程序组件,应用程序中,一个活动通常就是一个单独的屏幕。每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并对事件做出响应。大多数的应
用是由多屏幕显示组成。例如,一个文本信息的应用也许有一个显示发送消息的联系人列表屏幕,第二个屏幕用来写文本消息和选择收件人,再来一个屏幕查看消息历史或者消息设置操作等。这里每一个这样的屏幕就是一个活动,很容易实现从一个屏幕到一个新的屏幕并且完成新的活动。在某些情况下当前的屏幕也许需要向上一个屏幕动提供返回值--比如让用户从手机中挑选一张照片返回通讯录做为电话拨入者的头像。当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态并且压入历史堆栈中。用户可以通过回退操回到以前打开过的屏幕。我们可以选择性的移除一些没有必要保留的屏幕,因为Android会把每个从桌面打开的程序保留在堆栈中。
Intent和IntentFilters
调用Android专有类Intent进行构屏幕之间的切换。Intent是描述应用想要做什么。Intent数据结构两最重要的部分是动作和动作对应的数据。典型的动作类型有:MAIN(活动的门户)、VIEW、PICK、EDIT等。而动作对应的数据则以URI的形式进行表示。例如:要查看某一个人的联系方式,你需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI。与之有关系的一个类叫IntentFilter。当intent被要求做某事的时候,intentfilter用于描述一个活动(或者BroadcastReceiver,看下面)能够操作哪些intent。一个活动如果要显示一个人的联系方式时,需要声明一个IntentFilter,这个IntentFilter要知道怎么去处理VIEW动作和表示一个人的URI。IntentFilter需要在AndroidManifest.xml中定义。通过解析各种intent,从一个屏幕切换到另一个屏幕是很简单的。激活每种组件有不同的方法:
?
通过意图对象Context.startActivity()或Activity.startActivityForResult()去启动一个活动(或者给出一些新要做的东西)响应的活动能通过调用getIntent().方法看到导致它被装载的初始意图.Android调用活动的onNewIntent()方法去传递任何随后的意图。
一个活动经常启动下一个活动。如果它期望从它启动的活动中得到一个结果,它可以调用startActivityForResult()代替startAc
tivity()方法。例如,如果它启动一个活动让用户去选择一个照片,它会期望返回被选择的照片。结果会在意图对象中,通过调用活动的onActivityResult()方法返回。
?
服务的启动(或者新的给出的指令到一个正在运行的服务)可以通过意图对象调用Context.startService()方法。Android调用服务的onStart()方法传递它的Intent对象。
类似的,一个意图可以被传递到Context.bindService()中,在调用组件和目标服务之间建立一个运行的连接。服务在调用onBind()方法时接收意图对象.(如果服务不
是运行状态,bindService()方法会启动方法。)例如,一个活动可能与前面提到的音乐后台播放服务建立一个连接,这样它可以提供给用户方法(用户界面)去控制播放。活动将调用bindService()去设置那个连接。调用服务定义的方法去影响播放。下面的部分,Remoteprocedurecalls,会更详细的讲解绑定一个服务。.
?
一个应用程序能在它们有任何变更时,通过传递意图对象到Context.sendBroadcast(),Context.sendOrderedBroadcast(),和Context.sendStickyBroadcast()发出一个广播。Android通过调用接收器的onReceive()方法派发意图到所有相关的广播接收器中。
广播接收器
你可以使用BroadcastReceiver来让你的应用对一个外部的事件做出响应。比如:当电话呼入时,数据网络可用时,或者到了晚上时。BroadcastReceivers不能显示UI,它只能通过NotificationManager来通知用户这些有趣的事情发生了。BroadcastReceivers既可以在AndroidManifest.xml中注册,也可以在代码中使用Context.registerReceiver()进行注册。但这些有趣的事情发生时,你的应用不必对请求调用BroadcastReceivers,系统会在需要的时候启动你的应用,并在必要情况下触发BroadcastReceivers。各种应用还可以通过使用Context.sendBroadcast()将它们自己的intentbroadcasts广播给其它应用程序。
服务
一个服务是具有一段较长生命周期且没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个活动,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的活动,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个活动会使用Context.startService()来启动一个服务,从而可以在后台保持音乐的播放。同时,系统也将保持这个服务一直执行,直到这个service运行结束。(你可以通过阅读LifeCycleofanAndroidApplication获取更多关于服务的介绍).另外,我们还可以通过使用Context.bindService()方法,连接到一个服务上(如果
这个服务还没有运行将启动它)。当连接到一个服务之后,我们还可以
通过服务提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。
内容提供器
应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时,内容提供其将会很有用。一个内容提供器类实现了一组标准的方法,从而能够让其它的应用保存或读取此内容提供器处理的各种数据类型。关闭组件(关闭组件(Shuttingdowncomponents))
内容供应者只主动响应内容分析器发出的请求。广播接收器只主动响应广播消息。所以不需要明确的关闭这些组件。活动从另一方面说是提供用户界面的。它们与用户保持长时间的会话,并且可能一直保持主动,甚至在空闲时间也要这样,直到会话结束。同样,服务或许也会保持运行很长的时间。所以Android提供了方法可以有条不紊的去关闭活动和服务。
?
?
活动可以通过调用它的finish()方法去关闭。一个活动可以通过调用finishActivity()方法去关闭另一个活动(该活动通过startActivityForResult()启动的活动)一个服务可以通过调用它的stopSelf()方法或者调用Context.stopService()方法停止该服务。
各组件也有可能被系统关闭,当它们不再被使用或者Android必须为其他活动的组件回收内存的时候。后面的(组件的生命周期)ComponentLifecycles部分将详细的讨论它的可能性和它的分支。
组件清单文件(组件清单文件(Themanifestfile))
在Android启动应用程序的组件之前必须知道存在的组件。所以,应用程序声明他们的组件在清单文件中,清单文件被归在Android包中。.apk文件包含应用程序代码,文件和资源。清单文件是XML结构的文件,通常在所有的应用程序中都命名为AndroidManifest.xml。它做很多事情,声明应用程序的组件,如命名需要被导入的程序依赖的类库(不同于默认的Android类库)和标示应用程序需要被授予的所有权限。
但清单的主要的任务是告知Android应用程序的组件。例如,一个活动可以被声明为如下:
...
元素的name属性用于命名实现了Activity的子类名。icon和label属性指向了包含一个icon和label的资源文件,用于显示给用户去展现该活动。其他的组件也使用类似的方法声明—元素声明服务, eiver>元素声明广播接收器,元素声明内容供应者。活动,服务和内容供应者未在清单中声明的将对系统不可见,也因此不能被运行。然而,广播接收器既可以在清单中声明,也可以在代码中动态创建(如BroadcastReceiver对象)并通过调用Context.registerReceiver()在系统中注册。
>
意图过滤器(意图过滤器(Intentfilters))
一个意图对象能明确的指出一个目标组件。如果它指出了,Android会找到那个组件(基于声明的清单文件)并激活它。但是如果目标没有明确指出,Android必须找出最合适的组件去相应这个意图。系统是通过比较意图对象和意图过滤器的潜在目标找到最适合的组件的。一个组件的意图过滤器告知Android这个组件可以捕获哪种意图。像其他的组件基本信息一样,意图过滤器也是声明在清单文件中。下面是前一个例子的扩展,加入了两个意图过滤器到活动中:
...
例子中的第一个过滤器——动作"android.intent.action.MAIN"和类别"android.intent.category.LAUNCHER"组合是最常见的。它标志着这个活动在应用程序启动后呈现出来。用户可以启动屏幕列出的应用程序到设备中。也就是说,这个活动是应用程序的入口,当用户选择应用程序启动后,第一个呈现在用户眼前的活动。第二个过滤器声明了一个动作,这个活动能够执行一个特殊类型的数据。一个组件可以有任意数量的意图过滤器,每个都声明一个不同性能的设置。如果它没有任何过滤器,它就只能通过明确的指出目标组件的意图激活。
对于广播接收器,可以在代码中创建和注册,意图过滤器被实例化为IntentFilter类。所有的过滤器都在清单中设置。
组件生命周期(组件生命周期(ComponentLifecycles)生命周期)
应用程序组件有一个生命周期——当Android实例化他们去响应意图开始到这个实例被销毁结束。在此过程中,他们或许处于激活状态或许处于非激活状态,对于一个活动来说,就是是否对用户可见。这部分我们讨论活动,服务,广播接收器的生命周期,包括它们生存期间可能出现的状态,通知你在状
态间转变的方法,进程持有这些状态可能会被终止和实例销毁的可能性的影响。
活动的生命周期(活动的生命周期(Activitylifecycle))
一个活动实质上有三种状态:
??
当它在屏幕前台是激活或运行时(在当前任务的活动堆栈顶端)。即活动聚焦于用户行为。如果它失去焦点,但依然对用户可见,则它处于暂停状态。就是说,另一个活动在它的上面并且那个活动既不是透明的,也不是铺满全屏的,所以暂停的活动有部分是显露出来的。一个暂停的活动是完全活跃的(它维持所有状态和成员信息并且依然与窗口管理器有联系。)但可以在极度低内存的状况下被系统杀死。
当它完全被另一个活动覆盖时它就会处于停止状态,它依然保持所有状态和成员信息,然而,它不再对用户可见,所以它的窗口被隐藏并且当别处需要内存时,它经常会被系统杀死。如果一个活动是暂停或停止状态,系统可以从内存中放弃它。通过访问他的去结束生命周期(调用它的finish()方法),或者简单的杀死它的进程。当它再次显示给用户时,它必须完全重新启动并且恢复到它以前的状态。活动状态之间的转换,是通过调用下列受保护的方法去通知改变的:
?
voidvoidvoidvoidvoidvoidvoid
onCreate(BundlesavedInstanceState)onStart()onRestart()onResume()onPause()onStop()onDestroy()
所有这些方法只是引子,你可以覆盖它们,当状态改变时,去做一些适当的工作。所有活动都必须在第一次实例化时实现onCreate()初始化。很多情况下还要实现onPause(),提交数据改变,否则就准备停止与用户的交互吧。调用父类方法任何一个活动的实现都应该总是先调用父类生命周期的方法。例如:
protectedvoidonPause(){super.onPause();...}
总体来说,这7个方法定义了一个活动的全部生命周期。有三个嵌套循环你可以通过实现他们监听:
?
一个活动的整个生存期从第一次调用onCreate()到最后调用onDestroy()。一个活动所有的初始化“全局”状态都是在onCreate()中,释放所有剩余资源在onDestroy()中。例如,如果有一个线程在后台运行,从网络下载数据,他可以创建线程在onCreate(),然后停止线程在onDestroy()。一个活动可见的生存期从调用onStart()开始直到对应的调用onStop()结束。在这期间,用户可以在屏幕上看到活动,尽管可能没有在前台与用户交互,在这两个方法间,你能够维持你需要的资源显示在活动中给用户。例如,你可以注册一个广播接收器BroadcastReceiver在onStart()去监听你用户界面的改变,当用户不再看你显示的东西的时候,在onStop()中注销它。onStart()和onStop()方法
可以被多次调用,以实现活动对用户可见与隐藏的交替。
?
?
一个活动的前台生存期从调用onResume()开始,直到对应的调用onPause()方法结束。在此期间,活动在屏幕中所有其他活动的前面并且与用户交互。一个活动可以频繁的在恢复和暂停状态间转换。例如,当设备休眠或一个新活动启动时,就会调用onPause(),当一个活动产生或一个新意图被送达时,就会调用onResume()。因此,这两个方法中的代码应该是相当轻量级的。下图阐明一个活动可能在状态间出现这些循环和路线。带颜色的椭圆形是活动可以存在的主要状态。矩形代表当活动在这些状态转换时,你可以实现去执行操作的调用方法。
下面的表格详细的描述了这些方法及他们在活动中所有生命周期的位置:
方法描述killable下一个
onCreate()
当活动第一次被创建时调用。在这里,你应该做所有一般静态设置——创建视图,绑定数据到列表中等等。
否
onStart()
方法
描述
killable
下一个
这个方法需要传递一个Bundle对象,如果活动的前一个状态被捕,Bundle中应获包含这个状态(参见后面的SavingActivityState).接下来总是onStart()方法。
onRestart()
活动停止后,在它重新启动之前调用接下来总是onStart()方法。
否
onStart()
onStart()
在活动对用户可见前调用。接下来,如果活动转到前台调用onResume()如果隐藏调用onStop()
否
onResume()
或
onStop()
onResume()
在活动与用户交互前调用。此时活动在活动堆栈的顶部,接收用户输入。接下来总是onPause().
否
onPause()
onPause()
当系统要开始恢复另一个活动时调用这个方法。这个方法是典型的用于提交未保存的改变到持久性数据,停止活跃的和其他可能消耗CPU的东西等。无论怎样它应该很快的去做这件事,因为下一个活动直到它返回之后才会恢复。如果活动返回到前台,接下来会调用onResume()如果变得对用户不可见则接下来会调用onStop()。
是
onResume()
或
onStop()
onStop()
活动不再对用户可见时调用
是
onRestart(
方法
描述
killable
下一个
此方法。当活动被销毁或另一个活动(已存在或新的活动)恢复后覆盖掉它时会发生。接下来,如果活动返回与用户交互则调用
)
或
onDestroy()
onRestart()如果这
个活动要销毁调用
onDestroy()。onDestroy()
在活动销毁之前调用。这是活动接收的最后的调用。它既可以因为活动结束(有人在活动里调用是
无
finish())而被调用,也
可以因为系统为了节省空间暂时销毁这个活动的实例而被调用。你可以通过
isFinishing()方法
辨别这两种情况。
注意上表中的可杀死一项。它指出
系统是否可以在方法返回后的任意时间,不需要再执行活动的其他行代码的情况下,杀死活动的宿主进程。有三个方法(onPause(),onStop(),和onDestroy())被标记为是。因为onPause()是三个中第一个方法,它是唯一一个被保证在进程被杀死前调用的。onStop()和onDestroy()可能不会被保证调用。因此,你应该用onPause()方法去写任何持久化数据(如用户编辑的)去存储。可杀死项被标记为否的方法,会在他们被调用那一刻起开始保护活动的宿主进程。如此,一个活动处于可杀死状态时,例如,从onPause()时返回到调用onResume()时,它不会再被杀死,直到onPause()再次返回。正如后面Processesandlifecycle的部分会提到的,一个活动不是技术上可杀死,通过这个界定还有可能被系统杀死。但那只会在极端和可怕的形势,当没有其他资源的情况下发生。
保存活动状态(保存活动状态(Savingactivitystate))
与其说是用户,不如说是当系统关掉一个活动保存到内存时,用户或许希望再返回到那个活动时可以找到它以前的状态。为了在活动被杀死前捕获状态,你可以为活动实现onSaveInstanceState()方法.Android会在活动变脆弱被销毁前调用这个方法。就是说,在onPause()被调用前。
它传递给方法一个Bundle对象,你可以以名-值对的形式记录活动的动态的状态。当活动再次启动,Bundle会被传递到onCreate()和onRestoreInstanceState()中,这个方法在onStart()方法后调用。这样这两个方法都可以重建捕获的方法。不像onPause()和其他前面讨论的方法那样,onSaveInstanceState()和onRestoreInstanceState()不是生命周期方法。他们不总是被调用。例如,Android在活动变脆弱被系统销毁前调用onSaveInstanceState()。但不必烦恼会在实例真正被用户行为销毁时调用(如安下BACK键)。在那种情况,用户不希望返回到活动,所以没有必要去保存它的状态。因为onSaveInstanceState()不是总被调用,所以你应该只在记录活动的暂时状态时使用他,不是持久化数据时使用。使用onPause()持久化数据。
协调活动(Coordinatingactivities)协调活动()
当一个活动启动另一个时,他们都会经历生命周期转变。一个暂停或停止时,另一个在运行。有时,你或许需要协调这些活动,一个与另一个之间。生命周期调用的秩序已经定义好了,特别是当两个活动在同一个进程中:调用当前活动的onPause()方法。接下来,开始按顺序调用将要启动的活动的onCreate(),onStart()和onResume()方法。3.然后,如果启动的活动不再显示在屏幕,就调用它的onStop()方法。1.2.
服务的生命周期(服务的生命周期(Servi
celifecycle))
一个服务可以有两种使用方法:
?
它可以被启动并允许运行直到有人停止它或者它自己停止。这种模式,它是通过调用Context.startService()启动,调用Context.stopService()停止。它可以通过调用Service.stopSelf()或Service.stopSelfResult()停止自己。无论startService()被调用多少次,只需要调用一次stopService()去停止服务。
可以使用它定义和输出的接口程式化的操作。客户端建立一个连接到服务对象,用那个连接调用到服务。连接是通过调用Context.bindService()建立的。关闭连接可以调用Context.unbindService().多个客户端可以绑定到一个服务。如果服务还没有启动,bindService()会启动服务。.这两种模式不是完全分开的。你可以绑定到一个通过startService()启动的服务。例如,一个后台音乐播放服务可以通过调用startService()启动,带有一个意图对象识别要播放的音乐。后来,可能当用户想对播放器执行一些操作,或获得当前歌曲信息。一个活动会通过调用bindService()建立一个连接到服务,像这种情况,stopService()实际上不会停止服务直到上一个绑定关闭。像活动一样,一个服务也有它的生命周期方法,你可以实现它们去监听服务状态的改变。但它们比活动方法要少,只有三个,并且是公共的,不是受保护的:
?
voidonCreate()voidonStart(Intentintent)voidonDestroy()
通过实现这些方法,你可以监听服务生命周期的两个嵌套循环:
?
一个服务的整个生存期发生在onCreate()被调用时开始,onDestroy()返回后结束。类似于一个活动,一个服务在onCreate()中做它的初始化设置,在onDestroy()中释放所有依然持有的资源。例如,一个音乐播放服务可以在onCreate()创建一个线程,音乐在这里开始播放,然后在onDestroy()中结束这个线程。服务的活跃周期开始于调用onStart()方法。这个方法持有传递到startService()的意图对象。音乐服务会打开意图去寻找要播放那首音乐并且开始播放。
?
没有相应的停止服务的调用——没有onStop()方法.onCreate()和onDestroy()方法可以被所有服务调用,无论他们通过Context.startService()启动或者是Context.bindService()。然而,onStart()方法只能通过startService()调用,用于启动服务。如果一个服务允许其他程序绑定到它上面,这里有附加的调用方法去实现:
IBinderonBind(Intentintent)booleanonUnbind(Intentintent)voidonRebind(Intentintent)
onBind()回调传递给bindService的意图对象,onUnbind()持有传递给unbindService()的意图。如果服务允许绑定,onBind()会返回通讯通道用于客户端与服务通讯。如果一个新客户端连接到服务onUnbind()方法可以访问调用
onRebind()方法。.下图阐明了一个服务的回调方法。尽管它分离了通过startService创建服务与通过bindService()创建服务,记住,任何服务,无论怎样启动,都潜在允许客户端绑定到它上面,所以任何服务都可以接收onBind()和onUnbind()调用。
广播接收器的生命周期(广播接收器的生命周期(Broadcastreceiverlifecycle))
广播接收器有一个回调方法:
voidonReceive(ContextcurContext,IntentbroadcastMsg)
当一个广播消息到达接收器时,Android调用它的onReceive()方法并传递给它信息中包含的意图对象。广播接收器被认为只在处理这个方法时是激活的,当onReceive()返回后,它就处于非激活状态。一个含有激活状态的广播接收器的进程是受到保护的,不允许被杀死。但一个进程只含有非激活组件,当内存耗尽其他进程需要内存时,则可以被系统随时杀死。
这就有一个问题需要解决,在一个广播消息的响应是耗时的(持久的)情况下,有些事情需要在另个一个独立非主线程中完成,用户界面的组件运行在这个线程中。如果onReceive()产生线程并返回,包括新线程在内的整个进程都会被认为是非活跃的(除非其他应用程序组件在这个线程中是活动状态的),该进程就有被杀死的危险。这个问题的解决方案就是为onReceive()启动一个服务并让服务去做这个工作,让系统知道这个进程中仍然有工作处于活动状态。
进程和生命周期(进程和生命周期(Processesandlifecycles))
Android系统试图维持一个应用程序进程尽可能长的时间,但是最终它需要在内存过低的情况下移除旧的进程。Android将每个进程放入一个“重要性层级”中,这个“重要性层级”是基于运行在进程中的组件和组件的状态来决定的。由此来确定那个进程继续保持,哪些进程被杀死。重要性最低的进程最先被淘汰,接下来是第二低的,以此类推。有五个层次等级。下面的列表是按照重要性顺序排列的:1.
o
前台进程是用户当前做的事情需要的进程。一个进程满足下列条件的任意一条则被认为是前台进程:进程正在运行一个与用户交互的活动。(即活动对象的onResume()方法被调用后).进程宿住一个服务,该服务绑定到一个正在与用户交互的活动上。进程有一个服务对象正在执行该服务生命周期的一个回调方法(onCreate(),onStart(),或onDestroy()).进程有一个广播接收器对象正在执行它的onReceive()方法。
oo
o
只有很少的前台进程会在一个特定的时间存在。如果内存过低以至于它们都不能继续运行,它们会在最近一次求助后被杀死。一般来说,这时,设备已经达到内存分页调度状态,所以杀死
一些前台进程是为了保持用户界面应答的敏捷性。2.
o
可见进程是指不包含任何前台组件,但依然对用户在屏幕上所见到的有影响。一个进程是否为可见进程通过下列任一条件判断:进程宿住一个活动,该活动不在前台,但依然对用户可见(它的onPause()方法被调用)。这种情况会发生在例如前台活动是一个对话框,允许前一个活动在它后面可见。进程宿住一个服务,该服务绑定到一个可见的活动。
o
一个可见进程被认为是极端重要的,并且除非需要保持前台进程运行,否则不会被杀死。3.服务进程是一个运行的服务,该服务通过startService()方法启动,并且没有被分入上两个高级类别。尽管服务进程不是直接关系到任何用户所见,但它们一般做的是用户所关心的(如MP3后台播放,下载网络数据)。所以系统保持他们运行,除非没有足够的内存去保持所有前台的和可视进程。后台进程是持有一个活动,该活动当前不是对用户可见(活动对象的onStop()方法被调用)。这些进程不会对用户体验产生直接影响,并且可以在任意时间被杀死为前台的,可见的和服务进程释放内存。通常有很多后台进程运行,所以他们被保存在一个LRU(leastrecentlyused)列表中,以此确定与活动相关的进程最后
4.
被用户看见的最接近的时间,即上次被杀死的时间。如果一个活动正确的实现了它生命周期的方法,并且捕获了它的当前状态,杀死它的进程不会对用户体验产生有害的影响。空进程是指没持有任何活动状态的应用程序组件。保持这样一个进程唯一的原因就是作为缓存提高启动时间,下次一个组件需要运行在它里面。系统会经常杀死这样的进程用于平衡进程缓存和底层内核缓存之间的全局系统资源。根据当前进程中活动组件的重要性,Android会将一个进程排列到它所能达到的最高级。例如,如果一个进程宿住一个服务和一个可见活动,进程会被排列为可见进程,而不是服务进程。5.另外,一个进程的排列因为另一个进程的依赖或许会增加。一个进程服务另一个进程,这个进程进程永远不会比它服务的进程排名低的。例如,如果一个内容供应者在进程A中是用于服务一个进程B中的客户端,或者一个进程A中的服务绑定到一个进程B中的组件,进程A会永远被认为最少与进程B同样重要。因为一个运行服务的进程排列要比一个后台活动进程高,启动一个长时间运行的活动,或许启动一个服务去做这个操作要比简单的产生一个线程要好,特别是操作看上去比活动持久。这种例子如播放后台音乐和上传照相机拍的照片到网站上。使用一
个服务的话,不管这个活动发生了什么,都能够担保这个操作最少是“服务进程”的优先权等级。正如以前在Broadcastreceiverlifecycle部分提到的,这就是与广播接收器应该采用服务而不是简单的放入线程中时间消耗操作相同的原因。