面對每次打開
iOS應用時.都是否想到過其App運行過程:從啟動到按Home鍵回到主屏幕,從運行中到按兩下Home鍵進入任務管理界面,甚至iOS9后支持多任務的iPad當兩個App出現(xiàn)在同一屏幕上,這幾個情況App所處于什么狀態(tài).其過渡中又在進行怎樣的狀態(tài)切換呢,Let's get it !!! ??
App狀態(tài)變化的歷史
在iOS4之前的App時代,整個界面只允許一個App處于運行狀態(tài),而當某個App處于運行狀態(tài)時意味著其他所有的App的活動都被終止并退出,無法接受任何事件.一個應用的狀態(tài)轉換只有運行、退出之間的變換.在iOS4之后的iPhone進入了多任務處理時代.也意味了當從一個應用切換到另一個應用時,系統(tǒng)不會馬上將原來的應用終止退出,將其狀態(tài)變成了suspend,而另一個應用的狀態(tài)變成了running.
AppDelegate
運行一個App,應用程序會自動創(chuàng)建UIApplication單例對象,并用于引用著,其UIApplicaiton實例的delegate被賦值為AppDelegate實例對象,其也是一個單例,也永遠不會被釋放直到該App退出.而AppDelegate對象有著一系列在程序啟動時的跟蹤狀態(tài)變化,處理從其他應用跳轉、啟動到此應用,或者后臺運行代碼的方法.以下是AppDelegate做為App的根對象的主要功能:
- 運行在啟動時自己用來初始化應用的特點代碼.
- 響應App從啟動,到后臺,到前臺,到退出時各個狀態(tài)時的指定方法.
- 負責處理接收推送通知或本地通知啟動App的情況,處理手機低內存警告時的情況.
- 負責處理應用程序的狀態(tài)保存和恢復.
- 響應由
App處理的事件,而是指定控制器或視圖. - 處理數(shù)據(jù)的存儲.
App狀態(tài)的代理事件
新建一個Signle View Application后,系統(tǒng)會自動創(chuàng)建AppDelegate文件,系統(tǒng)默認提供的方法表示了App不同的運行狀態(tài).
application:willFinishLaunchingWithOptions
在App啟動時調用表示應用加載進程已經(jīng)開始,常用來處理應用狀態(tài)的存儲和恢復application:didFinishLaunchingWithOptions
表示App將從未運行狀態(tài)進入運行狀態(tài),用于對App的初始化操作.applicationDidBecomeActive
在application:didFinishLaunchingWithOptions:之后調用,表示應用進入active狀態(tài),在applicationWillResignActive調用后App又回到active狀態(tài)時也會調用.applicationWillResignActive
當某一操作阻塞App界面時會調用,如按Home鍵回到鍵入主界面,劃出通知欄或者設置,臨時的電話和通知,支持多任務的iPad進行側邊欄滑動時等情況下都會調用,使得App進入inavtive狀態(tài),往往操作結束后會調用applicationDidBecomeActive,使得App回到active狀態(tài).applicationDidEnterBackground
在App進入后臺后調用,之前肯定會調用applicationWillResignActive方法.允許執(zhí)行短時間 的任務代碼如清理內存applicationWillEnterForeground
當App將從后臺回到前臺時調用,之后肯定調用applicationDidBecomeActive方法表示程序進入active狀態(tài),但App第一次啟動時不是從后臺啟動,所以首次加載時不會調用此方法.applicationWillTerminate
當App將要被系統(tǒng)殺死時調用,通常用來對App進行清理工作,釋放資源,保存數(shù)據(jù)等等,所執(zhí)行的操作官方推薦最多耗時5s左右的事件來完成和返回,若時間過長系統(tǒng)殺死應用時會將使操作失敗.其調用時機比較特殊,如果運行的App直接退出(非進入后臺),會調用;若應用是從中斷狀態(tài)(此狀態(tài)期間App無法接收任何事件)被系統(tǒng)退出,則不會被調用.
注意點
iOS8中,App會在根控制器初始化后調用viewDidAppear方法之后才會調用applicationDidBecomeActive,對于App啟動的事件順序為
application:didFinishLaunchingWithOptions:
??
viewDidLoad
??
viewWillAppear
??
viewDidAppear
??
applicationDidBecomeActive
而在iOS7和9中,App在調用applicationDidBecomeActive方法后才會調用根控制器的viewDidAppear,其調用順序為
application:didFinishLaunchingWithOptions:
??
viewDidLoad
??
viewWillAppear
??
applicationDidBecomeActive
??
viewDidAppear
在這兩情況下如果要對UIApplicationDidBecomeActiveNotification進行通知注冊時就需要考慮其iOS的兼容性,否則就會出現(xiàn)問題了.