以下是对 App 生命周期中各个阶段的调用顺序的详细解释:
- 未运行(Not Running):应用程序未启动或者被终止。
- 待激活(Inactive):应用程序在前台运行,但是不能接收事件(UIEvent)。应用程序在不同状态之间切换时,经常会存在该状态。例如:在 App 显示启动页时,是从 Not Running 到 Active 的过程,中间会存在Inactive 状态。
- 激活(Active):应用程序在前台运行,可以接收事件(UIEvent)。
- 后台运行(Background):应用程序处于后台并且正在执行代码。绝大多数应用程序在进入挂起状态时,会短暂经历这个状态。
- 挂起(Suspended):应用程序处于后台,并且不能执行代码。此时,当内存不足时,操作系统有可能会自动把挂起状态的应用程序移除,以便给处于 Active 状态的应用程序提供更多的内存空间。
当用户点击 App 的图标时,应用程序会经历 Not Running、Inactive、Active 的过程。在这个过程中,APPDelegate 对象的如下方法会被调用:
- application:willFinishLaunchingWithOptions::当应用程序启动时,这个方法会被调用,用于检查是否有任何剩余的启动任务需要完成。
- application:didFinishLaunchingWithOptions::当应用程序完成启动并准备好运行时,这个方法会被调用。你可以在这里执行任何必要的初始化操作。
- applicationDidBecomeActive::当应用程序进入前台并开始接收用户交互时,这个方法会被调用。
当用户点击 Home 键时,应用程序会经历从 Active 到 Background 再到 Suspended 的过程,在这个过程中,会调用 AppDelegate 对象中的 applicationWillResignActive: 以及 applicationDidEnterBackground: 方法。在实际的开发过程中,当用户点击 Home 键使应用程序切换到后台时,需要在这些方法中对数据或者状态进行保存。
在默认情况下,applicationDidEnterBackground: 方法有大概5秒钟的时间来完成一些任务。假如说5秒钟的时间不够,则需要调用 beginBackgroundTaskWithExpirationHandler: 方法来申请更多的后台运行时间,后台运行的时间由 backgroundTimeRemaining 属性来确定。