iOS App生命週期初識
面對每次開啟
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的根物件的主要功能:
- 執行在啟動時自己用來初始化應用的特點程式碼.
- 響應App從啟動,到後臺,到前臺,到退出時各個狀態時的指定方法.
- 負責處理接收推送通知或本地通知啟動App的情況,處理手機低記憶體警告時的情況.
- 負責處理應用程式的狀態儲存和恢復.
- 響應由
App
處理的事件,而是指定控制器或檢視. - 處理資料的儲存.
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的相容性,否則就會出現問題了.
相關文章
- mpvue生命週期初探Vue
- iOS App生命週期iOSAPP
- iOS APP的生命週期iOSAPP
- iOS-APP的啟動流程和生命週期iOSAPP
- App的生命週期APP
- 小程式目錄結構,頁面載入,生命週期初探筆記筆記
- iOS開發-生命週期iOS
- uni-app 生命週期APP
- 【UniApp】-uni-app-OptionAPI應用生命週期和頁面生命週期APPAPI
- 【UniApp】-uni-app-CompositionAPI應用生命週期和頁面生命週期APPAPI
- 重新認識 React 生命週期React
- vue 原始碼詳解(二): 元件生命週期初始化、事件系統初始化Vue原始碼元件事件
- [轉] IOS中AppDelegate中的生命週期事件的呼叫條件iOSAPP事件
- iOS 生命週期的缺失和錯亂iOS
- Abp Application級別的生命週期APP
- Activity 知識梳理(1) Activity生命週期
- iOS執行緒生命週期的監控iOS執行緒
- iOS 檢視控制器的生命週期iOS
- IOS開發之UIController生命週期iOSUIController
- iOS初級開發學習筆記:APP生命週期的學習總結iOS筆記APP
- Apple Watch學習之路 生命週期研究APP
- Android知識重溫之生命週期Android
- 初識Android之Activity的生命週期Android
- iOS10 UI教程檢視的生命週期iOSUI
- 生命週期
- react: 元件初識 && 生命週期 && 相關說明React元件
- iOS 基礎01--專案檔案、applecation、啟動過程、VC生命週期iOSAPP
- 框架層理解Activity生命週期(APP啟動過程)框架APP
- View生命週期與Activity生命週期的關係View
- PHP 生命週期PHP
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session
- Fragment生命週期Fragment
- Activity生命週期
- vue - 生命週期Vue
- React生命週期React
- ubuntu生命週期Ubuntu
- React 生命週期React