对于应用的每个可能的运行时状态,系统都有对应每个状态的不同期望。当状态转换发生时,系统通知应用对象,该对象又通知它的委托。你能使用UIApplicationDelegate 协议的状态转换方法来检测这些状态的转换并作出恰当地响应。例如,当从前台转换到后台,你可以写出任何未保存的数据并停止任何正在进行的任务。接下来的几个部分为如何实现你的状态转换代码提供了指导和提示。
在启动时该做什么
当应用被启动时(无论是在前台还是后台),使用应用委托的application:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions:方法来做以下操作:
- 检查启动选项字典的内容,了解关于应用为何被启动的信息,并作出恰当响应。
- 初始化应用的关键数据结构。
- 准备应用的窗口和视图用以显示:
- 使用 OpenGL ES绘制的应用,都不能使用这些方法来准备它们的绘制环境。任何OpenGL ES绘制应被延迟到applicationDidBecomeActive:方法进行。
- 从application:willFinishLaunchingWithOptions:方法显示应用的窗口。UIKit推迟制作可视窗口直到application:didFinishLaunchingWithOptions:方法返回之后。
在启动的时候,系统自动加载应用的主storyboard文件,并加载初始视图控制器。对于那些支持状态恢复的应用,状态恢复机制把你的界面恢复到它之前的调用application:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions: 方法之间的状态。使用application:willFinishLaunchingWithOptions:方法来显示应用窗口,并决定是否应该恢复状态。使用 application:didFinishLaunchingWithOptions:方法来做任何最终的调整以显示应用的用户界面。
你的 application:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions:方法要尽可能的简洁,以便减少应用启动时间。应用的启动、初始化、以及开始处理事件的总时间应该小于5秒钟。如果应用没有及时的完成启动周期,系统会因此杀死它。因此,任何可能拖慢启动时间的任务(例如访问网络),都应该安排在辅助线程里执行。
启动周期
当应用启动时,它就会从非运行状态进入活动状态或后台状态,会在非活动状态短暂停留。作为启动周期的一部分,系统会为应用创建一个进程和主线程,并且在主线程调用应用的main函数。由Xcode项目创建的默认的main函数,把控制权交给UIKit框架,这个框架完成绝大多数初始化应用的工作,并为运行做好准备。
图4-1展示了当应用在前台启动的时候,会发生的一系列事件。包括应用会调用的委托方法。
图4-1 在前台启动应用
当应用在后台启动的时候——通常用来处理一些后台事件——启动周期与图4-2相比有略微差异。最主要的区别是,应用不进入活跃状态,它进入后台状态来处理事件,事件处理完毕后有可能会被挂起。当在后台启动的时候,系统仍然加载应用用户界面文件,但它不显示在应用的视窗上。
图4-2 在后台启动应用
以横幅方式显示的通知不会中断应用。横幅出现在应用窗口的上边缘下方,而应用可以继续接收触摸事件。但是,如果用户下拉横幅通知以显示通知中心,则应用进入非活跃状态,如同基于警告的中断一般。用户操作对应用的影响亦如前所述。用户可以使用Settings应用来配置通知显示的类型,横幅或者是警告。
按下休眠/唤醒按钮是另一种类型的中断,导致应用被临时停用。当用户按下这个按钮时,系统会禁用触摸事件,让应用进入后台,设置应用的applicationState值为UIApplicationStateBackground,并锁定屏幕。锁屏会给使用加密保护文件的应用带来额外的后果。这些后果在What to Do When Your App Is Interrupted Temporarily中以提到。
(未完待续......)
网友评论