ios 12 及之前
一、APP的生命状态:
- Not running(未运行):程序未运行
- Inactive(未激活):程序在前台运行,但没有接收到事件。在没有事件处理情况下程序通常停留在这个状态。
- Active ( 激活 ): 程序在前台运行而且接收到了事件。这也是前台的一个正常的模式。
- Backgroud ( 后台 ): 程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态。
- Suspended ( 挂起 ): 程序在后台但是却不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在 内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。
二、 关于app生命周期中的各方法
func application(_:willFinishLaunchingWithOptions:)
func application(_:didFinishLaunchingWithOptions:)
// app初始化
func applicationDidBecomeActive(UIApplication)
// app已经被激活
func applicationWillResignActive(UIApplication)
// app即将被挂起
func applicationDidEnterBackground(UIApplication)
// app已经进入后台
func applicationWillEnterForeground(UIApplication)
// app即将回到前台
func applicationWillTerminate(UIApplication)
// app即将被杀死
三、App运行过程中根据状态变化代理方法的调用顺序
- 启动app:
application(_:willFinishLaunchingWithOptions:)
application(_:didFinishLaunchingWithOptions:)
applicationDidBecomeActive(UIApplication)
application:didReceiveRemoteNotification//接受处理消息通知
- 双击home键使app上移挂起
applicationWillResignActive(UIApplication)
- 再次双击home键使app下移归位
applicationDidBecomeActive(UIApplication)
- 单击home键使app进入后台
applicationWillResignActive(UIApplication)
applicationDidEnterBackground(UIApplication)
- 打开正运行在后台的app
applicationWillEnterForeground(UIApplication)
applicationDidBecomeActive(UIApplication)
- 再次切到后台
applicationWillResignActive(UIApplication)
applicationDidEnterBackground(UIApplication)
- 点击通知中心里面的远程推送,使App从后台 进入前台
applicationWillEnterForeground(UIApplication)
application:didReceiveRemoteNotification // 接收、处理消息通知
applicationDidBecomeActive(UIApplication)
- 杀死App进程(终止程序)
applicationWillTerminate(UIApplication)
- 从APP切换到微信之类的其他应用之后,再切换回来时
applicationWillEnterForeground(UIApplication)
application:openURL:sourceApplication // 应用间传值
applicationDidBecomeActive(UIApplication)
iOS 13 之后
一、查看一下新的Xcode项目模板
在新的Xcode11当中创建新的项目,会看到自动生成AppDelegate.swift与SceneDelegate.swift文件。
除了这两个委托文件之外,Xcode还做了其他一些事情。打开Info.plist,会看到一个叫做Application Scene Manifest的新key。
Enable Multiple Windows默认键值为NO,如果设置为YES则允许你的app在ipadOS中多开。
Application Session Role数组中:
- Configuration的名称,必须是唯一的
- scene的代理类名,通常为SceneDelegate。
- scene用于创建初始UI的storyboard名称。(该设置可以在Xcode 12项目的Project Properties配置中找到。)
AppDelegate中的SceneDelegate、UISceneSession和Application Scene Manifest是如何一起创建多窗口应用的呢?
- 首先,我们看SceneDelegate类。 它管理scene的生命周期,处理各种响应,诸如 sceneDidBecomeActive(
以上是关于iOS App生命周期及AppDelegate方法的主要内容,如果未能解决你的问题,请参考以下文章
iOS程序执行顺序和UIViewController 的生命周期(整理)