iOS APPDelegate和app生命周期
AppDelegate的作用
AppDelegate是一个用于管理应用共享行为的对象。它继承了UIResponder类,实现了UIApplicationDelegate代理协议。AppDelegate实际上是应用的根对象,和UIApplication一起管理系统的一些交互。UIKit在应用启动周期的早期就创建了AppDelegate对象,所以它会一直存在。
AppDelegate可以被用来处理以下任务:
初始化应用的中心数据结构
配置应用场景
响应外部的通知,例如 内存不足、下载完成等
响应针对应用本身的事件,例如 应用被唤醒、被打断等
在启动时注册服务,例如Apple Push Notification服务
app的5种状态
未运行状态(not running state)
应用还未被启动,或已经被系统终止
不活跃状态(inactive state)
应用进入前台,但是未收到任何事件
活跃状态(active state)
应用进入前台,并且可以处理事件
后台状态(background state)
如果有可执行代码,应用将会执行代码;如果没有可执行代码,或已经执行结束,应用将立即被挂起
挂起状态(suspended state)
应用在内存中,不再执行代码。如果系统内存不足,将终止应用
app的生命周期函数
// 告诉AppDelegate应用开始初始化,但状态恢复尚未发生
func application(UIApplication, willFinishLaunchingWithOptions: [UIApplication.LaunchOptionsKey : Any]?)
// 初始化完成,应用开始运行
func application(UIApplication, didFinishLaunchingWithOptions: [UIApplication.LaunchOptionsKey : Any]?)
// 应用已经进入活跃状态
func applicationDidBecomeActive(UIApplication)
// 应用将进入非活跃状态
func applicationWillResignActive(UIApplication)
// 应用进入后台
func applicationDidEnterBackground(UIApplication)
// 应用将进入前台
func applicationWillEnterForeground(UIApplication)
// 应用将被终止
func applicationWillTerminate(UIApplication)
app的状态变化和相应的生命周期函数
冷启动(启动时app被kill或者没有被打开过)
willFinishLaunchingWithOptions
(初始化应用)→didFinishLaunchingWithOptions
(完成初始化)→applicationDidBecomeActive
(应用进入前台,变成活跃状态)
热启动(启动时app被切到后台)
当用户点开在后台的应用,系统会将应用转为不活跃状态,然后变成活跃状态
applicationWillEnterForeground
(应用重启,进入不活跃状态) →applicationDidBecomeActive
(应用进入前台,变成活跃状态)
手动kill app
applicationWillResignActive
→applicationDidEnterBackground
→applicationWillTerminate
被来电打断,再重新回到app
应用会暂时进入不活跃状态,并维持这个状态直到用户选择接受,或忽视中断。如果用户忽视中断,应用将重新进入活跃状态,否则应用将被挂起。
忽视中断:
applicationWillResignActive
(收到来电,应用进入不活跃状态)→applicationDidBecomeActive
(拒绝来电,应用进入活跃状态)
接受中断:
applicationWillResignActive
(收到来电,应用进入不活跃状态)→applicationDidEnterBackground
(接听来电,应用被挂起)
拓展
除了在AppDelegate,其他地方如何监听app的生命周期
可以通过通知来监听app的生命周期
didFinishLaunchingNotification
didBecomeActiveNotification
didEnterBackgroundNotification
willEnterForegroundNotification
willResignActiveNotification
willTerminateNotification
app进入后台时,可以执行代码吗?
可以。
当app进入后台处于挂起状态时,会被哪些事件唤醒
定时事件、推送、位置更新、下载完成通知等
为何[UIApplication.State
]
(https://developer.apple.com/documentation/uikit/uiapplication/state)只有3个状态
因为我们只能判断应用是否活跃,是否在后台,所以UIApplication.State只有active, inactive, background三种状态。
https://developer.apple.com/documentation/uikit/uiapplicationdelegate
https://manasaprema04.medium.com/application-life-cycle-in-ios-f7365d8c1636