iphone 处理关键的应用程序任务和定制应用程序的行为

  以下抄自苹果官方文档,描述几个所有iPhone应用程序都应该处理的任务。这些任务是整个应用程序生命周期的一部分,因此也是将应用程序集成到iPhone OS系统的重要方面。


初始化和终止

在初始化和终止过程中,UIApplication类会向应用程序的委托发送恰当的消息,使其执行必要的任务。虽然系统并不要求您的应用程序响应这些消息,但是,几乎所有的iPhone应用程序都应该处理这些消息。初始化是您为应用程序准备用户界面及使其进入初始运行状态的阶段。类似地,在终止阶段,您应该把未保存的数据和关键的应用程序状态写入磁盘。

由于一个iPhone应用程序必须在其它应用程序启动之前退出,所以花在初始化和终止阶段的执行时间要尽可能少。初始化阶段并不适合装载大的、却又不需要马上使用的数据结构。在开始阶段,您的目标应该是尽可能快地显示应用程序的用户界面,最好是使它进入最后一次退出的状态。如果您的应用程序在启动过程中需要更多的时间来装载网络数据,或者执行一些可能很慢的任务,则应该首先显示出用户界面并运行起来,然后在后台线程中执行速度慢的任务。这样,您就有机会向用户显示进度条和其它反馈信息,指示应用程序正在装载必要的数据,或者正在执行重要的任务。

表1-5列举出UIApplicationDelegate协议定义的方法,您在应用程序委托中需要实现这些协议方法,以处理初始化和终止的事务。表中还列出了您在每个方法中应该执行的关键事务。

表1-5  应用程序委托的责任

委托方法

描述

applicationDidFinishLaunching:

使用这个方法来将应用程序恢复到上一个会话的状态。您也可以在这个方法中执行应用程序数据结构和用户界面的定制初始化。

applicationWillTerminate:

使用这个方法来将未存数据或关键的应用程序状态存入磁盘。您也可以在这个方法中执行额外的清理工作,比如删除临时文件。

响应中断

除了Home按键可以终止您的应用程序之外,系统也可以暂时中断您的应用程序,使用户得以响应一些重要的事件。举例来说,应用程序可能被呼入的电话、SMS信息、日历警告、或者设备上的Sleep按键所打断。按下Home按键会终止您的应用程序,而上述这些中断则只是暂时的。如果用户忽略这些中断,您的应用程序可以象之前那样继续运行;然而,如果用户决定接电话或回应SMS信息,系统就会开始终止您的程序。

图1-6显示了在电话、SMS信息、或者日历警告到来时发生的事件序列。紧接在图后面的步骤说明更为详细地描述了事件序列的关键点,包括您在响应每个事件时应该做的事项。这个序列并不反映当用户按下Sleep/Wake按键时发生的情景;该场景的事件序列在步骤说明之后的部分进行描述。

图1-6  中断过程的事件流程

The flow of events during an interruption
  1. 系统检测到有电话、SMS信息、或者日历警告发生。

  2. 系统调用应用程序委托applicationWillResignActive:方法,同时禁止将触摸事件发送给您的应用程序。

    中断会导致应用程序暂时失去控制权。如果控制权的丢失会影响程序的行为或导致不好的用户体验,您就应该在委托方法中采取恰当的步骤进行规避。举例来说,如果您的程序是个游戏,就应该暂停。您还应该禁用定时器、降低OpenGL的帧率(如果正在使用OpenGL的话),通常还应该使应用程序进行休眠状态。在这休眠状态下,您的应用程序继续运行,但是不应该做任何重要的工作。

  3. 系统显示一个带有事件信息的警告窗口。用户可以选择忽略或响应该事件。

  4. 如果用户忽略该事件,系统就调用应用程序委托的applicationDidBecomeActive:方法,并重新开始向应用程序传递触摸事件。 

    您可以在这个方法中重新激活定时器、提高OpenGL的帧率、以及将应用程序从休眠状态唤醒。对于处于暂停状态的游戏,您应该考虑使它停在当时的状态上,等待用户做好重新玩的准备。举例来说,您可以显示一个警告窗口,而窗口中带有重新开始的控件。

  5. 如果用户选择响应该事件(而不是忽略),则系统会调用应用程序委托的applicationWillTerminate:方法。您的应用程序应该正常终止,保存所有必要的上下文信息,使应用程序在下一次启动的时候可以回到同样的位置。

    在您的应用程序终止之后,系统就开始启动负责中断的应用程序。

根据用户对中断的不同响应,系统可能在中断结束之后再次启动您的应用程序。举例来说,如果用户接听一个电话并在完成后挂断,则系统会重新启动您的应用程序;如果用户在接听电话过程中回到Home屏幕或启动另一个程序,则系统就不再启动您的应用程序了。

