iOS應用的生命周期,程序是在前臺還是后臺運行,是活躍還是掛起狀態,對于開發者來說是很重要的,開發者需要監聽App的當前狀態的改變,以便做出相應的處理。
一個應用程序有五種狀態
首先,我們了解一下一個iOS應用程序有哪幾種狀態。
-
Not running
未運行 ,程序未啟動。 -
Inactive
未激活 ,程序在前臺運行,但沒有接收到任何事件。在程序沒有事件需要處理時停留在這個狀態,相當于程序休眠。 -
Active
激活,程序在前臺運行而且接收到了事件,App接下來會處理這個事件。一個應用程序大部分時間都處于這個狀態。 -
Backgroud
后臺,程序在后臺而且能執行代碼,大多數程序只能短暫停留這個狀態,馬上進入Suspended狀態。 -
Suspended
掛起,程序在后臺不能執行代碼。但程序不會被馬上殺死,當系統內存不足時,在這個狀態的程序占用的內存優先被回收。
下圖是各個狀態的轉換圖
切換狀態時的回調
在發生狀態切換時,UIApplication都會調用當前代理對象對應的方法來通知App狀態的改變。
//程序即將啟動完成
-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
return YES;
}
//程序啟動完成
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
//程序切換到Active狀態
-(void)applicationDidBecomeActive:(UIApplication *)application{
}
//程序被來電或低電量中斷,或者程序即將進入后臺
-(void)applicationWillResignActive:(UIApplication *)application{
}
//程序進入后臺
- (void)applicationDidEnterBackground:(UIApplication *)application {
}
//程序進入前臺
-(void)applicationWillEnterForeground:(UIApplication *)application{
}
//程序將要終止
-(void)applicationWillTerminate:(UIApplication *)application{
}
有了這些回調,程序員就能很容易地捕捉應用程序當前的狀態,從而做出處理。
值得一提的是,在實際開發中,將所有的程序狀態都放在AppDelegate中處理,并不是很方便。所以,也可以通過監聽通知,獲取到當前的程序狀態。
UIKIT_EXTERN NSNotificationName const UIApplicationDidEnterBackgroundNotification NS_AVAILABLE_IOS(4_0);
UIKIT_EXTERN NSNotificationName const UIApplicationWillEnterForegroundNotification NS_AVAILABLE_IOS(4_0);
UIKIT_EXTERN NSNotificationName const UIApplicationDidFinishLaunchingNotification;
UIKIT_EXTERN NSNotificationName const UIApplicationDidBecomeActiveNotification;
UIKIT_EXTERN NSNotificationName const UIApplicationWillResignActiveNotification;
UIKIT_EXTERN NSNotificationName const UIApplicationWillTerminateNotification;
當App狀態變化時,這些代理的調用順序是怎樣的呢?
- App啟動
App啟動時,首先由Not running狀態切換到Inactive狀態,此時調用application:willFinishLaunchingWithOptions:
代理。加載完成后,調用application:didFinishLaunchingWithOptions:
代理,最后由Inactive狀態切換到Active狀態,此時調用applicationDidBecomeActive:
代理。
- App無事件響應
由Active狀態切換到Inactive狀態,此時調用applicationWillResignActive:
代理。
- 切換App
當切換到另一個App時,由狀態Active切換到Inactive,此時調用applicationWillResignActive:
代理;然后從Inactive狀態切換到running(background)狀態,此時調用applicationDidEnterBackground:
代理。
- 鎖屏
當手機鎖屏時,由狀態Active切換到Inactive,此時調用applicationWillResignActive:
代理,然后再由Inactive狀態切換到running(background)狀態,此時調用applicationDidEnterBackground:
代理。
- App響應中斷
當一個基于警告式的中斷發生時,比如有電話打進來了,程序會臨時進入Inactive狀態,這用戶可以選擇如何處理這個中斷。接著會調用applicationWillResignActive:
方法,當中斷來臨時,你需要在這個方法中,停止timer或者周期性任務、停止視頻,音樂播放、停止游戲運行。當程序回到Active狀態 , applicationDidBecomeActive:
會調用代理,恢復停止的操作。
- App轉到后臺運行
首先調用applicationWillResignActive:
代理,程序即將進入后臺運行,接著調用applicationDidEnterBackground:
代理,此時程序為Background狀態,系統允許程序繼續運行一段時間,然后程序進入Suspended狀態。
- App轉到前臺運行
系統喚醒程序,調用applicationWillEnterForeground:
代理,程序從Background狀態改為Active狀態,接著調用applicationDidBecomeActive:
代理。當app處于掛起狀態時,它是不能執行任何代碼的。因此它不能處理在掛起期間發過來的通知,比如方向改變,時間改變,設置的改變還有其他影響程序展現的或狀態的通知。在程序返回后臺或前臺時,程序要正確的處理這些通知。
- App終止
當App被系統終止(如內存不足、Crash)或者用戶自行終止。系統會在應用程序終止之前調用applicationWillTerminate:
代理,來保存用戶的一些重要數據以便下次啟動時恢復到app原來的狀態。
參考文章: