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ā)出任何通知。