天天看點

iOS應用生命周期

 作為應用程式的委托對象,appdelegate類在應用生命周期的不同階段會回調不同的方法。首先,讓我們先了解一下ios 應用的不同狀态及它們彼此間的關系,見圖1 。

iOS應用生命周期

                                                            圖1 ios應用狀态圖

  下面簡要介紹一下ios 應用的5種狀态。

 not running(非運作狀态)。應用沒有運作或被系統終止。

 inactive (前台非活動狀态)。應用正在進入前台狀态,但是還不能接受事件處理。

 active (前台活動狀态)。應用進入前台狀态,能接受事件處理。

 background(背景狀态)。應用進入背景後,依然能夠執行代碼。如果有可執行的代碼,就會執行代碼,如果沒有可執行的代碼或者将可執行的代碼執行完畢,應用會馬上進入挂起狀态。 

 suspended(挂起狀态)。處于挂起的應用進入一種“冷凍”狀态,不能執行代碼。如果系統記憶體不夠,應用會被終止。 

在應用狀态躍遷的過程中,ios 系統會回調appdelegate中的一些方法,并且發送一些通知。實際上,在應用的生命周期中用到的方法和通知很多,我們選取了幾個主要的方法和通知進行詳細介紹,具體如表1所述。

                                                      表1 狀态躍遷過程中應用回調的方法和本地通知

iOS應用生命周期

  為了便于觀察應用程式的運作狀态,我們為appdelegate.m中的方法添加一些日志輸出,具體代碼如下:

 為了讓大家更直覺地了解各狀态與其相應的方法、通知間的關系,下面我們以幾個應用場景為切入點進行系統的分析。

(一)非運作狀态——應用啟動場景

  場景描述:使用者點選應用圖示的時候,可能是第一次啟動這個應用,也可能是應用終止後再次啟動。該場景的狀态躍遷過程見圖2 ,共經曆兩個階段3個狀态:not running →inactive→active。

 在not running→inactive 階段。調用application:didfinishlaunchingwithoptions:方法,發出uiapplicationdidfinishlaunchingnotification 通知。 

 在inactive →active 階段。調用 applicationdidbecomeactive: 方法,發出uiapplicationdidbecomeactivenotification 通知。

iOS應用生命周期

                                                                       圖2 應用啟動場景的狀态躍遷過程 

(二)點選home鍵——應用退出場景

  場景描述:應用處于運作狀态(即active狀态)時,點選home鍵或者有其他的應用導緻目前應用中斷。該場景的狀态躍遷過程可以分成兩種情況:可以在背景運作或者挂起,不可以在背景運作或者挂起。根據産品屬性檔案(如helloworld-info.plist)中的相關屬性application does not run in background 是與否可以控制這兩種狀态。如果采用文本編輯器打開helloworldinfo.plist檔案該設定項對應的鍵是uiapplicationexitsonsuspend。 

  狀态躍遷的第一種情況:應用可以在背景運作或者挂起,該場景的狀态躍遷過程見圖3 ,共經曆3 個階段4個狀态:active → inactive → background→suspended。 

   在active→inactive 階段。調用 applicationwillresignactive:方法,發出uiapplicationwillresignactivenotification 通知。 

 在inactive →background階段。應用從非活動狀态進入到背景(不涉及我們要重點說明的方法和通知)。

 在background→suspended 階段。調用applicationdidenterbackground:方法,發出uiapplicationdidenterbackgroundnotification 通知。

               

iOS應用生命周期

                               圖3 點選home鍵應用退出場景

  狀态躍遷的第二種情況:應用不可以在背景運作或者挂起,其狀态躍遷情況見圖4 ,共經曆4個階段5 個狀态:active  → inactive  → background→suspended→not running 。

   在active →inactivd 階段。應用由活動狀态轉為非活動狀态(不涉及我們要重點說明的方法和通知)。

 在background→suspended 階段。調用applicationdidenterbackground:方法, 發出uiapplicationdidenterbackgroundnotification 通知。

 在suspended →not running階段。調用applicationwillterminate:方法,發出uiapplicationwillterminatenotification通知。

iOS應用生命周期

                      圖4 點選home鍵,應用退出場景

  ios 在ios 4之前不支援多任務,點選home鍵時,應用會退出并中斷;而在ios 4之後(包括ios 4),作業系統能夠支援多任務處理,點選home鍵應用會進入背景但不會中斷(記憶體不夠的情況除外)。

應用在背景也可以進行部分處理工作,處理完成則進入挂起狀态。

(三)挂起重新運作場景

  場景描述:挂起狀态的應用重新運作。該場景的狀态躍遷過程如圖5 所示,共經曆3 個階段4 個狀态:suspended  → background  → inactive  → active 。

iOS應用生命周期

                  圖5 重新運作場景的狀态躍遷過程

   suspended→background階段。應用從挂起狀态進入背景(不涉及我們講述的這幾個方法和通知)。

 background→inactive 階段。調用applicationwillenterforeground: 方法,發出uiapplicationwillenterforegroundnotification通知。 

 inactive →active 階段。調用applicationdidbecomeactive:方法,發出uiapplicationdidbecomeactivenotification 通知。

(四)記憶體清除——應用終止場景

  場景描述:應用在背景處理完成時進入挂起狀态(這是一種休眠狀态),如果這時發出低記憶體警告,為了滿足其他應用對記憶體的需要,該應用就會被清除記憶體進而終止運作,該場景的狀态躍遷見圖6 。 

                      

iOS應用生命周期

                        圖6 記憶體清除終止場景

  記憶體清除的時候應用終止運作。記憶體清除有兩種情況,可能是系統強制清除記憶體,也可能是由使用者從工作列中手動清除(即删掉應用)。記憶體清除後如果應用再次運作,上一次的運作狀态不會被儲存,相當于應用第一次運作。

  在記憶體清除場景下,應用不會調用任何方法,也不會發出任何通知。

繼續閱讀