iOS開(kāi)發(fā)之應(yīng)用的生命周期

AppDelegate類(lèi)是應(yīng)用程序委托對(duì)象,這個(gè)類(lèi)中繼承的一系列方法在應(yīng)用生命周期的不同階段會(huì)被調(diào)用,其定義如下(Objective-C版本):

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions;

- (void)applicationWillResignActive:(UIApplication*)application;

- (void)applicationDidEnterBackground:(UIApplication*)application;

- (void)applicationWillEnterForeground:(UIApplication*)application;

- (void)applicationDidBecomeActive:(UIApplication*)application;

- (void)applicationWillTerminate:(UIApplication*)application;


下面要介紹iOS應(yīng)用的5種狀態(tài):

□ Not Running(非運(yùn)行狀態(tài))。應(yīng)用沒(méi)有運(yùn)行或被系統(tǒng)終止。

□ Inactive(前臺(tái)非活動(dòng)狀態(tài))。應(yīng)用正在進(jìn)入前臺(tái)狀態(tài),但是還不能接受事件處理。

□ Active(前臺(tái)活動(dòng)狀態(tài))。應(yīng)用進(jìn)入前臺(tái)狀態(tài),能接受事件處理。

□ Background(后臺(tái)狀態(tài))。應(yīng)用進(jìn)入后臺(tái)后,依然能夠執(zhí)行代碼。如果有可執(zhí)行的代碼,就會(huì)執(zhí)行代碼,如果沒(méi)有可執(zhí)行的代碼或者將可執(zhí)行的代碼執(zhí)行完畢,應(yīng)用會(huì)馬上進(jìn)入掛起狀態(tài)。

□ Suspended(掛起狀態(tài))。被掛起的應(yīng)用進(jìn)入一種“冷凍”狀態(tài),不能執(zhí)行代碼。如果系統(tǒng)內(nèi)存不夠,應(yīng)用會(huì)被終止。


在應(yīng)用狀態(tài)躍遷的過(guò)程中,iOS系統(tǒng)會(huì)回調(diào)AppDelegate中的一些方法,并且發(fā)送一些通知。選取幾個(gè)主要的方法和通知進(jìn)行詳細(xì)介紹:

1、應(yīng)用啟動(dòng)并進(jìn)行初始化時(shí)會(huì)調(diào)用application:didFinishLaunchingWithOptions:方法并發(fā)出UIApplicationDidFinishLaunchingNotification通知,這個(gè)階段會(huì)實(shí)例化根視圖控制器。

2、應(yīng)用進(jìn)入前臺(tái)并處于活動(dòng)狀態(tài)時(shí)會(huì)調(diào)用applicationDidBecomeActive:方法并發(fā)出UIApplicationDidBecomeActiveNotification通知,這個(gè)階段可以恢復(fù)UI的狀態(tài)(例如游戲的狀態(tài)等)。

3、應(yīng)用從活動(dòng)狀態(tài)進(jìn)入非活動(dòng)狀態(tài)時(shí)會(huì)調(diào)用applicationWillResignActive:方法并發(fā)出UIApplicationWillResignActiveNotification通知,這個(gè)階段可以保存UI的狀態(tài)(例如游戲的狀態(tài)等)。

4、應(yīng)用進(jìn)入后臺(tái)時(shí)會(huì)調(diào)用applicationDidEnterBackground:方法并發(fā)出UIApplicationDidEnterBackgroundNotification通知,這個(gè)階段可以保存用戶(hù)數(shù)據(jù),釋放一些資源(例如釋放數(shù)據(jù)庫(kù)資源等)。

5、應(yīng)用進(jìn)入到前臺(tái),但是還沒(méi)有處于活動(dòng)狀態(tài)時(shí)會(huì)調(diào)用applicationWillEnterForeground:方法并發(fā)出UIApplicationWillEnterForegroundNotification通知,這個(gè)階段可以恢復(fù)用戶(hù)數(shù)據(jù)。

6、應(yīng)用被終止時(shí)會(huì)調(diào)用applicationWillTerminate:方法并發(fā)出UIApplicationWillTerminateNotification通知,這個(gè)階段釋放一些資源,也可以保存用戶(hù)數(shù)據(jù)。


為了更直觀地了解各狀態(tài)及其相應(yīng)的方法、通知間的關(guān)系,下面以幾個(gè)應(yīng)用場(chǎng)景為切入點(diǎn)進(jìn)行系統(tǒng)分析:

1、非運(yùn)行狀態(tài)——應(yīng)用啟動(dòng)場(chǎng)景

用戶(hù)點(diǎn)擊應(yīng)用圖標(biāo)的時(shí)候,可能是第一次啟動(dòng)這個(gè)應(yīng)用,也可能是應(yīng)用終止后再次啟動(dòng)。該場(chǎng)景的狀態(tài)躍遷共經(jīng)歷2個(gè)階段3個(gè)狀態(tài):Not Running——Inactive——Active。

□?Not Running——Inactive階段:調(diào)用application:didFinishLaunchingWithOptions:方法,發(fā)出UIApplicationDidFinishLaunchingNotification通知。

□?Inactive——Active階段:調(diào)用applicationDidBecomeActive:方法,發(fā)出UIApplicationDidBecomeActiveNotification通知。

2、點(diǎn)擊Home鍵——應(yīng)用退出場(chǎng)景

