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