咱們日常使用APP時,通常人都會知道有:簡單的正在使用狀態;經過home鍵等方式離開應用,可是不關閉應用,即後臺狀態;以及調出後臺程序管理後向上滑動將應用「殺死」,三種狀態。而咱們開發者則會了解得更深便於進行開發工做。還有更多更深的知識還須要在將來進行探索後總結。而接下來將對當前初級階段對APP的生命週期所學知識進行總結。緩存
應用尚未啓動,或者應用正在運行可是途中被系統中止。bash
當前應用正在前臺運行,可是並不接收事件(當前或許正在執行其它代碼)。通常每當應用要從一個狀態切換到另外一個不一樣的狀態時,中途過渡會短暫停留在此狀態。例如用戶鎖屏或者接到通知去響應別的事件的時候。網絡
當前應用正在前臺運行,而且接收事件。這是應用正在前臺運行時所處的正常狀態。app
應用處在後臺,而且還在執行代碼。大多數將要進入Suspended狀態的應用,會先短暫進入此狀態。除了一些通過特殊的請求後能夠長期處於此狀態的應用。存在一些啓動後會直接進入background狀態的應用。函數
應用處在後臺,而且已中止執行代碼。系統會自動把程序變成這個狀態並且不會發出通知。當掛起時,程序仍是停留在內存中的,當系統內存低時,系統就把掛起的程序清除掉,爲前臺程序提供更多的內存。優化
可由下圖作一個總覽:spa
其中,監聽系統事件的方法在AppDelegate.m文件中,裏面的幾個方法代理的回調分別解釋爲:線程
// 告訴代理啓動基本完成程序準備開始運行
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
複製代碼
// 當應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件,好比打來電話
- (void)applicationWillResignActive:(UIApplication *)application
複製代碼
// 當應用程序入活動狀態執行,此方法跟上面那個方法相反
- (void)applicationDidBecomeActive:(UIApplication *)application
複製代碼
// 當程序被推送到後臺的時候調用。因此要設置後臺繼續運行,則在這個函數裏面設置便可
- (void)applicationDidEnterBackground:(UIApplication *)application
複製代碼
// 當程序從後臺將要從新回到前臺時候調用,此方法跟上面的那個方法相反
- (void)applicationWillEnterForeground:(UIApplication *)application
複製代碼
// 當程序將要退出是被調用,一般是用來保存數據和一些退出前的清理工做
- (void)applicationWillTerminate:(UIApplication *)application
複製代碼
各個操做時方法執行順序均爲從上到下。代理
分爲啓動程序時:code
function:-[AppDelegate application:didFinishLaunchingWithOptions:] line:25 content:-[AppDelegate application:didFinishLaunchingWithOptions:]
複製代碼
function:-[AppDelegate applicationDidBecomeActive:] line:52 content:-[AppDelegate applicationDidBecomeActive:]
複製代碼
點擊home鍵時:
function:-[AppDelegate applicationWillResignActive:] line:33 content:-[AppDelegate applicationWillResignActive:]
複製代碼
function:-[AppDelegate applicationDidEnterBackground:] line:40 content:-[AppDelegate applicationDidEnterBackground:]
複製代碼
雙擊home鍵或點擊圖標再次打開程序時:
function:-[AppDelegate applicationWillEnterForeground:] line:46 content:-[AppDelegate applicationWillEnterForeground:]
複製代碼
function:-[AppDelegate applicationDidBecomeActive:] line:52 content:-[AppDelegate applicationDidBecomeActive:]
複製代碼
applicationWillResignActive:
方法中:應該實現:
在後臺時,每一個應用程序都應該釋放最大的內存。系統會盡量保證多的應用程序在後臺運行。因此後臺會爲了減小程序佔用的內存自動回收一些系統幫助你開闢的內存,如:
咱們也能夠作一些努力:
把一些對象的強引用去掉,這樣編譯器就能夠回收這些內存:
APP終止時,系統會調用applicationWillTerminate:
方法,咱們能夠在其中進行一些保存數據或狀態或一些清理的工做。方法中的這些工做會有最多5秒的時間限制,若是超過期間還有未完成的任務,你的程序就會被終止並且從內存中清除。
而像進入後臺和程序終止狀態,若是還須要長時間的運行任務,能夠調用 beginBackgroundTaskWithExpirationHandler
方法去請求後臺運行時間和啓動線程來運行長時間運行的任務。