iOS App 生命周期

一方面、應(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犯犁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子女器,更是在濱河造成了極大的恐慌酸役,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涣澡,居然都是意外死亡贱呐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門暑塑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吼句,“玉大人,你說我怎么就攤上這事事格。” “怎么了搞隐?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵驹愚,是天一觀的道長。 經(jīng)常有香客問我劣纲,道長逢捺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任癞季,我火速辦了婚禮劫瞳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绷柒。我一直安慰自己志于,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布废睦。 她就那樣靜靜地躺著伺绽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嗜湃。 梳的紋絲不亂的頭發(fā)上奈应,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音购披,去河邊找鬼杖挣。 笑死,一個胖子當著我的面吹牛刚陡,可吹牛的內(nèi)容都是我干的惩妇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼橘荠,長吁一口氣:“原來是場噩夢啊……” “哼屿附!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哥童,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤挺份,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贮懈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匀泊,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡优训,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了各聘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揣非。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖躲因,靈堂內(nèi)的尸體忽然破棺而出早敬,到底是詐尸還是另有隱情,我是刑警寧澤大脉,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布搞监,位于F島的核電站,受9級特大地震影響镰矿,放射性物質(zhì)發(fā)生泄漏琐驴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一秤标、第九天 我趴在偏房一處隱蔽的房頂上張望绝淡。 院中可真熱鬧,春花似錦苍姜、人聲如沸牢酵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茁帽。三九已至,卻和暖如春屈嗤,著一層夾襖步出監(jiān)牢的瞬間潘拨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工饶号, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铁追,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓茫船,卻偏偏與公主長得像琅束,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子算谈,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • App狀態(tài)的代理事件 新建一個Signle View Application后,系統(tǒng)會自動創(chuàng)建AppDelegat...
    戀空K閱讀 2,581評論 0 3
  • iOS App的生命周期 程序啟動順序圖 iOS程序的啟動執(zhí)行順序.jpg具體執(zhí)行流程 (BOOL)applica...
    草根小強閱讀 1,088評論 0 1
  • 項目主函數(shù) 一個iOS項目默認有一個AppDelegate.Swift文件涩禀,這是一個UIKit 框架提供的UIAp...
    _涼風_閱讀 3,529評論 1 3
  • 應(yīng)用啟動執(zhí)行流程圖 1.應(yīng)用的生命周期 應(yīng)用的生命周期的方法一般寫在AppDelegate中 各個程序運行狀態(tài)時代...
    末上閱讀 1,463評論 0 2
  • APP生命周期 要知道APP的生命周期,首先要了解一下生命周期的5種狀態(tài)然眼,結(jié)合狀態(tài)理解生命周期的使用艾船。 應(yīng)用的狀態(tài)...
    滾滾貓閱讀 5,791評論 0 23