深度解析iOS应用程序的生命周期(二)
转载自: http://www.csdn.net/article/2015-06-23/2825023/2
应用程序的状态和多任务
有时系统会从App一种状态切换另一种状态来响应系统发生的事件。例如,当用户按下Home键、电话打入或其他中断发生时,当前运行的应用程序会切换状态来响应。应用程序的状态有以下几种:
- Not running:App还没运行
- Inactive:App运行在foreground但没有接收事件
- Active:App运行在foreground和正在接收事件
- Background:运行在background和正在执行代码
- Suspended:运行在background但没有执行代码
大多数发生状态转换时都会调用delegate对象对应的方法来响应App的状态改变。下面汇总了delegate对象的所有方法,当App状态发生转换时,你可能会使用到它们。
- application:willFinishLaunchingWithOptions: - 这个方法是你在启动时的第一次机会来执行代码
- application:didFinishLaunchingWithOptions: - 这个方法允许你在显示app给用户之前执行最后的初始化操作
- applicationDidBecomeActive: - app已经切换到active状态后需要执行的操作
- applicationWillResignActive: - app将要从前台切换到后台时需要执行的操作
- applicationDidEnterBackground: - app已经进入后台后需要执行的操作
- applicationWillEnterForeground: - app将要从后台切换到前台需要执行的操作,但app还不是active状态
- applicationWillTerminate: - app将要结束时需要执行的操作
现在讲下App启动、来回切换App和锁屏时状态的切换和调用对应哪些delegate对象的方法:
- App启动和active/inactive
如 图所示,当App启动时,首先由not running状态切换到inactive状态,此时调用application:didFinishLaunchingWithOptions:方法; 然后由inactive状态切换到active状态,此时调用applicationDidBecomeActive:方法。
当App发生中断时,由active状态切换到inactive状态,此时调用applicationWillResignActive:方法。
- 来回切换App
如 图所示,当切换到另一个App时,由状态active切换到inactive,此时调用applicationWillResignActive:方法; 然后从inactive状态切换到running状态,此时调用applicationDidEnterBackground:方法。
而 当切换回本来的App时,由running状态切换到inactive状态,此时调用applicationWillEnterForeground:方 法,然后由inactive状态切换到active状态,调用applicationDidBecomeActive:方法。
- 锁屏
如 何所示,当手机锁屏时,由状态active切换到inactive,此时调用applicationWillResignActive:;然后再由 inactive状态切换到running状态,此时调用applicationDidEnterBackground:方法。
更多关于app状态切换以及调用app delegate哪些方法,请观看WWDC 2011 Session的session_320__adopting_multitasking_in_your_app视频。
应用程序的终止
系 统常常是为其他app启动时由于内存不足而回收内存最后需要终止应用程序,但有时也会是由于app很长时间才响应而终止。如果app当时运行在后台并且没 有暂停,系统会在应用程序终止之前调用applicationWillTerminate:来保存用户的一些重要数据以便下次启动时恢复到app原来的状 态。
总结
本文总结了iOS应用程序从启动 到结束过程中有哪些关键对象在参与,以及当用户与系统交互时产生事件时,系统利用main run loop来管理事件循环,决定将事件交给系统哪些对象处理和如何处理。而当App启动、来回切换App和锁屏时,App的状态如何切换和调用对应的哪些 app delegate对象来处理。
扩展阅读
- App Programming Guide for iOS
- Developing iOS 7 App for iPhone and iPad
- 深入理解RunLoop
- Objective-C Autorelease Pool 的实现原理