在UIApplication的状态转换过程中根据不同的情况会发送不同的Delegate消息,下面主要描述UIApplication状态转换的各种情况以及发送哪些Delegate消息及消息的顺。
首先将涉及到UIApplication状态转换的Delegate消息编号如下:
1、application:didFinishLaunchingWithOptions:
2、application:openURL:sourceApplication:annotation:
3、applicationDidBecomeActive:
4、applicationWillResignActive:
5、applicationDidEnterBackground:
6、applicationWillEnterForeground:
7、applicationWillTerminate:
则对于下面各种操作Delegate消息的发送顺序为
1、通过SpringBoard第一次启动,消息顺序为1-3
2、通过URL第一次启动,消息顺序为1-2-3
3、运行过程中按Home键,消息顺序为 4-5
若为iOS4.0以下或者Info.plist中设置了UIApplicationExitsOnSuspend,则继续发送消息7,然后程序终止;
否则根据程序设置进入Background运行模式或者Suspend状态。
4、运行过程中按锁屏键,消息顺序与按Home键相同,区别在于此时会关闭所有网络连接(iOS5.0+)
5、运行过程中被短信/电话等中断,则发送消息 4
若用户选择短信/电话,则发送消息 5,后续流程与按Home键相同。
若用户忽略短信/电话,则发送消息 3,回到Foreground运行状态。
6、运行过程中双击Home键显示任务切换器,会发送消息 4
若选择其他程序或者单击Home键返回到SpringBoard,则发送消息 5,后续流程与按Home键相同。
若再次双击Home键返回APP,则发送消息 3,回到Foreground运行状态。
7、通过SpringBoard或者任务切换器再次启动时,消息顺序为6-3.
从后台重新返回前台的转换过程中,即6与3消息的中间,在5.1的模拟器中显示的是Default.png,但在真实设备上显示的进入后台的screenshot。
8、通过URL再次启动时,消息顺序6-2-3.
9、程序在Background/Suspend状态时,用户双击Home键。
如果程序同时启用了Required background modes,比如App plays audio,此时如果程序home到后台,并且正在播放音乐,此时用户手动/自动中止程序是会触发applicationWillTerminate:的。如果你使用了后台任务处理beginBackgroundTaskWithExpirationHandler也是同样道理。
如果程序在后台时app并没有后台任务执行,则会进入Suspend,此时手动/自动中止程序则不会触发applicationWillTerminate:的。
10、当程序在Suspend状态时,若内存紧张,系统也会将程序立即终止以回收内存,此时也不会有任何消息发送。
总结:
1、程序在Suspend状态被中止时不会触发applicationWillTerminate:
2、程序在Background状态并且有后台任务执行时被中止则会触发applicationWillTerminate:
所以对于需要在程序退出时保存数据,状态等的需求,最好在applicationDidEnterBackground:以及applicationWillTerminate:例都做处理。
二.状态转换广播通知
以上消息只会发给AppDelegate,如果想在UIViewController中监听UIApplication的状态变化,可以监听以下通知
UIApplicationDidBecomeActiveNotification(iOS2.0+)
UIApplicationDidEnterBackgroundNotification(iOS4.0+)
UIApplicationWillEnterForegroundNotification(iOS4.0+)
UIApplicationWillResignActiveNotification(iOS2.0+)
UIApplicationWillTerminateNotification(iOS2.0+)
使用下面代码可获取当前Application的运行状态
[UIApplication sharedApplication].applicationState
状态包括UIApplicationStateActive UIApplicationStateInactive UIApplicationStateBackground
当APP在某个UIViewController显示时进入后台或者从后台返回到前台时,并不会调用viewWillDisappear:,viewDidDisappear:,viewWillAppear:,viewDidAppear:系列方法,但此时的视图确实发生Disappear以及Appear的事件。
如果在这种情况下需要做些处理的话,可以在viewDidAppear:中注册对上述通知的监听,在接收到APP进入后台以及从后台返回时通知时做相应的处理。在viewWillDisappear:中我们可以取消对上述通知的监听,因为如果当前显示的不是此视图,就没有Disappear以及Appear的事件发生,也就不需要在前后台切换时做任何特殊处理。
需要这样做的情况有:
在View Appear时需要重新请求数据时;
当视图包含动画,在进入后台模式时动画会停止,返回到前台时需要重新启动动画时;
三.CoreLocation 更新消息
如果使用CoreLocation,当程序运行在Background模式下出现位置更新时,还有特殊的消息需要处理,见CoreLocation Background Update Messaging。