天天看點

UIApplication Delegate消息 以及對applicationWillTerminate觸發機制的誤區 UIApplication Delegate消息

UIApplication Delegate消息

作者: xuguoxing  分類: IOS, System, UIKit  釋出時間: 2012-08-29 21:04  ė  6Comments Off

一.UIApplication Delegate消息順序

iOS4之後引入了多任務(multitasking),UIApplication有前台(Foreground)和背景(Background)運作兩種模式,在APP啟動以及前背景之間切換時會調用UIApplicaton的Delegate方法,下圖描述了各種情況下的Delegate消息。

UIApplication Delegate消息 以及對applicationWillTerminate觸發機制的誤區 UIApplication Delegate消息

對應的PDF檔案。

在UIApplication的狀态轉換過程中根據不同的情況會發送不同的Delegate消息,下面主要描述UIApplication狀态轉換的各種情況以及發送哪些Delegate消息及消息的順。

首先将涉及到UIApplication狀态轉換的Delegate消息編号如下:

  1. application:didFinishLaunchingWithOptions:
  2. application:openURL:sourceApplication:annotation:
  3. applicationDidBecomeActive:
  4. applicationWillResignActive:
  5. applicationDidEnterBackground:
  6. applicationWillEnterForeground:
  7. applicationWillTerminate:

則對于下面各種操作Delegate消息的發送順序為

  1. 通過SpringBoard第一次啟動,消息順序為1-3
  2. 通過URL第一次啟動,消息順序為1-2-3
  3. 運作過程中按Home鍵,消息順序為 4-5
    • 若為iOS4.0以下或者Info.plist中設定了UIApplicationExitsOnSuspend,則繼續發送消息 7,然後程式終止;
    • 否則根據程式設定進入Background運作模式或者Suspend狀态。
  4. 運作過程中按鎖屏鍵,消息順序與按Home鍵相同,差別在于此時會關閉所有網絡連接配接(iOS5.0+)
  5. 運作過程中被短信/電話等中斷,則發送消息 4
    • 若使用者選擇短信/電話,則發送消息 5,後續流程與按Home鍵相同。
    • 若使用者忽略短信/電話,則發送消息 3,回到Foreground運作狀态。
  6. 運作過程中輕按兩下Home鍵顯示任務切換器,會發送消息 4
    • 若選擇其他程式或者單擊Home鍵傳回到SpringBoard,則發送消息 5,後續流程與按Home鍵相同。
    • 若再次輕按兩下Home鍵傳回APP,則發送消息 3,回到Foreground運作狀态。
  7. 通過SpringBoard或者任務切換器再次啟動時,消息順序為6-3.

    從背景重新傳回前台的轉換過程中,即6與3消息的中間,在5.1的模拟器中顯示的是Default.png,但在真實裝置上顯示的進入背景的screenshot。

  8. 通過URL再次啟動時,消息順序6-2-3.
  9. 程式在Background/Suspend狀态時,使用者輕按兩下Home鍵,在任務切換器中删除此程式時,APP會立即終止,不會有任何消息發送。
  10. 當程式在Suspend狀态時,若記憶體緊張,系統也會将程式立即終止以回收記憶體,此時也不會有任何消息發送。

二.狀态轉換廣播通知

以上消息隻會發給AppDelegate,如果想在UIViewController中監聽UIApplication的狀态變化,可以監聽以下通知

UIApplicationDidBecomeActiveNotification (iOS 2.0+)

UIApplicationDidEnterBackgroundNotification (iOS 4.0+)

UIApplicationWillEnterForegroundNotification (iOS 4.0+)

UIApplicationWillResignActiveNotification (iOS 2.0+)

UIApplicationWillTerminateNotification (iOS 2.0+)

使用下面代碼可擷取目前Application的運作狀态

[UIApplication sharedApplication].applicationState
           

狀态包括

UIApplicationStateActive

UIApplicationStateInactive

UIApplicationStateBackground

當APP在某個UIViewController顯示時進入背景或者從背景傳回到前台時,并不會調用viewWillDisappear:,viewDidDisappear:,viewWillAppear:,viewDidAppear:系列方法,但此時的視圖确實發生Disappear以及Appear的事件。

如果在這種情況下需要做些處理的話,可以在viewDidAppear:中注冊對上述通知的監聽,在接收到APP進入背景以及從背景傳回時通知時做相應的處理。在viewWillDisappear:中我們可以取消對上述通知的監聽,因為如果目前顯示的不是此視圖,就沒有Disappear以及Appear的事件發生,也就不需要在前背景切換時做任何特殊處理。

需要這樣做的情況有:

  • 在View Appear時需要重新請求資料時;
  • 當視圖包含動畫,在進入背景模式時動畫會停止,傳回到前台時需要重新啟動動畫時;
  • 三.CoreLocation 更新消息

    如果使用CoreLocation,當程式運作在Background模式下出現位置更新時,還有特殊的消息需要處理,見CoreLocation Background Update Messaging。

    參考:

    Understanding iOS 4 Backgrounding and Delegate Messaging

    CoreLocation Background Update Messaging

    Reload application data when the app comes into foreground?

    IOS Default.png show every time when my app enter foreground from background

    iOS how to judge application is running foreground or background?

    iphone app network connection disconnect after screen locking with new ios sdk 5.0

    Locking iPhone disconnects sockets on iOS 5 only

    UIApplicationDelegate Protocol Reference

    UIApplication Class Reference

    轉載-- 清風徐來,水波不興 的部落格  http://www.winddisk.com/2012/08/29/uiapplication-delegate-messagin/

    對于需要在程式退出時候做處理的很有幫助,但是文中說法有誤,更正下。

    一.UIApplication Delegate消息順序中

    9.程式在Background/Suspend狀态時,使用者輕按兩下Home鍵,在任務切換器中删除此程式時,APP會立即終止,不會有任何消息發送。

    此說法不正确,應該區分情況。在IOS4.0以後由于支援多任務,程式可以run in background,切預設該選項是開啟的。 a。如果程式同時啟用了Required background modes,比如App plays audio,此時如果程式home到背景,并且正在播放音樂,此時使用者手動/自動中止程式是會觸發 applicationWillTerminate:的。如果你使用了背景任務處理beginBackgroundTaskWithExpirationHandler也是同樣道理。 b。如果程式在背景時app并沒有背景任務執行,則會進入Suspend,此時手動/自動中止程式則不會觸發 applicationWillTerminate: 的。 總結: 1.程式在Suspend狀态被中止時不會觸發 applicationWillTerminate: 2.程式在Background狀态并且有背景任務執行時被中止則會觸發applicationWillTerminate:

    是以對于需要在程式退出時儲存資料,狀态等的需求,最好在applicationDidEnterBackground:以及applicationWillTerminate:例都做處理。