重要提示:当用户接听电话并在通话过程中重新启动您的应用程序时,状态条的高度会变大,以反映当前用户正在通话中。类似地,当用户结束通话的时候,状态条的高度会缩回正常尺寸。您的应用程序应该为状态条高度的变化做好准备,并据此调整内容区域的尺寸。视图控制器会自动处理这个行为,然而,如果您通过代码进行用户界面的布局,就需要在视图布局以及通过layoutSubviews方法处理动态布局变化时考虑状态条的高度。

在运行您的应用程序时,如果用户按下设备的休眠/唤醒按键,系统会调用应用程序委托的applicationWillResignActive:方法,停止触摸事件的派发,然后使设备进入休眠状态。之后,当用户唤醒设备时,系统会调用应用程序委托的applicationDidBecomeActive:方法,并再次开始向应用程序派发事件。如同处理其它中断一样,您应该使用这些方法来使应用程序进入休眠状态(或者暂停游戏)及再次唤醒它们。在休眠时,您的应用程序应该尽可能少用电力。

观察低内存警告

当系统向您的应用程序发送低内存警告时,您需要加以注意。当可用内存的数量降低到安全阈值以下时,iPhone OS会通知最前面的应用程序。如果您的应用程序收到这种警告,就必须尽可能多地释放内存,即释放不再需要的对象或清理易于在稍后进行重建的缓存。

UIKit提供如下几种接收低内存警告的方法:

一旦收到上述的任何警告,您的处理代码就应该立即响应,释放所有不需要的内存。视图控制器应该清除当前离屏的视图对象,您的应用程序委托则应该释放尽可能多的数据结构,或者通知其它应用程序对象释放其拥有的内存。

如果您的定制对象知道一些可清理的资源,则可以让该对象注册UIApplicationDidReceiveMemoryWarningNotification通告,并在通告处理器代码中直接释放那些资源。如果您通过少数对象来管理大多数可清理的资源,且适合清理所有的这些资源,则同样可以让这些对象进行注册。但是,如果您有很多可清理的对象,或者仅希望释放这些对象的一个子集,则在您的应用程序委托中进行释放可能更好一些。

重要提示:和系统的应用程序一样,您的应用程序总是需要处理低内存警告,即使在测试过程中没有收到那些警告,也一样要进行处理。系统在处理请求时会消耗少量的内存。在检测到低内存的情况时,系统会将低内存警告发送给所有正在运行的进程(包括您的应用程序),而且可能终止某些后台程序(如果必要的话),以减轻内存的压力。如果释放后内存仍然不够—可能因为您的应用程序发生泄露或消耗太多内存—系统仍然可能会终止您的应用程序。

定制应用程序的行为

有几种方法可以对基本的应用程序行为进行定制,以提供您希望的用户体验。本文的下面部分将描述一些必须在应用程序级别进行的定制。

以景观模式启动

为了配合Home屏幕的方向,iPhone OS的应用程序通常以肖像模式启动。如果您的应用程序既可以以景观模式运行,也可以以肖像模式运行,那么,一开始应该总是以纵向模式启动,然后由视图控制器根据设备的方向旋转用户界面。但是,如果您的应用程序只能以景观模式启动,则必须执行下面的步骤,使它一开始就以景观模式启动。

重要提示:上面描述的步骤假定您的应用程序使用视图控制器来管理视图层次。视图控制器为处理方向改变和复杂的视图相关事件提供了大量的基础设施。如果您的应用程序不使用视图控制器—游戏和其它基于OpenGL ES的应用程序可能是这样的—就必须根据需要旋转绘图表面(或者调整绘图命令),以便将您的内容以景观模式展示出来。

UIInterfaceOrientation属性提示iPhone OS在启动时应该配置应用程序状态条(如果有的话)的方向,就象配置视图控制器管理下的视图方向一样。在iPhone OS 2.1及更高版本的系统中,视图控制器会尊重这个属性,将视图的初始方向设置为指定的方向。使用这个属性相当于在applicationDidFinishLaunching:方法的一开始执行UIApplicationsetStatusBarOrientation:animated:方法。

请注意:在v2.1之前的iPhone OS系统中,如果要以景观模式启动基于视图控制器的应用程序,需要在上文描述的所有步骤的基础上对应用程序根视图的转换矩阵进行一个90度的旋转。在iPhone OS 2.1之前,视图控制器并不会根据UIInterfaceOrientation键的值自动进行旋转,当然在iPhone OS 2.1及更高版本的系统中不需要这个步骤。

posted on 2011-09-22 10:59  110440  阅读(527)  评论(1编辑  收藏  举报

导航