標籤:
iOS系列 基礎篇 03 探究應用生命週期
目錄:
1. 非運行狀態 - 應用啟動情境
2. 點擊Home鍵 - 應用退出情境
3. 掛起重新運行情境
4. 記憶體清除 - 應用終止情境
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 true12 }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檔案,從而觀察每個狀態躍遷的過程,結合上面那些圖,理解就會更加深刻了。
iOS系列 基礎篇 03 探究應用生命週期