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