iOS的應(yīng)用程序的生命周期挽牢,還有程序是運(yùn)行在前臺(tái)還是后臺(tái)登渣,應(yīng)用程序各個(gè)狀態(tài)的變換,這些對(duì)于開(kāi)發(fā)者來(lái)說(shuō)都是很重要的邓了。 iOS系統(tǒng)的資源是有限的恨诱,應(yīng)用程序在前臺(tái)和在后臺(tái)的狀態(tài)是不一樣的。在后臺(tái)時(shí)骗炉,程序會(huì)受到系統(tǒng)的很多限制照宝,這樣可以提高電池的使用和用戶體驗(yàn)。
開(kāi)發(fā)app,我們要遵循apple公司的一些指導(dǎo)原則句葵,原則如下:
應(yīng)用程序的狀態(tài)
狀態(tài)如下:
Not running 未運(yùn)行 程序沒(méi)啟動(dòng)
Inactive 未激活 程序在前臺(tái)運(yùn)行厕鹃,但不能接受事件的處理.當(dāng)應(yīng)用要從一個(gè)狀態(tài)切換到另一個(gè)不同狀態(tài)時(shí),中途 過(guò)度會(huì)短暫停留在此狀態(tài).
Active 激活 程序在前臺(tái)運(yùn)行而且接收到了事件。這是應(yīng)用在前臺(tái)運(yùn)行時(shí)所處的正常狀態(tài).
Backgroud 后臺(tái) 程序在后臺(tái)而且還在執(zhí)行代碼.大多數(shù)將要進(jìn)入 Suspended 狀態(tài)的應(yīng)用,會(huì)先短暫進(jìn)入此狀態(tài).如果應(yīng)用請(qǐng)求更多額外的執(zhí)行時(shí)間,該應(yīng)用會(huì)在此狀態(tài)保持更長(zhǎng)一段時(shí)間.另外,如果一個(gè)應(yīng)用要求啟動(dòng)時(shí)直接進(jìn)入后臺(tái)運(yùn)行,這樣的應(yīng)用會(huì)直接從 NotRunning 狀態(tài)進(jìn)入 Background 狀態(tài),中途不會(huì)經(jīng)過(guò) Inactive 狀態(tài).比如,沒(méi)有界面的應(yīng)用(當(dāng)然并不特指沒(méi)有界面的應(yīng)用),總之,如果應(yīng)用直接進(jìn)入 Background 狀態(tài),該應(yīng)用界面不會(huì)被顯示出來(lái).
Suspended 掛起 應(yīng)用處在后臺(tái),并且沒(méi)有執(zhí)行任何代碼.系統(tǒng)會(huì)自動(dòng)將應(yīng)用轉(zhuǎn)入該狀態(tài),并且不會(huì)發(fā)出任何通知.當(dāng)處在該狀態(tài)時(shí),應(yīng)用依然駐留內(nèi)存,但不執(zhí)行任何程序代碼.當(dāng)系統(tǒng)發(fā)生低內(nèi)存警告時(shí),系統(tǒng)會(huì)將出于 Suspended 狀態(tài)的應(yīng)用徹底移出內(nèi)存,從而為前臺(tái)應(yīng)用釋放更多的內(nèi)存.
下圖是程序狀態(tài)變化圖:
各個(gè)程序運(yùn)行狀態(tài)時(shí)代理的回調(diào):
- (BOOL)application:(UIApplication*)application willFinishLaunchingWithOptions:(NSDictionary*)launchOptions// 告訴代理進(jìn)程啟動(dòng)但還沒(méi)進(jìn)入狀態(tài)保存. 應(yīng)用程序?qū)⒁獑?dòng)時(shí)自動(dòng)調(diào)用該方法,該方法是應(yīng)用程序啟動(dòng)時(shí)第一次執(zhí)行自定義代碼的機(jī)會(huì).
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions// 告訴代理啟動(dòng)基本完成程序準(zhǔn)備開(kāi)始運(yùn)行. 應(yīng)用程序啟動(dòng)時(shí)自動(dòng)調(diào)用該方法,開(kāi)發(fā)者可以在該方法中執(zhí)行初始化相關(guān)的代碼.
- (void)applicationDidBecomeActive:(UIApplication*)application//應(yīng)用程序入活動(dòng)狀態(tài)執(zhí)行. 應(yīng)用在轉(zhuǎn)入前臺(tái),并進(jìn)入活動(dòng)狀態(tài)時(shí)回調(diào)該方法(當(dāng)應(yīng)用從啟動(dòng)到進(jìn)入前臺(tái),或從后臺(tái)轉(zhuǎn)入前臺(tái)都會(huì)調(diào)用該方法),可重寫(xiě)該方法執(zhí)行最后的準(zhǔn)備工作.
- (void)applicationWillResignActive:(UIApplication*)application// 當(dāng)應(yīng)用程序?qū)⒁敕腔顒?dòng)狀態(tài)執(zhí)行(應(yīng)用正要從前臺(tái)運(yùn)行狀態(tài)離開(kāi)時(shí)將會(huì)調(diào)用該方法)乍丈,在此期間剂碴,應(yīng)用程序不接收消息或事件,比如來(lái)電話了
- (void)applicationDidEnterBackground:(UIApplication*)application// 用程序正出于 Background 狀態(tài),且隨時(shí)可能進(jìn)入Suspended 狀態(tài)時(shí)將會(huì)調(diào)用該方法. 所以要設(shè)置后臺(tái)繼續(xù)運(yùn)行诗赌,則在這個(gè)函數(shù)里面設(shè)置即可
- (void)applicationWillEnterForeground:(UIApplication*)application//當(dāng)程序從后臺(tái)將要重新回到前臺(tái)汗茄,但暫時(shí)還沒(méi)有到達(dá) Active 狀態(tài)時(shí)將會(huì)調(diào)用該方法. 這個(gè)剛好跟上面的那個(gè)方法相反。
- (void)applicationWillTerminate:(UIApplication*)application//該應(yīng)用程序即將被終止時(shí)調(diào)用該方法,如果應(yīng)用當(dāng)前處在 Suspended 狀態(tài),此方法將不會(huì)被調(diào)用..通常是用來(lái)保存數(shù)據(jù)和一些退出前的清理工作铭若。這個(gè)需要要設(shè)置UIApplicationExitsOnSuspend的鍵值洪碳。
- (void)applicationDidFinishLaunching:(UIApplication*)application當(dāng)程序載入后執(zhí)行
在上面8個(gè)方法對(duì)應(yīng)的方法中鍵入NSLog打印递览。
現(xiàn)在啟動(dòng)程序看看執(zhí)行的順序:
啟動(dòng)程序
lifeCycle[40428:11303] willFinishLaunchingWithOptions
lifeCycle[40428:11303] didFinishLaunchingWithOptions
lifeCycle[40428:11303] applicationDidBecomeActive
按下home鍵
lifeCycle[40428:11303] applicationWillResignActive
lifeCycle[40428:11303] applicationDidEnterBackground
雙擊home鍵,再打開(kāi)程序
lifeCycle[40428:11303] applicationWillEnterForeground
lifeCycle[40428:11303] applicationDidBecomeActive