iOS系列 基礎篇 03 探究應用生命週期

來源:互聯網
上載者:User

標籤:

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 探究應用生命週期

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.