Managing Your App’s Life Cycle官方文档
当app处在前台或后端时能响应系统通知,并且处理其他系统相关事件。
1.概述
app所处的状态决定了他能做什么和不能做什么。
当app状态变化时,UIKit通过调用委托对象的函数来通知你:
- 在IOS13及更新的版本中,基于scene的app使用UISceneDelegate对象来响应生命周期事件。
- 在IOS12及更早版本,使用UIApplicationDelegate对象来响应生命周期事件。
2.响应基于场景的生命周期事件
如果app支持scenes,那么UIKit会为每个场景分配单独的生命周期事件。
一个场景代表app的UI在设备上运行的一个实例。
用户可以为每个app创建多个场景。
因为每个场景有他自己的生命周期,所以每个场景能够运行在不同的状态下。
注意:
场景支持是一项可选功能。要启用的话需要按照Specifying the Scenes Your App Supports的描述,将UIApplicationSceneManifest添加到app的Info.plist
文件中。
下图表示场景的状态转换过程:
- 当用户或者系统为app请求一个新的场景时,UIKit会创建该场景,并将其置于unattached状态。
- 用户请求的场景会迅速移到前台,显示在屏幕上。
系统请求的场景通常会移到后台,以便于处理事件。 - 当用户关闭界面时,UIKit会将相关的场景移到background 状态,并最终置于suspended 状态。
- UIKit可以随时断开background状态或suspended状态的场景的连接,以回收其资源,从而使该场景返回unattached状态。
使用场景转换来够执行以下任务:
- 当UIKit为app连接了一个场景时,要配置场景的初始化UI,并加载场景所需数据。
- 当场景转到foreground-active状态时,要配置UI并准备和用户交互。参考Preparing Your UI to Run in the Foreground。
- 退出foreground-active状态之后,要保存数据并quiet 你的app的行为。参考Preparing Your UI to Run in the Background。
- 在进入background状态之后,要结束关键任务、尽可能多的释放内存、并为app snapshot做好准备。参考Preparing Your UI to Run in the Background。
- 断开场景连接时,要清除相关的共享资源。
- 除了场景相关的事件,你也必须使用
UIApplicationDelegate
对象响应app的启动。参考Responding to the Launch of Your App。
3.响应基于app的生命周期事件
在IOS12及早期不支持场景的版本,UIKit将所有的生命周期事件分配给 UIApplicationDelegate
对象。
app delegate 管理着app的所有窗口(包括显示在单独屏幕上的窗口),这就导致了app状态的转换影响着app的所有UI(包括外接显示器的内容)。
下图表示包含app delegate对象的状态转换过程:
- 启动之后,系统根据UI是否要显示在屏幕上将app置于inactive 或者background状态。
- 启动到前台时,系统自动将app转到active 状态。
- 之后,状态一直在active 和background 直接切换,直到app结束。
使用app转换来完成以下工作:
- 登陆时,初始化app的数据结构和UI。参考Responding to the Launch of Your App。
- 在活动状态时,要将UI配置完成,并准备和用户交互。参考 Preparing Your UI to Run in the Foreground。
- deactivation之后,要保存数据,并且quiet 你的app的行为。参考Preparing Your UI to Run in the Background。
- 进入background 状态之后,要结束关键任务、尽可能多的释放内存、并为app snapshot做好准备。参考Preparing Your UI to Run in the Background。
- 结束时,立即停止所有工作,释放共享资源。参考
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
对象需要被处理时,收到该事件。
4.4 Time changes
当接收到的几种不同的时间变化时,收到该事件。例如当运营商发送时间更新时。
参考applicationSignificantTimeChange(_:)
。
4.5 Open URLs
当app需要打开资源时,收到该事件。