程序的5种状态
如图,iOS应用主要分为5种状态。1 [^2]
Not Running (非运行状态)。应用没有运行或被系统终止。
Inactive(前台非活动状态)。应用正在进入前台状态,但不能接受事件处理。app可能正在执行其他代码。
Active(前台活动状态)。应用进入前台状态,能接受事件处理。
Background(后台状态)。应用进入后台后,依然能够执行代码。如果有可执行的代码,就会执行代码,如果没有可执行的代码或者可执行的代码执行完毕,应用会马上进入挂起状态。
Suspended(挂起状态)。处于挂起的应用进入一种“冷冻”状态,不能执行代码。如果系统内存不够,应用会被终止。
关于AppDelegate中的各种委托方法和通知
UIApplicationDidFinishLaunchingNotification (通知名称) ---> application:didFinishLaunchingWithOptions:(委托方法):在应用程序启动后直接进行应用程序级编码的主要方式。
UIApplicationWillResignActiveNotification(通知名称)--->applicationWillResignActive:(委托方法):用户按下主屏幕按钮调用,不要在此方法中假设将进入后台状态,只是一种临时变化,最终将恢复到活动状态
UIApplicationDidBecomActiveNotification(通知名称) ---->applicationDidBecomeActive:(委托方法):应用程序按下主屏幕按钮后想要将应用程序切换到前台时调用,应用程序启动时也会调用,可以在其中添加一些应用程序初始化代码
> applicationWillResignActive:和applicationDidBecomeActive:这两个方法代表着应用程序从活动状态过度到不活动状态,是启用或禁用任何动画、应用程序的音频或其他处理应用程序表示(向用户)的项目的不错位置。
UIApplicationDidEnterBackgroundNotification(通知名称)----->applicationDidEnterBackground:(委托方法):应用程序在此方法中释放所有可在以后重新创建的资源,使计时器失效,保存所有用户数据,关闭网络连接等。如果需要,也可以在这里请求在后台运行更长时间。如果在这里花费了太长时间(超过5秒),系统将断定应用程序的行为异常并终止他。
UIApplicationWillEnterForegroundNotification(通知名称) ---->applicationWillEnterForeground:(委托方法):当应用程序在applicationDidEnterBackground:花费了太长时间,终止后,应该实现此方法来重新创建在applicationDidEnterBackground中销毁的内容,比如重新加载用户数据、重新建立网络连接等。
> 请注意,当巧用applicationDidEnterBackground:时,可以安全地假设最近也调用了applicationWillResignActive
UIApplicationWllTerminateNotification(通知名称) ----> applicationWillTerminate:(委托方法):现在很少使用,只有在应用程序已进入后台,并且系统出于某种原因决定跳过暂停状态并终止应用程序时,才会真正调用它。
状态跃迁过程的调用方法
非运行状态–应用启动场景
场景描述:用户点击应用图标,可能是第一次启动,也可能是应用终止后重新启动。共经历两个阶段3个状态。
Not running -> Inactive -> Active
Not running -> Inactive阶段。调用application:disFinishLaunchingWithOptions:方法,发出UIApplicationDidFinishLaunchingNotification通知。
Inactive -> Active阶段。调用applicationDidBecomeActive:方法,发出UIApplicationDidBecomeActiveNotification通知。
双击Home键–应用处于前台非活动状态
场景描述:应用处于运行状态(即Active状态)时,双击Home键。
Active -> Inactive
Active -> Inactive阶段。调用applicationWillResignActive:方法,发出UIApplicationWillResignActiveNotification通知。
双击Home键后再回到前台–应用处于前台由非活动状态变为活动状态
场景描述:应用处于运行状态(即Active状态)时,双击Home键。
Inactive -> Active
Inactive -> Active阶段。调用applicationDidBecomeActive:方法,发出UIApplicationDidBecomeActiveNotification通知。
点击Home键/锁屏–应用退出场景
场景描述:应用处于运行状态(即Active状态)时,点击Home键/锁屏或者有其他的应用导致当前应用终止。
状态跃迁过程分两种情况:
可以在后台运行或者挂起;
不可以在后台运行或者挂起。
对于第一种情况:共经历3个阶段4个状态。
Active -> Inactive -> Background -> Suspended
Active -> Inactive阶段。调用applicationWillResignActive:方法,发出UIApplicationWillResignActiveNotification通知。
Inactive -> Background阶段。应用从非活动状态进入到后台。
Background -> Suspended阶段。调用applicationDidEnterBackground:方法,发出UIApplicationDidEnterBackgroundNotification通知。
对于第二种情况:共经历4个阶段5个状态。
Active -> Inactive -> Background -> Suspended -> Not running
Active -> Inactive阶段。应用由活动状态转为非活动状态。
Inactive -> Background阶段。应用从非活动状态进入到后台。
Background -> Suspended阶段。调用applicationDidEnterBackground:方法,发出UIApplicationDidEnterBackgroundNotification通知。
Suspended -> Not running阶段。调用applicationWillTerminate:方法,发出UIApplicationWillTerminateNotification通知。
挂起重新运行场景–切换app到前台/解锁使app处于前台
场景描述:挂起状态的应用重新运行。共经历3个阶段4个状态。
Suspended -> Background -> Inactive -> Active
Suspended -> Background阶段。应用从挂起状态进入后台。
Background -> Inactive阶段。调用applicationWillEnterForeground:方法,发出UIApplicationWillEnterForegroundNotification通知。
Inactive -> Active阶段。调用applicationDidBecomeActive:方法,发出UIApplicationDidBecomeActiveNotification通知。
内存清除–应用终止场景
场景描述:应用在后台处理完成时进入挂起状态(一种休眠状态)。如果这时发出低内存警告,为了满足其他应用对内存的需求,该应用就会被清除内存而终止运行。这时不会再调用applicationWillTerminate:方法,即也不会发出UIApplicationWillTerminateNotification通知。
内存清除时应用终止运行。有两种情况:
系统强制清除内存
由使用者从任务栏中手动清除(即删除应用)
内存清除后如果应用再次运行,上一次的运行状态不会被保存,相当于应用第一次运行。这种场景下,应用不会调用任何方法,也不会发出任何通知。
- iOS应用的生命周期 http://www.jianshu.com/p/d7cbc7db40c3
[^2]:App Programming Guide for iOS https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html ↩