iOS App生命週期初識

weixin_33936401發表於2015-12-27

面對每次開啟iOS應用時.都是否想到過其App執行過程:從啟動到按Home鍵回到主螢幕,從執行中到按兩下Home鍵進入任務管理介面,甚至iOS9後支援多工的iPad當兩個App出現在同一螢幕上,這幾個情況App所處於什麼狀態.其過渡中又在進行怎樣的狀態切換呢,Let's get it !!! ?

App狀態變化的歷史

iOS4之前的App時代,整個介面只允許一個App處於執行狀態,而當某個App處於執行狀態時意味著其他所有的App的活動都被終止並退出,無法接受任何事件.一個應用的狀態轉換隻有執行、退出之間的變換.在iOS4之後的iPhone進入了多工處理時代.也意味了當從一個應用切換到另一個應用時,系統不會馬上將原來的應用終止退出,將其狀態變成了suspend,而另一個應用的狀態變成了running.

AppDelegate

執行一個App,應用程式會自動建立UIApplication單例物件,並用於引用著,其UIApplicaiton例項的delegate被賦值為AppDelegate例項物件,其也是一個單例,也永遠不會被釋放直到該App退出.而AppDelegate物件有著一系列在程式啟動時的跟蹤狀態變化,處理從其他應用跳轉、啟動到此應用,或者後臺執行程式碼的方法.以下是AppDelegate做為App的根物件的主要功能:

  1. 執行在啟動時自己用來初始化應用的特點程式碼.
  2. 響應App從啟動,到後臺,到前臺,到退出時各個狀態時的指定方法.
  3. 負責處理接收推送通知或本地通知啟動App的情況,處理手機低記憶體警告時的情況.
  4. 負責處理應用程式的狀態儲存和恢復.
  5. 響應由App處理的事件,而是指定控制器或檢視.
  6. 處理資料的儲存.

App狀態的代理事件

新建一個Signle View Application後,系統會自動建立AppDelegate檔案,系統預設提供的方法表示了App不同的執行狀態.

  • application:willFinishLaunchingWithOptions
    在App啟動時呼叫表示應用載入程式已經開始,常用來處理應用狀態的儲存和恢復

  • application:didFinishLaunchingWithOptions
    表示App將從未執行狀態進入執行狀態,用於對App的初始化操作.

  • applicationDidBecomeActive
    application:didFinishLaunchingWithOptions:之後呼叫,表示應用進入active狀態,在applicationWillResignActive呼叫後App又回到active狀態時也會呼叫.

  • applicationWillResignActive
    當某一操作阻塞App介面時會呼叫,如按Home鍵回到鍵入主介面,劃出通知欄或者設定,臨時的電話和通知,支援多工的iPad進行側邊欄滑動時等情況下都會呼叫,使得App進入inavtive狀態,往往操作結束後會呼叫applicationDidBecomeActive,使得App回到active狀態.

  • applicationDidEnterBackground
    在App進入後臺後呼叫,之前肯定會呼叫applicationWillResignActive方法.允許執行短時間 的任務程式碼如清理記憶體

  • applicationWillEnterForeground
    當App將從後臺回到前臺時呼叫,之後肯定呼叫applicationDidBecomeActive方法表示程式進入active狀態,但App第一次啟動時不是從後臺啟動,所以首次載入時不會呼叫此方法.

  • applicationWillTerminate
    當App將要被系統殺死時呼叫,通常用來對App進行清理工作,釋放資源,儲存資料等等,所執行的操作官方推薦最多耗時5s左右的事件來完成和返回,若時間過長系統殺死應用時會將使操作失敗.其呼叫時機比較特殊,如果執行的App直接退出(非進入後臺),會呼叫;若應用是從中斷狀態(此狀態期間App無法接收任何事件)被系統退出,則不會被呼叫.

注意點

iOS8中,App會在根控制器初始化後呼叫viewDidAppear方法之後才會呼叫applicationDidBecomeActive,對於App啟動的事件順序為

application:didFinishLaunchingWithOptions:
⬇️
viewDidLoad
⬇️
viewWillAppear
⬇️
viewDidAppear
⬇️
applicationDidBecomeActive

而在iOS7和9中,App在呼叫applicationDidBecomeActive方法後才會呼叫根控制器的viewDidAppear,其呼叫順序為

application:didFinishLaunchingWithOptions:
⬇️
viewDidLoad
⬇️
viewWillAppear
⬇️
applicationDidBecomeActive
⬇️
viewDidAppear

在這兩情況下如果要對UIApplicationDidBecomeActiveNotification進行通知註冊時就需要考慮其iOS的相容性,否則就會出現問題了.

相關文章