iOS應(yīng)用程序生命周期
App狀態(tài)變化歷史:
在iOS4之前的App時代,整個界面只允許一個App處于運(yùn)行狀態(tài),而當(dāng)某個App處于運(yùn)行狀態(tài)時意味著其他所有的App的活動都被終止并退出,無法接受任何事件.一個應(yīng)用的狀態(tài)轉(zhuǎn)換只有運(yùn)行衡创、退出之間的變換.在iOS4之后的iPhone進(jìn)入了多任務(wù)處理時代.也意味了當(dāng)從一個應(yīng)用切換到另一個應(yīng)用時,系統(tǒng)不會馬上將原來的應(yīng)用終止退出,將其狀態(tài)變成了suspend,而另一個應(yīng)用的狀態(tài)變成了running.
AppDelegate
運(yùn)行一個App,應(yīng)用程序會自動創(chuàng)建UIApplication
單例對象,并被強(qiáng)引用(保證不會被銷毀直到App退出),其UIApplicaiton
實(shí)例的delegate
屬性被賦值為AppDelegate
實(shí)例對象(其也是一個單例,也永遠(yuǎn)不會被釋放直到該App退出).而AppDelegate
對象有著一系列在程序啟動時的跟蹤狀態(tài)變化,處理從其他應(yīng)用跳轉(zhuǎn)贪绘、啟動到此應(yīng)用,或者后臺運(yùn)行代碼的方法.
AppDelegate
做為App的根對象的主要功能:
1. 運(yùn)行在啟動時自己用來初始化應(yīng)用的特點(diǎn)代碼.
2. 響應(yīng)App從啟動,到后臺,到前臺,到退出時各個狀態(tài)時的指定方法.
3. 負(fù)責(zé)處理接收推送通知或本地通知啟動App的情況,處理手機(jī)低內(nèi)存警告時的情況.
4. 負(fù)責(zé)處理應(yīng)用程序的狀態(tài)保存和恢復(fù).
5. 響應(yīng)由App處理的事件,而是指定控制器或視圖.
6. 處理數(shù)據(jù)的存儲.
應(yīng)用程序的狀態(tài):
1. Not running 未運(yùn)行 程序處于沒啟動狀態(tài)
2. Inactive 未激活 程序在前臺運(yùn)行, 但是沒有接收到任何事件, 沒有事件處理的情況下程序通常停留在這個狀態(tài)
3. Active 激活 程序在前臺運(yùn)行,并且接收到事件.
4. Background 程序在后臺且能執(zhí)行代碼 大多數(shù)程序進(jìn)入后臺這個狀態(tài)后會在這個狀態(tài)停留一會, 然后進(jìn)入Suspended(掛起狀態(tài)), 而有的程序經(jīng)過特殊的請求可以長期處于Background狀態(tài).
5. Suspended 掛起 程序在后臺不能執(zhí)行代碼, 系統(tǒng)會自動將程序變成這個狀態(tài)且不會發(fā)通知. 當(dāng)掛起時, 程序還是停留在內(nèi)存中的, 當(dāng)系統(tǒng)內(nèi)存不足時,系統(tǒng)就會把掛起的程序清除掉, 為前臺程序提供更多內(nèi)存
程序狀態(tài)切換圖:
各個程序運(yùn)行狀態(tài) 代理的回調(diào)方法
- (void)applicationWillResignActive:(UIApplication *)application {
// 當(dāng)應(yīng)用從activite狀態(tài)跳轉(zhuǎn)到inactive狀態(tài)時, 調(diào)用該方法. 許多的暫時打斷App操作都會觸發(fā)該方法. (諸如: 有電話打進(jìn)來時, 收到消息時, 支持多任務(wù)的iPad進(jìn)行側(cè)邊欄滑動時等情況) 或者當(dāng)用戶停止App并且讓App進(jìn)入后臺狀態(tài)時(Inactive狀態(tài))(如按Home鍵回到鍵入主界面,劃出通知欄或者設(shè)置)
// 可以通過該方法停止進(jìn)行中的任務(wù), 讓定時器失效, 進(jìn)制圖形渲染回調(diào)方法. 游戲類App 用該方法停止游戲
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// 該方法可以用來釋放共享的資源, 保存數(shù)據(jù), 停止定時器, 保存App當(dāng)前狀態(tài)信息防止App在之后被銷毀掉時, 丟失了信息
// 如果你的App支持后臺運(yùn)行, 該方法將會在用戶觸發(fā)停止App操作時(如按Home鍵), 取代 applicationWillTerminate
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
// 在App從background狀態(tài)跳轉(zhuǎn)到active狀態(tài)時該方法被執(zhí)行, 在這個方法中你可以撤銷任何在App進(jìn)入background狀態(tài)時所做的改變.
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
// 重啟那些在App處于inactive狀態(tài)時被停止的任務(wù)(或那些還未啟動的), 如果App之前處于background 狀態(tài), 通常要刷新UI
}
- (void)applicationWillTerminate:(UIApplication *)application {
// App將要終止時被調(diào)用, 如果有必要可以保持一些數(shù)據(jù), 同時也要看看方法 applicationDidEnterBackground:
}
加載應(yīng)用程序進(jìn)入前臺:
加載應(yīng)用程序進(jìn)入后臺:
應(yīng)用返回前臺運(yùn)行:
應(yīng)用轉(zhuǎn)到后臺運(yùn)行:
當(dāng)一個基于警告式的中斷發(fā)生時,比如有電話打進(jìn)來了,這是程序會臨時進(jìn)入inactive狀態(tài),這用戶可以選擇如何處理這個中斷