對(duì)于iOS開(kāi)發(fā)者來(lái)說(shuō),了解應(yīng)用程序在前臺(tái)和后臺(tái)之間的狀態(tài)切換是很有必要的温算。在了解切換之前扣草,我們應(yīng)該先大致了解下應(yīng)用程序有哪幾種狀態(tài)。
-
應(yīng)用程序的狀態(tài)
程序的五種狀態(tài):
State | 狀態(tài) | 描述 |
---|---|---|
Not running | 未運(yùn)行 | 程序沒(méi)啟動(dòng) |
Inactive | 未激活 | 程序在前臺(tái)運(yùn)行氨鹏,但沒(méi)有接收到事件欧募。在沒(méi)有事件處理情況下程序通常停留在這個(gè)狀態(tài) |
Active | 激活 | 程序在前臺(tái)運(yùn)行,并且接收到了事件仆抵。這也是前臺(tái)的一個(gè)正常的模式 |
Backgroud | 后臺(tái) | 程序在后臺(tái)跟继,并且能執(zhí)行代碼。大多數(shù)程序進(jìn)入這個(gè)狀態(tài)后會(huì)在這個(gè)狀態(tài)上停留一會(huì)镣丑,但到一定時(shí)間之后會(huì)進(jìn)入掛起狀態(tài)(Suspended)舔糖。有的程序經(jīng)過(guò)特殊的請(qǐng)求后可以長(zhǎng)期處于Backgroud狀態(tài) |
Suspended | 掛起 | 程序在后臺(tái),不能執(zhí)行代碼莺匠。系統(tǒng)會(huì)自動(dòng)把程序變成這個(gè)狀態(tài)而且不會(huì)發(fā)出通知金吗。當(dāng)掛起時(shí),程序還是停留在內(nèi)存中的,但當(dāng)系統(tǒng)內(nèi)存低時(shí)摇庙,系統(tǒng)就把掛起的程序清除掉旱物,為前臺(tái)程序提供更多的內(nèi)存 |
-
UIApplicationDelegate協(xié)議方法
1.各個(gè)程序運(yùn)行狀態(tài)時(shí)代理的回調(diào):
- application:willFinishLaunchingWithOptions:
該方法是程序啟動(dòng),但還沒(méi)進(jìn)入狀態(tài)保存時(shí)執(zhí)行卫袒。
- application:didFinishLaunchingWithOptions:
該方法是程序啟動(dòng)基本完成宵呛,準(zhǔn)備開(kāi)始運(yùn)行時(shí)執(zhí)行。
- applicationDidFinishLaunching:
該方法在應(yīng)用程序中不需要用到夕凝,用上面那兩個(gè)方法所代替了宝穗。
- applicationDidBecomeActive:
該方法是程序進(jìn)入活動(dòng)狀態(tài)時(shí)執(zhí)行。
- applicationWillResignActive:
該方法是當(dāng)程序?qū)⒁M(jìn)入非活動(dòng)狀態(tài)時(shí)執(zhí)行迹冤,在此期間讽营,應(yīng)用程序不接收消息或事件,比如按下Home鍵或者來(lái)電話了泡徙。
- applicationDidEnterBackground:
該方法是當(dāng)程序被推送到后臺(tái)時(shí)執(zhí)行橱鹏。
- applicationWillEnterForeground:
該方法是當(dāng)程序從后臺(tái)將要重新回到前臺(tái)是執(zhí)行。
- applicationWillTerminate:
該方法是程序?qū)⒁瞥鰰r(shí)執(zhí)行堪藐,通常是用來(lái)保存數(shù)據(jù)和一些退出前的清理工作莉兰。
2.幾種對(duì)程序進(jìn)行操作時(shí),各個(gè)方法的執(zhí)行順序
a. 第一次啟動(dòng)程序:
-application:willFinishLaunchingWithOptions:
-applicationDidFinishLaunching:
-applicationDidBecomeActive:
b. 按下Home鍵:
-applicationWillResignActive:
-applicationDidEnterBackground:
c. 從后臺(tái)啟動(dòng)程序:
-applicationWillEnterForeground:
-applicationDidBecomeActive:
d. 雙擊Home鍵礁竞,然后退出程序:
-applicationWillResignActive:
-applicationDidEnterBackground:
-applicationWillTerminate:
-
UIApplicationDelegate對(duì)應(yīng)的通知方法
UIApplicationDelegate的協(xié)議方法分別對(duì)應(yīng)相應(yīng)的通知:
UIKIT_EXTERN NSString *const UIApplicationDidEnterBackgroundNotification;
UIKIT_EXTERN NSString *const UIApplicationWillEnterForegroundNotification;
UIKIT_EXTERN NSString *const UIApplicationDidFinishLaunchingNotification;
UIKIT_EXTERN NSString *const UIApplicationDidBecomeActiveNotification;
UIKIT_EXTERN NSString *const UIApplicationWillResignActiveNotification;
UIKIT_EXTERN NSString *const UIApplicationDidReceiveMemoryWarningNotification;
UIKIT_EXTERN NSString *const UIApplicationWillTerminateNotification;
在此糖荒,我貼心的列舉一下使用方法:
// 自己實(shí)現(xiàn) enterBackground 方法就OK了
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];
貼心小提示:添加了通知,在不用的時(shí)候記得要 remove 哦模捂!
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
本人覺(jué)得這種通知方法的好處在于捶朵,當(dāng)某個(gè)類(lèi)在狀態(tài)切換時(shí)需要做處理的時(shí)候,在當(dāng)前類(lèi)中添加通知即可狂男,省的每次做處理都要跑到AppDelegate類(lèi)中综看。