本篇主要探討的是iOS應用中各種狀態的躍遷過程,建議大家通過修改AppDelegate.swift,在每個過程中添加日誌輸出代碼,從而觀察其變化。 ...
iOS系列 基礎篇 03 探究應用生命周期
目錄:
3. 掛起重新運行場景
5. 結尾
本篇主要探討的是iOS應用中各種狀態的躍遷過程,建議大家通過修改AppDelegate.swift,在每個過程中添加日誌輸出代碼,從而觀察其變化。
作為應用程式的委托對象,AppDelegate類在應用程式生命周期的不同階段會回調不同的方法。
首先,咱們先來瞭解一下iOS應用的不同狀態和他們之間的關係,如圖:
下麵簡要介紹一下iOS應用的5中狀態:
狀態名稱 | 狀態釋義 | 狀態描述 |
Not running | 非活動狀態 | 應用沒有運行或被系統終止。 |
Inactive | 前臺非活動狀態 | 應用正在進入前臺狀態,但是還不能接受事件處理。 |
Active | 前臺活動狀態 | 應用進入前臺狀態,能接受事件處理。 |
Background | 後臺狀態 |
應用進入後臺後,依然能執行代碼。 如果有可執行的代碼,就會執行代碼,如果沒有可執行的代碼或者將可執行的代碼執行完畢,應用會馬上進入掛起狀態。 |
Suspended | 掛起狀態 |
處於掛起狀態的應用進入一種“冰凍”狀態,不能執行代碼。 如果系統記憶體不夠,應用會被終止。 |
在應用狀態躍遷的過程中,iOS系統會回調AppDelegate中的一些方法,並且發送一些通知。
實際上,在應用的生命周期中用到的方法和通知很多,我們選取了幾個主要的方法和通知進行詳細介紹,如下表:
方法 | 本地通知 | 說明 |
application:didFinishLaunchingWithOptions: | UIApplicationDidFinishLaunchingNotification |
應用啟動併進行初始化時會調用該方法併發出通知。 這個階段會實例化根視圖控制器。 |
applicationDidBecomeActive: | UIApplicationDidBecomeActiveNotification |
應用進入前臺並處於非活動狀態時調用該方法併發出通知。 這個階段可以恢復UI的狀態(例如游戲狀態等)。 |
applicationWillResignActive: | UIApplicationWillResignActiveNotification |
應用從活動狀態進入到非活動狀態時調用該方法併發出通知。 這個階段可以保存UI的狀態(例如游戲狀態等)。 |
applicationDidEnterBackground: |
UIApplicationDidEnterBackgroundNotification |
應用進入後臺時調用該方法併發出通知。 這個階段可以保存用戶數據,釋放一些資源(例如釋放資料庫資源等)。 |
applicationWillEnterForeground: | UIApplicationWillEnterForegroundNotification |
應用進入到前臺,但是還沒有處於活動狀態時調用該方法併發出通知。 這個階段可以恢復用戶數據。 |
applicationWillTerminate: | UIApplicationWillTerminateNotification |
應用被終止時調用該方法併發出通知,但記憶體清除時除外。 這個階段釋放一些資源,也可以保存用戶數據。 |
為了便於觀察應用程式的運行狀態,我們在AppDelegate類中的方法添加一些日誌輸出,代碼如下:
1 import UIKit 2 3 @UIApplicationMain 4 class AppDelegate: UIResponder, UIApplicationDelegate { 5 6 var window: UIWindow? 7 8 9 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 10 NSLog("%@", "application:didFinishLaunchingWithOptions:") 11 return true 12 } 13 14 func applicationWillResignActive(application: UIApplication) { 15 NSLog("%@", "applicationWillResignActive:") 16 } 17 18 func applicationDidEnterBackground(application: UIApplication) { 19 NSLog("%@", "applicationDidEnterBackground:") 20 } 21 22 func applicationWillEnterForeground(application: UIApplication) { 23 NSLog("%@", "applicationWillEnterForeground:") 24 } 25 26 func applicationDidBecomeActive(application: UIApplication) { 27 NSLog("%@", "applicationDidBecomeActive:") 28 } 29 30 func applicationWillTerminate(application: UIApplication) { 31 NSLog("%@", "applicationWillTerminate:") 32 } 33 34 35 }AppDelegate.swift
為了讓大家更直觀地瞭解各狀態與其相應地方法、通知間的關係,下麵我們以幾個應用場景為切入點進行系統的分析。
PS:強烈建議大家通過修改上述AppDelegate.swift文件,結合下麵即將講述的各種狀態躍遷,這樣可以更加深刻地理解其中的變化。
1. 非運行狀態 - 應用啟動場景
[場景描述:]
用戶點擊應用圖標的時候,可能是第一次啟動這個應用,也可能是應用終止後再次啟動。
該場景的狀態躍遷過程如下圖,共經歷兩個階段三個狀態:Not running - Inactive - Active。
- 在Not running - Inactive階段:調用application:didFinishLaunchingWithOptions:方法,發出UIApplicationDidFinishLaunchingNotification通知。
- 在Inactive - Active階段:調用applicationDidBecomeActive:方法,發出UIApplicationDidBecomeActiveNotification通知。
2. 點擊Home鍵 - 應用退出場景
[場景描述:]
應用處於運行狀態(即Active狀態)時點擊Home鍵或者有其他的應用導致當前應用中斷。
該場景的狀態躍遷過程可以分成兩種情況:可以在後臺運行或者掛起,不可以在後臺運行或者掛起。
根據產品屬性文件(如Info.plist)中的相關屬性Application does not run in background值的是與否,可以控制這兩種狀態:
如果採用文本編輯器打開Info.plist文件,該設置對應的鍵是UIApplicationExitsOnSuspend。
2.1. 狀態躍遷的第一種情況
應用可以在後臺運行或者掛起。
該場景的狀態躍遷過程如下圖,共經歷三個階段四個狀態:Active - Inactive - Background - Suspended:
-
- 在Active - Inactive階段,調用applicationWillResignActive:方法,發出UIApplicationWillRegisnActiveNotification通知。
- 在Inactive - Background階段,應用從非活動狀態進入到後臺(不涉及我們要重點說明的方法和通知)。
- 在Background - Suspended階段,調用applicationDidEnterBackground:方法,發出UIApplicationDidEnterBackgroundNotification通知。
2.2. 狀態躍遷的第二種情況
應用不可以在後臺運行或者掛起,其狀態躍遷情況如下圖。
共經歷四個階段三個狀態:Active - Inactive - Background - Suspended - Not running:
- 在Active - Inactive階段:應用由活動狀態轉為非活動狀態(不涉及我們要重點說明的方法和通知)。
- 在Inactive - Background階段:應用從非活動狀態進入到後臺(不涉及我們要重點說明的方法和通知)。
- 在Background - Suspended階段:調用applicationDidEnterBackground:方法,發出UIApplicationDidEnterBackgroundNotification通知。
- 在Suspended - Not running階段:調用applicationWillTerminate:方法,發出UIApplicationWillTerminateNotification通知。
iOS在iOS 4之前不支持多任務,點擊Home鍵時,應用會推出並中斷。
而在iOS 4之後(包括iOS 4),操作系統能夠支持多任務處理,點擊Home鍵時應用會進入後臺但不會中斷(記憶體不夠的情況除外)。
應用在後臺也可以進行部分處理工作,處理完畢後進入掛起狀態。
說明:
雙擊Home鍵也可以快速進入iOS多任務欄,如下圖所示(左為iOS 7之後,右為iOS 6之前):
此時可以看到處於後臺運行或掛起狀態的應用,也可能有處於終止狀態的應用。
將這些圖標從任務欄中向上拖拽出去,可以刪除這些後臺應用以釋放記憶體。
3. 掛起重新運行場景
[場景描述:]
掛起狀態的應用重新運行。
該場景的狀態躍遷過程如下圖,共經歷三個階段四個狀態:Suspended - Background - Inactive - Active。
- Suspended - Background階段:應用從掛起狀態進入後臺(不涉及我們講述的幾個方法和調用)。
- Background - Inactive階段:調用applicationWillEnterForeground:方法,發出UIApplicationWillEnterForegroundNotification通知。
- Inactive - Active階段:調用applicationDidBecomeActive:方法,發出UIApplicationBecomeActiveNotificaction通知。
4. 記憶體清除 - 應用終止場景
[場景描述:]
應用在後臺處理完成時進入掛起狀態(這是一種休眠狀態),如果這時發出低記憶體警告,為了滿足其他應用對記憶體的需要,該應用酒會唄清除記憶體從而終止運行。
該場景的狀態躍遷過程如下圖:
記憶體清除的時候應用終止運行。記憶體清除有兩種情況,可能是系統強制清除記憶體,也可能是由使用者從任務欄中手動清除(即刪掉應用)。
記憶體清除後如果應用在此運行,上一次的運行狀態不會被保存,相當於應用第一次運行。
在記憶體清除的場景下,應用不回調用任何方法,也不會發出任何通知。
5. 結尾
強烈建議大家通過修改AppDelegate.swift文件,從而觀察每個狀態躍遷的過程,結合上面那些圖,理解就會更加深刻了。