AppDelegate類是應用程序委托對象,這個類中繼承的一系列方法在應用生命周期的不同階段會被調(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應用的5種狀態(tài):
□ Not Running(非運行狀態(tài))忘晤。應用沒有運行或被系統(tǒng)終止点把。
□ Inactive(前臺非活動狀態(tài))嗤详。應用正在進入前臺狀態(tài)妈踊,但是還不能接受事件處理娱局。
□ Active(前臺活動狀態(tài))彰亥。應用進入前臺狀態(tài),能接受事件處理衰齐。
□ Background(后臺狀態(tài))任斋。應用進入后臺后,依然能夠執(zhí)行代碼娇斩。如果有可執(zhí)行的代碼仁卷,就會執(zhí)行代碼,如果沒有可執(zhí)行的代碼或者將可執(zhí)行的代碼執(zhí)行完畢犬第,應用會馬上進入掛起狀態(tài)锦积。
□ Suspended(掛起狀態(tài))。被掛起的應用進入一種“冷凍”狀態(tài)歉嗓,不能執(zhí)行代碼丰介。如果系統(tǒng)內(nèi)存不夠,應用會被終止。
在應用狀態(tài)躍遷的過程中哮幢,iOS系統(tǒng)會回調(diào)AppDelegate中的一些方法带膀,并且發(fā)送一些通知。選取幾個主要的方法和通知進行詳細介紹:
1橙垢、應用啟動并進行初始化時會調(diào)用application:didFinishLaunchingWithOptions:方法并發(fā)出UIApplicationDidFinishLaunchingNotification通知垛叨,這個階段會實例化根視圖控制器。
2柜某、應用進入前臺并處于活動狀態(tài)時會調(diào)用applicationDidBecomeActive:方法并發(fā)出UIApplicationDidBecomeActiveNotification通知嗽元,這個階段可以恢復UI的狀態(tài)(例如游戲的狀態(tài)等)。
3喂击、應用從活動狀態(tài)進入非活動狀態(tài)時會調(diào)用applicationWillResignActive:方法并發(fā)出UIApplicationWillResignActiveNotification通知剂癌,這個階段可以保存UI的狀態(tài)(例如游戲的狀態(tài)等)。
4翰绊、應用進入后臺時會調(diào)用applicationDidEnterBackground:方法并發(fā)出UIApplicationDidEnterBackgroundNotification通知佩谷,這個階段可以保存用戶數(shù)據(jù),釋放一些資源(例如釋放數(shù)據(jù)庫資源等)监嗜。
5谐檀、應用進入到前臺,但是還沒有處于活動狀態(tài)時會調(diào)用applicationWillEnterForeground:方法并發(fā)出UIApplicationWillEnterForegroundNotification通知裁奇,這個階段可以恢復用戶數(shù)據(jù)稚补。
6、應用被終止時會調(diào)用applicationWillTerminate:方法并發(fā)出UIApplicationWillTerminateNotification通知框喳,這個階段釋放一些資源,也可以保存用戶數(shù)據(jù)厦坛。
為了更直觀地了解各狀態(tài)及其相應的方法五垮、通知間的關系,下面以幾個應用場景為切入點進行系統(tǒng)分析:
1杜秸、非運行狀態(tài)——應用啟動場景
用戶點擊應用圖標的時候放仗,可能是第一次啟動這個應用,也可能是應用終止后再次啟動撬碟。該場景的狀態(tài)躍遷共經(jīng)歷2個階段3個狀態(tài):Not Running——Inactive——Active诞挨。
□?Not Running——Inactive階段:調(diào)用application:didFinishLaunchingWithOptions:方法,發(fā)出UIApplicationDidFinishLaunchingNotification通知呢蛤。
□?Inactive——Active階段:調(diào)用applicationDidBecomeActive:方法惶傻,發(fā)出UIApplicationDidBecomeActiveNotification通知。
2其障、點擊Home鍵——應用退出場景
應用處于運行狀態(tài)银室,點擊Home鍵應用會退出。該場景的狀態(tài)躍遷過程可以分為兩種狀態(tài):可以在后臺運行或者掛起,不可以在后臺運行或者掛起蜈敢。根據(jù)工程屬性文件(如info.plist)中的相關屬性Application does not run in background的設置辜荠,可以控制這兩種狀態(tài)(如果采用文本編輯器打開info.plist文件,該設置項對應的鍵是UIApplicationExitsOnSuspend)抓狭。
狀態(tài)躍遷的第一種情況:應用可以在后臺運行或者掛起伯病,該場景的狀態(tài)躍遷過程共經(jīng)歷3個階段4個狀態(tài):Active——Inactive——Bacground——Suspended。
□?Active——Inactive階段:調(diào)用applicationWillResignActive:方法否过,發(fā)出UIApplicationWillResignActiveNotification通知午笛。
□?Inactive——Bacground階段:應用從非活動狀態(tài)進入到后臺(不涉及要重點說明的方法和通知)。
□?Bacground——Suspended階段:調(diào)用applicationDidEnterBackground:方法叠纹,發(fā)出UIApplicationDidEnterBackgroundNotification通知季研。
狀態(tài)躍遷的第二種情況:應用不可以在后臺運行或者掛起。其狀態(tài)躍遷過程共經(jīng)歷4個階段5個狀態(tài):Active——Inactive——Bacground——Suspended——Not Running誉察。
□?Active——Inactive階段:調(diào)用applicationWillResignActive:方法与涡,發(fā)出UIApplicationWillResignActiveNotification通知。
□?Inactive——Bacground階段:應用從非活動狀態(tài)進入到后臺(不涉及要重點說明的方法和通知)持偏。
□?Bacground——Suspended階段:調(diào)用applicationDidEnterBackground:方法驼卖,發(fā)出UIApplicationDidEnterBackgroundNotification通知。
□?Suspended——Not Running階段:調(diào)用applicationWillTerminate:方法鸿秆,發(fā)出UIApplicationWillTerminateNotification通知酌畜。
3、掛起重新運行場景
掛起狀態(tài)的應用重新運行卿叽,該場景的狀態(tài)躍遷過程共經(jīng)歷3個階段4個狀態(tài):Suspended——Background——Inactive——Active桥胞。
□?Suspended——Background。應用從掛起狀態(tài)進入后臺(不涉及要重點說明的方法和通知)考婴。
□?Background——Inactive階段:調(diào)用applicationWillEnterForeground:方法贩虾,發(fā)出UIApplicationWillEnterForegroundNotification通知。
□?Inactive——Active階段:調(diào)用applicationDidBecomeActive:方法沥阱,發(fā)出UIApplicationDidBecomeActiveNotification通知缎罢。
4、內(nèi)存清除——應用終止場景
應用在后臺處理完成時進入掛起狀態(tài)(這是一種休眠狀態(tài))考杉,如果這時發(fā)出低內(nèi)存警告策精,為了滿足其他應用對內(nèi)存的需要,該應用就會從內(nèi)存中清除從而終止應用崇棠。該場景的狀態(tài)躍遷過程:Background——Suspended——Not Running咽袜。內(nèi)存清除有兩種情況,可能是系統(tǒng)強制清除內(nèi)存易茬,也可能是由使用者從任務欄中手動清除(即從任務欄中刪除應用)酬蹋。內(nèi)存清除后如果應用再次運行及老,上一次的運行狀態(tài)不會被保存,相當于應用第一次運行范抓。在內(nèi)存清除場景下骄恶,不會調(diào)用任何方法,也不會發(fā)出任何通知匕垫。