首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》18.4 应用状态与状态切换

关灯直达底部

为了保存BNRItem对象,Homepwner会在进入后台运行状态(background state)时进行固化操作。本节将介绍iOS应用可以拥有的各种状态、导致应用切换状态的原因,以及如何在应用发生状态切换时执行指定的代码。图18-6是这些信息的总览图。

图18-6 iOS应用的多种状态

当应用没有运行时,会处在未运行状态(not running state),不会执行任何代码,也不会占用RAM。

当应用启动后,会进入激活状态(active state),可以显示界面、接收事件并处理事件。

当应用处在激活状态时,可能会被某个系统事件打断,临时进入未激活状态(inactive state)。这类系统事件包括收到短消息、收到推送、来电或闹钟到点等。发生系统事件时,iOS会显示相应的提示界面并遮住当前应用的部分界面。当应用处于未激活状态时,其大部分界面是可见的(iOS显示的提示界面只会遮住部分窗口),也可以执行代码,但是不会接收事件。通常情况下,应用只会在未激活状态停留很短的时间。按下位于iOS设备顶部的锁定按钮,当前处于激活状态的应用会切换至未激活状态,并且会保留未激活状态,直到设备解锁。

当用户按下主屏幕按钮(Home button)时,或者通过某种途径切换至另一个应用时,当前运行的应用会从激活状态切换为后台运行状态(background state)(实际上,应用会先从激活状态切换为未激活状态,停留极短的时间,然后再进入后台运行状态)。处于后台运行状态的应用仍然可以执行代码,但是其界面不再可见,也不能接收事件。默认情况下,进入后台运行状态的应用有大约10秒的时间,然后会进入挂起状态(suspended state)。读者在开发应用时,不能依赖这个不确定的时间差,而是应该尽快保存用户数据并释放系统资源。

处于挂起状态的应用不能执行代码,其界面也不可见,并且会释放在挂起状态下无须使用的所有资源。挂起的应用就像是进行了“低温干燥”的处理,可以在用户再次启动时快速解冻。表18-1列出了上述应用状态的主要特性。

表18-1 应用的各种状态

连按设备的主屏幕按钮进入多任务界面(multitasking display),iOS会显示所有处于后台运行状态和挂起状态的应用(还会显示最近运行过的但已经被终止的应用),如图18-7所示。

图18-7 多任务界面中所有处于后台运行状态或挂起状态的应用

当iOS系统认为当前可用的内存过低时,会根据需要终止处于挂起状态的应用。当系统有足够多的空余内存时,处于挂起状态的应用可以一直保留该状态。当处于挂起状态的应用即将被系统终止时,就不会收到相应的通告,系统会直接将其从内存中移除(终止后的应用,其图标可能还会留在多任务界面中,按下图标会重新启动应用)。

当应用状态发生变化时,UIApplication对象的委托对象会收到相应的消息。以下列出的是在UIApplicationDelegate协议中声明的部分消息,这些消息都和应用状态发生变化有关(图18-6描述了这些状态的转化过程)。

- (BOOL)application:(UIApplication *)app

didFinishLaunchingWithOptions:(NSDictionary *)options

- (void)applicationDidBecomeActive:(UIApplication *)app;

- (void)applicationWillResignActive:(UIApplication *)app;

- (void)applicationDidEnterBackground:(UIApplication *)app;

- (void)applicationWillEnterForeground:(UIApplication *)app;

为应用委托对象实现上述方法,就能在应用状态发生变化时执行指定的代码。当应用切换至后台运行状态时,应该保存修改过的数据及应用的各种状态(这里的状态不是指应用状态)。这是因为在应用进入挂起状态前,后台运行状态应用能够执行代码的最后一个状态。一旦应用进入挂起状态,就随时有可能会被iOS系统终止。