應(yīng)用處于運(yùn)行狀態(tài),點(diǎn)擊Home鍵應(yīng)用會(huì)退出。該場(chǎng)景的狀態(tài)躍遷過(guò)程可以分為兩種狀態(tài):可以在后臺(tái)運(yùn)行或者掛起,不可以在后臺(tái)運(yùn)行或者掛起。根據(jù)工程屬性文件(如info.plist)中的相關(guān)屬性Application does not run in background的設(shè)置,可以控制這兩種狀態(tài)(如果采用文本編輯器打開(kāi)info.plist文件,該設(shè)置項(xiàng)對(duì)應(yīng)的鍵是UIApplicationExitsOnSuspend)。

狀態(tài)躍遷的第一種情況:應(yīng)用可以在后臺(tái)運(yùn)行或者掛起,該場(chǎng)景的狀態(tài)躍遷過(guò)程共經(jīng)歷3個(gè)階段4個(gè)狀態(tài):Active——Inactive——Bacground——Suspended。

□?Active——Inactive階段:調(diào)用applicationWillResignActive:方法,發(fā)出UIApplicationWillResignActiveNotification通知。

□?Inactive——Bacground階段:應(yīng)用從非活動(dòng)狀態(tài)進(jìn)入到后臺(tái)(不涉及要重點(diǎn)說(shuō)明的方法和通知)。

□?Bacground——Suspended階段:調(diào)用applicationDidEnterBackground:方法,發(fā)出UIApplicationDidEnterBackgroundNotification通知。

狀態(tài)躍遷的第二種情況:應(yīng)用不可以在后臺(tái)運(yùn)行或者掛起。其狀態(tài)躍遷過(guò)程共經(jīng)歷4個(gè)階段5個(gè)狀態(tài):Active——Inactive——Bacground——Suspended——Not Running。

□?Active——Inactive階段:調(diào)用applicationWillResignActive:方法,發(fā)出UIApplicationWillResignActiveNotification通知。

□?Inactive——Bacground階段:應(yīng)用從非活動(dòng)狀態(tài)進(jìn)入到后臺(tái)(不涉及要重點(diǎn)說(shuō)明的方法和通知)。

□?Bacground——Suspended階段:調(diào)用applicationDidEnterBackground:方法,發(fā)出UIApplicationDidEnterBackgroundNotification通知。

□?Suspended——Not Running階段:調(diào)用applicationWillTerminate:方法,發(fā)出UIApplicationWillTerminateNotification通知。

3、掛起重新運(yùn)行場(chǎng)景

掛起狀態(tài)的應(yīng)用重新運(yùn)行,該場(chǎng)景的狀態(tài)躍遷過(guò)程共經(jīng)歷3個(gè)階段4個(gè)狀態(tài):Suspended——Background——Inactive——Active。

□?Suspended——Background。應(yīng)用從掛起狀態(tài)進(jìn)入后臺(tái)(不涉及要重點(diǎn)說(shuō)明的方法和通知)。

□?Background——Inactive階段:調(diào)用applicationWillEnterForeground:方法發(fā)出UIApplicationWillEnterForegroundNotification通知。

□?Inactive——Active階段:調(diào)用applicationDidBecomeActive:方法發(fā)出UIApplicationDidBecomeActiveNotification通知。

4、內(nèi)存清除——應(yīng)用終止場(chǎng)景

應(yīng)用在后臺(tái)處理完成時(shí)進(jìn)入掛起狀態(tài)(這是一種休眠狀態(tài)),如果這時(shí)發(fā)出低內(nèi)存警告,為了滿(mǎn)足其他應(yīng)用對(duì)內(nèi)存的需要,該應(yīng)用就會(huì)從內(nèi)存中清除從而終止應(yīng)用。該場(chǎng)景的狀態(tài)躍遷過(guò)程:Background——Suspended——Not Running。內(nèi)存清除有兩種情況,可能是系統(tǒng)強(qiáng)制清除內(nèi)存,也可能是由使用者從任務(wù)欄中手動(dòng)清除(即從任務(wù)欄中刪除應(yīng)用)。內(nèi)存清除后如果應(yīng)用再次運(yùn)行,上一次的運(yùn)行狀態(tài)不會(huì)被保存,相當(dāng)于應(yīng)用第一次運(yùn)行。在內(nèi)存清除場(chǎng)景下,不會(huì)調(diào)用任何方法,也不會(huì)發(fā)出任何通知。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 0. 引子 iOS應(yīng)用程序一般都是由自己編寫(xiě)的代碼和系統(tǒng)框架(system frameworks)組成,系統(tǒng)框架提...
    i愛(ài)吃土豆的貓閱讀 603評(píng)論 0 0
  • 說(shuō)在前面: 5個(gè)狀態(tài):not runing 非運(yùn)行;inactive :前臺(tái)非活動(dòng);active:前臺(tái)活動(dòng);bac...
    MO了不起閱讀 596評(píng)論 0 1
  • 感恩分享: 做一個(gè)有智慧的好人吧,以惡制惡,不能夠讓痛苦終結(jié);只有用愛(ài)、用智慧、用慈悲、用強(qiáng)大的金剛智慧的力量,...
    雪域紅梅閱讀 318評(píng)論 0 0
  • 原諒我不再開(kāi)口講話(huà) 嘴巴里呼出的全是眼淚 我厭惡的龐大世界 殺死了很多渺小的人 生活的內(nèi)核是殘忍 而真實(shí)僅僅是微弱...
    愛(ài)醬lll閱讀 504評(píng)論 38 27
  • 文/回風(fēng)舞雪李子碩 一直喜歡文學(xué)和研究,但好多年不寫(xiě)什么了。今兒撿起多年前的愛(ài)好,居然有點(diǎn)心酸,更多的卻是愜然。 ...
    回風(fēng)舞雪李子碩閱讀 751評(píng)論 7 5

友情鏈接更多精彩內(nèi)容