iOS APPDelegate和app生命周期

2023-07-10  本文已影响0人  cain07

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
applicationWillResignActiveapplicationDidEnterBackgroundapplicationWillTerminate

被来电打断,再重新回到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

上一篇下一篇

猜你喜欢

热点阅读