一方面、應(yīng)用的狀態(tài)
1.未運行(Not running)
程序沒啟動
2.未激活(Inactive)
程序在前臺運行宰译,不過沒有接收到事件彬犯。
一般每當應(yīng)用要從一個狀態(tài)切換到另一個不同的狀態(tài)時泡一,中途過渡會短暫停留在此狀態(tài)。唯一在此狀態(tài)停留時間比較長的情況是:當用戶鎖屏時杭跪,或者系統(tǒng)提示用戶去響應(yīng)某些(諸如電話來電、有未讀短信等)事件的時候驰吓。
3.激活(Active)
程序在前臺運行而且接收到了事件涧尿。這也是前臺的一個正常的模式
4.后臺(Backgroud)
程序在后臺而且能執(zhí)行代碼,大多數(shù)程序進入這個狀態(tài)后會在在這個狀態(tài)上停留一會檬贰。時間到之后會進入掛起狀態(tài)姑廉。有的程序經(jīng)過特殊的請求后可以長期處于 Backgroud 狀態(tài)
5.掛起(Suspended)
程序在后臺不能執(zhí)行代碼。系統(tǒng)會自動把程序變成這個狀態(tài)而且不會發(fā)出通知翁涤。當掛起時桥言,程序還是停留在內(nèi)存中的,當系統(tǒng)內(nèi)存低時葵礼,系統(tǒng)就把掛起的程序清除掉号阿,為前臺程序提供更多的內(nèi)存。
二鸳粉、iOS 12 及以下
1.AppDelegate 的相關(guān)方法
//在App啟動時調(diào)用表示應(yīng)用加載進程已經(jīng)開始,常用來處理應(yīng)用狀態(tài)的存儲和恢復(fù)
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions
{
NSLog(@"app status : willFinishLaunchingWithOptions");
return YES;
}
//表示App將從未運行狀態(tài)進入運行狀態(tài),用于對App的初始化操作
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"app status : didFinishLaunchingWithOptions");
return YES;
}
//當應(yīng)用即將進入前臺運行時調(diào)用
- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSLog(@"app status : applicationDidBecomeActive");
}
//當應(yīng)用即將進從前臺退出時調(diào)用
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"app status : applicationWillResignActive");
}
//當程序從后臺將要重新回到前臺(但是還沒變成Active狀態(tài))時候調(diào)用
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"app status : applicationWillEnterForeground");
}
//當應(yīng)用開始在后臺運行的時候調(diào)用
- (void)applicationDidEnterBackground:(UIApplication *)application
{
//NSLog(@"程序進入后臺");
NSLog(@"app status : applicationDidEnterBackground");
}
//當前應(yīng)用即將被終止扔涧,在終止前調(diào)用的函數(shù)。通常是用來保存數(shù)據(jù)和一些退出前的清理工作届谈。如果應(yīng)用當前處在suspended枯夜,此方法不會被調(diào)用。 該方法最長運行時限為5秒疼约,過期應(yīng)用即被kill掉并且移除內(nèi)存
- (void)applicationWillTerminate:(UIApplication *)application
{
NSLog(@"app status : applicationWillTerminate");
}
2.常用狀態(tài)的生命周期方法
(1)程序啟動
狀態(tài)由 Not running -> Inactive -> Active
//依次調(diào)用的方法如下:
willFinishLaunchingWithOptions
didFinishLaunchingWithOptions
applicationDidBecomeActive
(2)點擊home鍵或者鎖屏
狀態(tài)由 Active -> Inactive -> Backgroud
//依次調(diào)用的方法如下:
applicationWillResignActive
applicationDidEnterBackground
(3)重新進入前臺
狀態(tài)由 Backgroud -> Inactive -> Active
//依次調(diào)用的方法如下:
applicationWillEnterForeground
applicationDidBecomeActive
(4)在前臺卤档,雙擊home鍵,手動殺掉APP
狀態(tài)由 Active -> Inactive -> Backgroud -> end
//依次調(diào)用的方法如下:
applicationWillResignActive
applicationDidEnterBackground
applicationWillTerminate
三程剥、iOS 13 及以上
iOS13 以后劝枣,SceneDelegate 將負責 AppDelegate 的某些功能。 window(窗口)的概念被scene(場景)的概念所代替织鲸, 一個 scene 現(xiàn)在可以作為您應(yīng)用程序的用戶界面和內(nèi)容的載體舔腾。iOS13 以前一個應(yīng)用程序可以有不止一個 window,同樣現(xiàn)在一個應(yīng)用程序也可以有不止一個 scene搂擦。
1.AppDelegate 相關(guān)方法
/**
app啟動完畢后就會調(diào)用
1.程序直接啟動稳诚,launchOptions為nil
2.由其他應(yīng)用通過openurl啟動,則UIApplicationLaunchOptionsURLKey對應(yīng)的是啟動的url瀑踢,
UIApplicationLaunchOptionsSourceApplicationKey對應(yīng)的是源應(yīng)該程序的bundle id
3.由本地通知啟動扳还,則UIApplicationLaunchOptionsLocationKey對應(yīng)的是啟動應(yīng)用程序的本地通知
4.由遠程通知啟動才避,則UIApplicationLaunchOptionsRemoteNotificationKey對應(yīng)的是啟動應(yīng)用程序的遠程通知
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
#pragma mark - UISceneSession lifecycle
/**
方法會返回一個UISceneConfiguration對象,其中包含場景詳細信息氨距,包括要創(chuàng)建的場景類型桑逝,用于管理場景的代理對象以及包含要顯示的初始視圖控制器的StoryBoard。 如果未實現(xiàn)此方法俏让,則必須在應(yīng)用程序的Info.plist文件中提供場景配置數(shù)據(jù)楞遏。
注意:該代理方法中返回UISceneConfiguration對象的配置名為Default Configuration,則系統(tǒng)就會自動去調(diào)用SceneDelegate這個類首昔。這樣SceneDelegate和AppDelegate產(chǎn)生了關(guān)聯(lián)寡喝。
*/
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
/**
在分屏中關(guān)閉其中一個或多個scene時候回調(diào)用,可以在該函數(shù)中銷毀場景所使用的資源勒奇。
該方法與application(_:didDiscardSceneSessions:)的區(qū)別是预鬓,該方法僅在場景斷開連接時調(diào)用,不會被丟棄撬陵,它可能會重新連接珊皿。而application(_: didDiscardSceneSessions:)發(fā)生在使用應(yīng)用程序切退出場景時。
*/
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
}
2.SceneDelegate 相關(guān)方法
/**
SceneDelegate的最重要的函數(shù)巨税,相當于iOS 12上的 application(_:didFinishLaunchingWithOptions:) 函數(shù)蟋定。當將scene添加到app中時scene(_:willConnectTo:options:)函數(shù)會被調(diào)用的,因此在這里對scene進行配置草添。 這里需要特別注意的是驶兜,使用一個SceneDelegate來配置App中的所有scene,并且這個delegate通常會響應(yīng)任何scene远寸。在上面的代碼中抄淑,我們可以手動地設(shè)置了視圖控制器堆棧,稍后會進行詳細介紹驰后。
*/
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
}
/**
當scene與app斷開連接是調(diào)用(注意肆资,以后它可能被重新連接)
*/
- (void)sceneDidDisconnect:(UIScene *)scene {
}
/**
當用戶開始與scene進行交互(例如從應(yīng)用切換器中選擇場景)時,會調(diào)用
*/
- (void)sceneDidBecomeActive:(UIScene *)scene {
}
/**
當用戶停止與scene交互(例如通過切換器切換到另一個場景)時調(diào)用
*/
- (void)sceneWillResignActive:(UIScene *)scene {
}
/**
當scene變成活動窗口時調(diào)用灶芝,即從后臺狀態(tài)變成開始或恢復(fù)狀態(tài)
*/
- (void)sceneWillEnterForeground:(UIScene *)scene {
}
/**
當scene進入后臺時調(diào)用郑原,即該應(yīng)用已最小化但仍存活在后臺中
*/
- (void)sceneDidEnterBackground:(UIScene *)scene {
}
3.常用狀態(tài)的生命周期方法
(1)程序啟動
狀態(tài)由 Not running -> Inactive -> Active
//依次調(diào)用的方法如下:
//AppDelegate:
didFinishLaunchingWithOptions
//SceneDelegate
willConnectToSession
sceneWillEnterForeground
sceneDidBecomeActive
(2)點擊home鍵或者鎖屏
狀態(tài)由 Active -> Inactive -> Backgroud
//依次調(diào)用的方法如下:
sceneWillResignActive
sceneDidEnterBackground
(3)重新進入前臺
狀態(tài)由 Backgroud -> Inactive -> Active
//依次調(diào)用的方法如下:
sceneWillEnterForeground
sceneDidBecomeActive
(4)在前臺,雙擊home鍵夜涕,手動殺掉APP
狀態(tài)由 Active -> Inactive -> Backgroud -> end
//依次調(diào)用的方法如下:
sceneWillResignActive
sceneDidDisconnect
didDiscardSceneSessions