面对每次打开 iOS 应用时。都是否想到过其 App 运行过程:从启动到按 Home 键回到主屏幕,从运行中到按两下 Home 键进入任务管理界面,甚至 iOS9 后支持多任务的 iPad 当两个 App 出现在同一屏幕上,这几个情况 App 所处于什么状态,其过渡中又在进行怎样的状态切换呢?

App状态变化的历史

在 iOS4 之前的 App 时代,整个界面只允许一个 App 处于运行状态,而当某个 App 处于运行状态时意味着其他所有的App的活动都被终止并退出,无法接受任何事件。一个应用的状态转换只有运行、退出之间的变换。在 iOS4 之后的 iPhone 进入了多任务处理时代,也意味了当从一个应用切换到另一个应用时,系统不会马上将原来的应用终止退出,将其状态变成了 suspend,而另一个应用的状态变成了 running。

AppDelegate

运行一个 App,应用程序会自动创建 UIApplication 单例对象,并用于引用着,其 UIApplicaiton 实例的 delegate 被赋值为 AppDelegate 实例对象,其也是一个单例,也永远不会被释放直到该 App 退出。而 AppDelegate 对象有着一系列在程序启动时的跟踪状态变化,处理从其他应用跳转、启动到此应用,或者后台运行代码的方法。以下是 AppDelegate 做为 App 的根对象的主要功能:

  1. 运行在启动时自己用来初始化应用的特点代码。
  2. 响应App从启动,到后台,到前台,到退出时各个状态时的指定方法。
  3. 负责处理接收推送通知或本地通知启动App的情况,处理手机低内存警告时的情况。
  4. 负责处理应用程序的状态保存和恢复。
  5. 响应由App处理的事件,而是指定控制器或视图。
  6. 处理数据的存储。

App状态的代理事件

新建一个 Signle View Application 后,系统会自动创建 AppDelegate 文件,系统默认提供的方法表示了 App 不同的运行状态。

application:willFinishLaunchingWithOptions

在 App 启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复

application:didFinishLaunchingWithOptions

表示 App 将从未运行状态进入运行状态,用于对 App 的初始化操作。

applicationDidBecomeActive

application:didFinishLaunchingWithOptions: 之后调用,表示应用进入 active 状态,在 applicationWillResignActive 调用后 App 又回到 active 状态时也会调用。

applicationWillResignActive

当某一操作阻塞 App 界面时会调用,如按 Home 键回到键入主界面,划出通知栏或者设置,临时的电话和通知,支持多任务的 iPad 进行侧边栏滑动时等情况下都会调用,使得 App 进入 inactive 状态,往往操作结束后会调用 applicationDidBecomeActive,使得 App 回到 active 状态。

applicationDidEnterBackground

在 App 进入后台后调用,之前肯定会调用 applicationWillResignActive 方法,允许执行短时间的任务代码如清理内存。

applicationWillEnterForeground

当 App 将从后台回到前台时调用,之后肯定调用 applicationDidBecomeActive 方法表示程序进入 active 状态,但 App 第一次启动时不是从后台启动,所以首次加载时不会调用此方法。

applicationWillTerminate

当 App 将要被系统杀死时调用,通常用来对 App 进行清理工作,释放资源,保存数据等等,所执行的操作官方推荐最多耗时5s左右的事件来完成和返回,若时间过长系统杀死应用时会将使操作失败。其调用时机比较特殊,如果运行的 App 直接退出(非进入后台),会调用;若应用是从中断状态(此状态期间 App 无法接收任何事件)被系统退出,则不会被调用。

注意点

iOS8 中,App 会在根控制器初始化后调用 viewDidAppear 方法之后才会调用 applicationDidBecomeActive,对于 App 启动的事件顺序为

  1. application:didFinishLaunchingWithOptions:
  2. viewDidLoad
  3. viewWillAppear
  4. viewDidAppear
  5. applicationDidBecomeActive

而在iOS7和9中,App在调用 applicationDidBecomeActive 方法后才会调用根控制器的 viewDidAppear,其调用顺序为

  1. application:didFinishLaunchingWithOptions:
  2. viewDidLoad
  3. viewWillAppear
  4. applicationDidBecomeActive
  5. viewDidAppear

在这两情况下如果要对 UIApplicationDidBecomeActiveNotification 进行通知注册时就需要考虑其 iOS 的兼容性,否则就会出现问题了。

参考


本文完