Managing Your App's Life Cycle

Managing Your App’s Life Cycle官方文档

当app处在前台或后端时能响应系统通知,并且处理其他系统相关事件。

1.概述

app所处的状态决定了他能做什么和不能做什么。
当app状态变化时,UIKit通过调用委托对象的函数来通知你:

  1. 在IOS13及更新的版本中,基于scene的app使用UISceneDelegate对象来响应生命周期事件。
  2. 在IOS12及更早版本,使用UIApplicationDelegate对象来响应生命周期事件。

2.响应基于场景的生命周期事件

如果app支持scenes,那么UIKit会为每个场景分配单独的生命周期事件。
一个场景代表app的UI在设备上运行的一个实例。
用户可以为每个app创建多个场景。
因为每个场景有他自己的生命周期,所以每个场景能够运行在不同的状态下。

注意:
场景支持是一项可选功能。要启用的话需要按照Specifying the Scenes Your App Supports的描述,将UIApplicationSceneManifest添加到app的Info.plist文件中。

下图表示场景的状态转换过程:

  1. 当用户或者系统为app请求一个新的场景时,UIKit会创建该场景,并将其置于unattached状态。
  2. 用户请求的场景会迅速移到前台,显示在屏幕上。
    系统请求的场景通常会移到后台,以便于处理事件。
  3. 当用户关闭界面时,UIKit会将相关的场景移到background 状态,并最终置于suspended 状态。
  4. UIKit可以随时断开background状态或suspended状态的场景的连接,以回收其资源,从而使该场景返回unattached状态。

An illustration showing the state transitions for a scene-based app. Scenes start in the unattached state and move to the foreground-active or background state. The foreground-inactive state acts as a transition state.

使用场景转换来够执行以下任务:

  1. 当UIKit为app连接了一个场景时,要配置场景的初始化UI,并加载场景所需数据。
  2. 当场景转到foreground-active状态时,要配置UI并准备和用户交互。参考Preparing Your UI to Run in the Foreground
  3. 退出foreground-active状态之后,要保存数据并quiet 你的app的行为。参考Preparing Your UI to Run in the Background
  4. 在进入background状态之后,要结束关键任务、尽可能多的释放内存、并为app snapshot做好准备。参考Preparing Your UI to Run in the Background
  5. 断开场景连接时,要清除相关的共享资源。
  6. 除了场景相关的事件,你也必须使用UIApplicationDelegate对象响应app的启动。参考Responding to the Launch of Your App

3.响应基于app的生命周期事件

在IOS12及早期不支持场景的版本,UIKit将所有的生命周期事件分配给 UIApplicationDelegate对象。

app delegate 管理着app的所有窗口(包括显示在单独屏幕上的窗口),这就导致了app状态的转换影响着app的所有UI(包括外接显示器的内容)。

下图表示包含app delegate对象的状态转换过程:

  1. 启动之后,系统根据UI是否要显示在屏幕上将app置于inactive 或者background状态。
  2. 启动到前台时,系统自动将app转到active 状态。
  3. 之后,状态一直在active 和background 直接切换,直到app结束。

An illustration showing the state transitions for an app without scenes. The app launches into the active or background state. An app transitions through the inactive state.

使用app转换来完成以下工作:

  1. 登陆时,初始化app的数据结构和UI。参考Responding to the Launch of Your App
  2. 在活动状态时,要将UI配置完成,并准备和用户交互。参考 Preparing Your UI to Run in the Foreground
  3. deactivation之后,要保存数据,并且quiet 你的app的行为。参考Preparing Your UI to Run in the Background
  4. 进入background 状态之后,要结束关键任务、尽可能多的释放内存、并为app snapshot做好准备。参考Preparing Your UI to Run in the Background
  5. 结束时,立即停止所有工作,释放共享资源。参考applicationWillTerminate(_:)

4.响应其他重要事件

除了处理生命周期事件之外,app也要准备处理下述事件。

使用UIApplicationDelegate对象能处理下述大部分事件。有些情况也要使用通知来处理,以便于能够从app其他部分进行响应。

4.1 Memory warnings

当内存使用过高时,会受到内存警告。
此时需要减少app使用的内存。

参考Responding to Memory Warnings

4.2 Protected data becomes available/unavailable

当用户锁定或者解锁设备时,会收到该事件。

参考 applicationProtectedDataDidBecomeAvailable(_:)applicationProtectedDataWillBecomeUnavailable(_:)

4.3 Handoff tasks

NSUserActivity对象需要被处理时,收到该事件。

参考application(_:didUpdate:)

4.4 Time changes

当接收到的几种不同的时间变化时,收到该事件。例如当运营商发送时间更新时。

参考applicationSignificantTimeChange(_:)

4.5 Open URLs

当app需要打开资源时,收到该事件。

参考 application(_:open:options:)

0%