iOS初級開發學習筆記:APP生命週期的學習總結

咱們日常使用APP時,通常人都會知道有:簡單的正在使用狀態;經過home鍵等方式離開應用,可是不關閉應用,即後臺狀態;以及調出後臺程序管理後向上滑動將應用「殺死」,三種狀態。而咱們開發者則會了解得更深便於進行開發工做。還有更多更深的知識還須要在將來進行探索後總結。而接下來將對當前初級階段對APP的生命週期所學知識進行總結。緩存

應用程序的五種狀態

1. Not running:

應用尚未啓動,或者應用正在運行可是途中被系統中止。bash

2. Inactive:

當前應用正在前臺運行,可是並不接收事件(當前或許正在執行其它代碼)。通常每當應用要從一個狀態切換到另外一個不一樣的狀態時,中途過渡會短暫停留在此狀態。例如用戶鎖屏或者接到通知去響應別的事件的時候。網絡

3. Active:

當前應用正在前臺運行,而且接收事件。這是應用正在前臺運行時所處的正常狀態。app

4. Background:

應用處在後臺,而且還在執行代碼。大多數將要進入Suspended狀態的應用,會先短暫進入此狀態。除了一些通過特殊的請求後能夠長期處於此狀態的應用。存在一些啓動後會直接進入background狀態的應用。函數

5. Suspended:

應用處在後臺,而且已中止執行代碼。系統會自動把程序變成這個狀態並且不會發出通知。當掛起時,程序仍是停留在內存中的,當系統內存低時,系統就把掛起的程序清除掉,爲前臺程序提供更多的內存。優化

iOS程序執行過程

可由下圖作一個總覽: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 
複製代碼

在此添加NSLog打印進行相關操做時執行的方法

各個操做時方法執行順序均爲從上到下。代理

分爲啓動程序時: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:]
複製代碼

瞭解了APP運行中的幾種狀態和週期,咱們能夠對一些情況進行響應的優化和處理。

例如當出現忽然來電話了等致使程序臨時進入Inactive狀態時,咱們能夠在applicationWillResignActive:方法中:

  • 中止timer 和其餘週期性的任務
  • 中止任何正在運行的請求
  • 暫停視頻的播放
  • 若是是遊戲那就暫停它
  • 減小OpenGL ES的幀率
  • 掛起任何分發的隊列和不重要的操做隊列(你能夠繼續處理網絡請求或其餘時間敏感的後臺任務)。

當程序進入後臺時:

應該實現:

  • 保存用戶數據或狀態信息,全部沒寫到磁盤的文件或信息,在進入後臺時,最後都寫到磁盤去,由於程序可能在後臺被殺死
  • 釋放盡量釋放的內存

在後臺時,每一個應用程序都應該釋放最大的內存。系統會盡量保證多的應用程序在後臺運行。因此後臺會爲了減小程序佔用的內存自動回收一些系統幫助你開闢的內存,如:

  • 系統回收Core Animation的後備存儲
  • 去掉任何系統引用的緩存圖片
  • 去掉系統管理數據緩存強引用

咱們也能夠作一些努力:

把一些對象的強引用去掉,這樣編譯器就能夠回收這些內存:

  • 圖片對象
  • 你能夠從新加載的 大的視頻或數據文件
  • 任何沒用並且能夠輕易建立的對象

程序終止時:

APP終止時,系統會調用applicationWillTerminate:方法,咱們能夠在其中進行一些保存數據或狀態或一些清理的工做。方法中的這些工做會有最多5秒的時間限制,若是超過期間還有未完成的任務,你的程序就會被終止並且從內存中清除。

而像進入後臺和程序終止狀態,若是還須要長時間的運行任務,能夠調用 beginBackgroundTaskWithExpirationHandler方法去請求後臺運行時間和啓動線程來運行長時間運行的任務。

相關文章
相關標籤/搜索