上一篇: iOS-視圖、控制器生命周期
前言,之前簡單了解控制器視圖的聲明周期,當(dāng)然要了解一下應(yīng)用程序的生命周期。
Main函數(shù)入口
代碼中有一個很重要的函數(shù)UIApplicationMain,它主要是創(chuàng)建app的幾個核心對象來處理以下過程:
- 1.從可用
Storyboard文件加載用戶界面 - 2.調(diào)用
AppDelegate自定義代碼來做一些初始化設(shè)置 - 3.將app放入
Main Run Loop環(huán)境中來響應(yīng)和處理與用戶交互產(chǎn)生的事件
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
應(yīng)用程序狀態(tài)。
- Not running(未運行):程序未啟動
- Inactive(未激活):其他兩個狀態(tài)切換時出現(xiàn)的短暫狀態(tài)。唯一在此狀態(tài)停留時間比較長的情況是:當(dāng)用戶鎖屏?xí)r?或者系統(tǒng)提示用戶去響應(yīng)Alert窗口(如來電、信息)時
- Active(激活):在屏幕上顯示的正常運行狀態(tài),該狀態(tài)下可以接收用戶輸入并更新顯示
- Backgroud(后臺):程序在后臺且能執(zhí)行代碼。用戶按下Home鍵不久后進入此狀態(tài)(先進入了Inactive狀態(tài),再進入Background狀態(tài)),然后會迅速進入掛起狀態(tài)(Suspended)。有的程序經(jīng)過特殊的請求后可以長期處于Backgroud狀態(tài)
- Suspended(掛起):程序在后臺不能執(zhí)行代碼。普通程序在進入Background狀態(tài)不久后就會進入此狀態(tài)。當(dāng)掛起時,程序還是停留在內(nèi)存中的,當(dāng)系統(tǒng)內(nèi)存低時,系統(tǒng)就把掛起的程序清除掉,為前臺程序提供更多的內(nèi)存

Active和Inactive的切換:
應(yīng)用程序在前臺時有2種狀態(tài):Active和Inactive。大多數(shù)情況下,Inactive狀態(tài)只是其他兩個狀態(tài)切換時出現(xiàn)的短暫狀態(tài)(不是任意兩個狀態(tài)之間的切換都會進入Inactive),如打開應(yīng)用,它會從Not Running先進入Inactive再進入Active;如前后臺應(yīng)用切換時,Inactive會在Active和Background之間短暫出現(xiàn)。
但也有其他情況,Active和Inactive可以在前臺運行時進行切換,比如系統(tǒng)彈出Alert,此時應(yīng)用會從Active切換到Inactive,直到用戶確認(rèn)再返回Actvie;再如用戶拉下通知頁,也會發(fā)生Active和Inactive的切換;還有來電但拒接、雙擊Home鍵但返回原應(yīng)用等都不進入Background,而只是在Active和Inactive切換。
AppDelegate類方法
各個程序運行狀態(tài)時代理的回調(diào):
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告訴代理進程啟動但還沒進入狀態(tài)保存
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告訴代理啟動基本完成程序準(zhǔn)備開始運行
- (void)applicationWillResignActive:(UIApplication *)application
當(dāng)應(yīng)用程序?qū)⒁敕腔顒訝顟B(tài)執(zhí)行,在此期間,應(yīng)用程序不接收消息或事件,比如來電話了
- (void)applicationDidBecomeActive:(UIApplication *)application
當(dāng)應(yīng)用程序入活動狀態(tài)執(zhí)行,這個剛好跟上面那個方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
當(dāng)程序被推送到后臺的時候調(diào)用。所以要設(shè)置后臺繼續(xù)運行,則在這個函數(shù)里面設(shè)置即可
- (void)applicationWillEnterForeground:(UIApplication *)application
當(dāng)程序從后臺將要重新回到前臺時候調(diào)用,這個剛好跟上面的那個方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用,通常是用來保存數(shù)據(jù)和一些退出前的清理工作。這個需要要設(shè)置UIApplicationExitsOnSuspend的鍵值。
- (void)applicationDidFinishLaunching:(UIApplication*)application
當(dāng)程序載入后執(zhí)行

1.application:didFinishLaunchingWithOptions:
程序首次已經(jīng)完成啟動時執(zhí)行,若直接啟動,launchOptions中沒有數(shù)據(jù);否則,launchOptions將包含對應(yīng)方式的內(nèi)容(比如從微信中啟動節(jié)奏大師--)。
2.applicationWillResignActive(將進入后臺)
程序?qū)⒁ctive狀態(tài)時調(diào)用,比如按下Home鍵或有電話信息進來。對應(yīng)applicationWillEnterForeground(將進入前臺),這個方法用處:
- 暫停正在執(zhí)行的任務(wù);
- 禁止計時器;
- 減少OpenGL ES幀率;
- 若為游戲應(yīng)暫停游戲;
3.applicationDidEnterBackground(已經(jīng)進入后臺)
程序已經(jīng)進入后臺時調(diào)用,對應(yīng)applicationDidBecomeActive(已經(jīng)變成前臺),這個方法用來:釋放、保存
- 釋放共享資源;
- 保存用戶數(shù)據(jù)(寫到硬盤);
- 作廢計時器;
- 保存足夠的程序狀態(tài)以便下次恢復(fù);
4.applicationWillEnterForeground(將進入前臺)
程序即將進去前臺時調(diào)用,對應(yīng)applicationWillResignActive(將進入后臺)。這個方法用來撤銷applicationWillResignActive中做的改變。
5.applicationDidBecomeActive(已經(jīng)進入前臺)
程序已經(jīng)變?yōu)锳ctive(前臺)時調(diào)用。對應(yīng)applicationDidEnterBackground(已經(jīng)進入后臺)。若程序之前在后臺,最后在此方法內(nèi)刷新用戶界面。
6.applicationWillTerminate
程序即將退出時調(diào)用。記得保存數(shù)據(jù),如applicationDidEnterBackground方法一樣。
7.獲取狀態(tài)
- 如果類是AppDelegate類(聲明遵循UIApplicationDelegate協(xié)議),那么可以實現(xiàn)上面的6個方法,當(dāng)App狀態(tài)改變的時候相應(yīng)的方法會被調(diào)用
- 如果類不是AppDelegate類,那么該類使用NotificationCenter來通知知道App的各種狀態(tài)變化。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:[UIApplication sharedApplication]];
然后實現(xiàn)applicationWillResignActive就行了
- (void)applicationWillResignActive //自定義的函數(shù)
{
NSLog(@"%@", NSStringFromSelector(_cmd));
}