App狀態(tài)的代理事件
新建一個Signle View Application后,系統(tǒng)會自動創(chuàng)建AppDelegate文件,系統(tǒng)默認提供的方法表示了App不同的運行狀態(tài).
application:willFinishLaunchingWithOptions
在App啟動時調用表示應用加載進程已經開始,常用來處理應用狀態(tài)的存儲和恢復
application:didFinishLaunchingWithOptions
表示App將從未運行狀態(tài)進入運行狀態(tài),用于對App的初始化操作.
applicationDidBecomeActive
在application:didFinishLaunchingWithOptions:之后調用,表示應用進入active狀態(tài),在applicationWillResignActive調用后App又回到active狀態(tài)時也會調用.
applicationWillResignActive
當某一操作阻塞App界面時會調用,如按Home鍵回到鍵入主界面,劃出通知欄或者設置,臨時的電話和通知,支持多任務的iPad進行側邊欄滑動時等情況下都會調用,使得App進入inavtive狀態(tài),往往操作結束后會調用applicationDidBecomeActive,使得App回到active狀態(tài).
applicationDidEnterBackground
在App進入后臺后調用,之前肯定會調用applicationWillResignActive方法.允許執(zhí)行短時間 的任務代碼如清理內存
applicationWillEnterForeground
當App將從后臺回到前臺時調用,之后肯定調用applicationDidBecomeActive方法表示程序進入active狀態(tài),但App第一次啟動時不是從后臺啟動,所以首次加載時不會調用此方法.
applicationWillTerminate
當App將要被系統(tǒng)殺死時調用,通常用來對App進行清理工作,釋放資源,保存數據等等,所執(zhí)行的操作官方推薦最多耗時5s左右的事件來完成和返回,若時間過長系統(tǒng)殺死應用時會將使操作失敗.其調用時機比較特殊,如果運行的App直接退出(非進入后臺),會調用;若應用是從中斷狀態(tài)(此狀態(tài)期間App無法接收任何事件)被系統(tǒng)退出,則不會被調用.
注意點
iOS8中,App會在根控制器初始化后調用viewDidAppear方法之后才會調用applicationDidBecomeActive,對于App啟動的事件順序為
application:didFinishLaunchingWithOptions:
??viewDidLoad
??viewWillAppear
??viewDidAppear
??applicationDidBecomeActive
而在iOS7和9中,App在調用applicationDidBecomeActive方法后才會調用根控制器的viewDidAppear,其調用順序為
application:didFinishLaunchingWithOptions:
??viewDidLoad
??viewWillAppear
??applicationDidBecomeActive
??viewDidAppear
iOS應用生命周期
作為應用程序的委托對象,AppDelegate類在應用生命周期的不同階段會回調不同的方法。
下面簡要介紹一下iOS應用的5種狀態(tài):
Not Running(非運行狀態(tài)):應用沒有運行或被系統(tǒng)終止運行覆履;
Inactive(前臺非活躍狀態(tài)):應用正式進入前臺狀態(tài)星掰,但是還沒有接受事件處理;
Active(前臺活躍狀態(tài)):應用進入前臺狀態(tài)木柬,能接受事件并且進行處理;
Background(后臺狀態(tài)):應用進入后臺之后,依然能夠執(zhí)行代碼哗魂。如果有可以執(zhí)行的代碼,就會執(zhí)行辙芍,如果沒有可執(zhí)行的代碼或者將可執(zhí)行的代碼執(zhí)行完畢啡彬,應用會馬上進入掛起狀態(tài);
Suspended(掛起狀態(tài)):被掛起的應用進入一種“休眠”狀態(tài)故硅,不能執(zhí)行任何代碼庶灿。當手機系統(tǒng)內存不足時,應用會被終止吃衅。
方法:- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
說明:應用啟動并進行初始化時會調用該方法并發(fā)出通知往踢。這個階段會實例化跟試圖控制器。
本地通知:UIApplicationDidFinishLaunchingNotification
方法:- (void)applicationDidBecomeActive:(UIApplication*)application
說明:應用進入前臺并處于活躍狀態(tài)時調用該方法并發(fā)出通知徘层。這個階段可以恢復UI的狀態(tài)峻呕。
本地通知:UIApplicationDidBecomeActiveNotification
方法:- (void)applicationWillResignActive:(UIApplication*)application
說明:應用從活躍狀態(tài)進入到非活躍狀態(tài)時調用該方法并發(fā)出通知利职。這個階段可以保存UI的狀態(tài)。
本地通知:UIApplicationWillResignActiveNotification
方法:- (void)applicationDidEnterBackground:(UIApplication*)application
說明:應用進入后臺是調用該方法并發(fā)送通知瘦癌。這個階段可以保存用戶數據猪贪,釋放一些數據庫資源等。
本地通知:UIApplicationDidEnterBackgroundNotification
方法:- (void)applicationWillEnterForeground:(UIApplication*)application
說明:應用進入到前臺讯私,但是還沒有處于活躍狀態(tài)是調用該方法并發(fā)出通知热押。這個階段可以恢復用戶數據。
本地通知:UIApplicationWillEnterForegroundNotification
方法:- (void)applicationWillTerminate:(UIApplication*)application
說明:應用被終止時調用該方法并發(fā)出通知斤寇,內存清除時除外桶癣。這個階段會釋放一些資源,也可以保存用戶數據娘锁。
本地通知:UIApplicationWillTerminateNotification
非運行狀態(tài)--應用啟動場景
場景描述:用戶點擊應用圖標牙寞,可能是第一次啟動,也可能是應用終止后重新啟動莫秆。共經歷兩個階段3個狀態(tài)间雀。
Not running->Inactive->Active
Not running->Inactive階段。調用application:disFinishLaunchingWithOptions:方法镊屎,發(fā)出UIApplicationDidFinishLaunchingNotification通知雷蹂。
Inactive->Active階段。調用applicationDidBecomeActive:方法杯道,發(fā)出UIApplicationDidBecomeActiveNotification通知匪煌。
點擊Home鍵--應用退出場景
場景描述:應用處于運行狀態(tài)(即Active狀態(tài))時,點擊Home鍵或者有其他的應用導致當前應用終端党巾。
狀態(tài)躍遷過程分兩種情況:
可以在后臺運行或者掛起萎庭;
不可以在后臺運行或者掛起。
對于第一種情況:共經歷3個階段4個狀態(tài)齿拂。
Active->Inactive->Background->Suspended
Active->Inactive階段驳规。調用applicationWillResignActive:方法,發(fā)出UIApplicationWillResignActiveNotification通知署海。
Inactive->Background階段吗购。應用從非活動狀態(tài)進入到后臺。
Background->Suspended階段砸狞。調用applicationDidEnterBackground:方法捻勉,發(fā)出UIApplicationDidEnterBackgroundNotification通知。
對于第二種情況:共經歷4個階段5個狀態(tài)刀森。
Active->Inactive->Background->Suspended->Not running
Active->Inactive階段踱启。應用由活動狀態(tài)轉為非活動狀態(tài)。
Inactive->Background階段。應用從非活動狀態(tài)進入到后臺埠偿。
Background->Suspended階段透罢。調用applicationDidEnterBackground:方法,發(fā)出UIApplicationDidEnterBackgroundNotification通知冠蒋。
Suspended->Not running階段羽圃。調用applicationWillTerminate:方法,發(fā)出UIApplicationWillTerminateNotification通知抖剿。
掛起重新運行場景
場景描述:掛起狀態(tài)的應用重新運行统屈。共經歷3個階段4個狀態(tài)。
Suspended->Background->Inactive->Active
Suspended->Background階段牙躺。應用從掛起狀態(tài)進入后臺。
Background->Inactive階段腕扶。調用applicationWillEnterForeground:方法孽拷,發(fā)出UIApplicationWillEnterForegroundNotification通知。
Inactive->Active階段半抱。調用applicationDidBecomeActive:方法脓恕,發(fā)出UIApplicationDidBecomeActiveNotification通知。
方法
本地通知
說明
application:didFinishLaunchingWithOptions:
UIApplicationDidFinishLaunchingNotification
應用啟動并進行初始化時會調用該方法并發(fā)出通知窿侈。這個階段會實例化根視圖控制器
applicationDidBecomeActive:
UIApplicationDidBecomeActiveNotification
應用進入前臺并處于活動狀態(tài)時調用該方法并發(fā)出通知炼幔。這個階段可以恢復UI狀態(tài)(例如游戲狀態(tài))
applicationWillResignActive:
UIApplicationWillResignActiveNotification
應用從活動態(tài)進入非活動態(tài)時調用該方法并發(fā)出通知。這個階段可以保存UI的狀態(tài)(例如游戲狀態(tài))
applicationDidEnterBackground:
UIApplicationDidEnterBackgroundNotification
應用進入后臺時調用該方法并發(fā)出通知史简,這個階段可以保存用戶數據乃秀,釋放一些資源(一些可重新加載的圖片等資源)
applicationWillEnterForeground:
UIApplicationWillEnterForegroundNotification
應用進入前臺,但是還沒有處于活動狀態(tài)時調用該方法并發(fā)出通知圆兵。這個階段可以恢復用戶數據
applicationWillTerminate:
UIApplicationTerminateNotification
應用被終止時調用該方法并發(fā)出通知跺讯。這個階段釋放一些資源,也可以保存用戶數據
iOS的應用程序主要由未運行殉农、未激活刀脏、激活、后臺和掛起這五個狀態(tài)組成超凳,每個狀態(tài)具體的描述如下:
(1)**未運行(Not Running)**:程序未啟動
(2)**未激活(Inactive)**:程序在前臺運行愈污,不過沒有接收到事件。在沒有事件處理情況下程序通常停留在這個狀態(tài)
(3)**激活(Active)**:程序在前臺運行而且接收到了事件,這也是前臺的一個正常的模式
(4)**后臺(Backgroud)**:程序在后臺而且能執(zhí)行代碼轮傍,大多數程序進入這個狀態(tài)后會在這個狀態(tài)上停留一會暂雹。時間到之后會進入掛起狀態(tài)(Suspended)。有的程序經過特殊的請求后可以長期處于Backgroud狀態(tài)
(5)**掛起(Suspended)**:程序在后臺不能執(zhí)行代碼创夜。系統(tǒng)會自動把程序變成這個狀態(tài)而且不會發(fā)出通知擎析。當掛起時,程序還是停留在內存中的,當系統(tǒng)內存低時揍魂,系統(tǒng)就把掛起的程序清除掉桨醋,為前臺程序提供更多的內存。
AppDelegate回調函數
(1)通知進程已啟動但還未進入到狀態(tài)保存
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
(2)通知啟動完成程序準備開始運行
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
(3)當應用程序將要進入非活動狀態(tài)现斋,在此期間應用程序不接收消息或事件喜最,如電話來了
- (void)applicationWillResignActive:(UIApplication *)application
(4)當應用程序進入到活動狀態(tài)調用
- (void)applicationDidBecomeActive:(UIApplication *)application
(5)當程序進入到后臺時被調用,
- (void)applicationDidEnterBackground:(UIApplication *)application
(6)當應用程序將要從后臺進入到前臺的時候調用
- (void)applicationWillEnterForeground:(UIApplication *)application