iOS-APP、應(yīng)用程序生命周期

上一篇: iOS-視圖、控制器生命周期

前言,之前簡單了解控制器視圖的聲明周期,當(dāng)然要了解一下應(yīng)用程序的生命周期。

Main函數(shù)入口

代碼中有一個很重要的函數(shù)UIApplicationMain,它主要是創(chuàng)建app的幾個核心對象來處理以下過程:

  • 1.從可用Storyboard文件加載用戶界面
  • 2.調(diào)用AppDelegate自定義代碼來做一些初始化設(shè)置
  • 3.將app放入Main Run Loop環(huán)境中來響應(yīng)和處理與用戶交互產(chǎn)生的事件
#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    } 
}

應(yīng)用程序狀態(tài)。

  • Not running(未運行):程序未啟動
  • Inactive(未激活):其他兩個狀態(tài)切換時出現(xiàn)的短暫狀態(tài)。唯一在此狀態(tài)停留時間比較長的情況是:當(dāng)用戶鎖屏?xí)r?或者系統(tǒng)提示用戶去響應(yīng)Alert窗口(如來電、信息)時
  • Active(激活):在屏幕上顯示的正常運行狀態(tài),該狀態(tài)下可以接收用戶輸入并更新顯示
  • Backgroud(后臺):程序在后臺且能執(zhí)行代碼。用戶按下Home鍵不久后進入此狀態(tài)(先進入了Inactive狀態(tài),再進入Background狀態(tài)),然后會迅速進入掛起狀態(tài)(Suspended)。有的程序經(jīng)過特殊的請求后可以長期處于Backgroud狀態(tài)
  • Suspended(掛起):程序在后臺不能執(zhí)行代碼。普通程序在進入Background狀態(tài)不久后就會進入此狀態(tài)。當(dāng)掛起時,程序還是停留在內(nèi)存中的,當(dāng)系統(tǒng)內(nèi)存低時,系統(tǒng)就把掛起的程序清除掉,為前臺程序提供更多的內(nèi)存
應(yīng)用程序狀態(tài)流程

Active和Inactive的切換:

  • 應(yīng)用程序在前臺時有2種狀態(tài):Active和Inactive。大多數(shù)情況下,Inactive狀態(tài)只是其他兩個狀態(tài)切換時出現(xiàn)的短暫狀態(tài)(不是任意兩個狀態(tài)之間的切換都會進入Inactive),如打開應(yīng)用,它會從Not Running先進入Inactive再進入Active;如前后臺應(yīng)用切換時,Inactive會在Active和Background之間短暫出現(xiàn)。

  • 但也有其他情況,Active和Inactive可以在前臺運行時進行切換,比如系統(tǒng)彈出Alert,此時應(yīng)用會從Active切換到Inactive,直到用戶確認(rèn)再返回Actvie;再如用戶拉下通知頁,也會發(fā)生Active和Inactive的切換;還有來電但拒接、雙擊Home鍵但返回原應(yīng)用等都不進入Background,而只是在Active和Inactive切換。

AppDelegate類方法

各個程序運行狀態(tài)時代理的回調(diào):
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      告訴代理進程啟動但還沒進入狀態(tài)保存
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
     告訴代理啟動基本完成程序準(zhǔn)備開始運行
- (void)applicationWillResignActive:(UIApplication *)application
    當(dāng)應(yīng)用程序?qū)⒁敕腔顒訝顟B(tài)執(zhí)行,在此期間,應(yīng)用程序不接收消息或事件,比如來電話了
- (void)applicationDidBecomeActive:(UIApplication *)application 
     當(dāng)應(yīng)用程序入活動狀態(tài)執(zhí)行,這個剛好跟上面那個方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
    當(dāng)程序被推送到后臺的時候調(diào)用。所以要設(shè)置后臺繼續(xù)運行,則在這個函數(shù)里面設(shè)置即可
- (void)applicationWillEnterForeground:(UIApplication *)application
    當(dāng)程序從后臺將要重新回到前臺時候調(diào)用,這個剛好跟上面的那個方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
    當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用,通常是用來保存數(shù)據(jù)和一些退出前的清理工作。這個需要要設(shè)置UIApplicationExitsOnSuspend的鍵值。
- (void)applicationDidFinishLaunching:(UIApplication*)application
    當(dāng)程序載入后執(zhí)行
程序啟動順序圖
1.application:didFinishLaunchingWithOptions:

程序首次已經(jīng)完成啟動時執(zhí)行,若直接啟動,launchOptions中沒有數(shù)據(jù);否則,launchOptions將包含對應(yīng)方式的內(nèi)容(比如從微信中啟動節(jié)奏大師--)。

2.applicationWillResignActive(將進入后臺)

程序?qū)⒁ctive狀態(tài)時調(diào)用,比如按下Home鍵或有電話信息進來。對應(yīng)applicationWillEnterForeground(將進入前臺),這個方法用處:

  • 暫停正在執(zhí)行的任務(wù);
  • 禁止計時器;
  • 減少OpenGL ES幀率;
  • 若為游戲應(yīng)暫停游戲;
3.applicationDidEnterBackground(已經(jīng)進入后臺)

程序已經(jīng)進入后臺時調(diào)用,對應(yīng)applicationDidBecomeActive(已經(jīng)變成前臺),這個方法用來:釋放、保存

  • 釋放共享資源;
  • 保存用戶數(shù)據(jù)(寫到硬盤);
  • 作廢計時器;
  • 保存足夠的程序狀態(tài)以便下次恢復(fù);
4.applicationWillEnterForeground(將進入前臺)

程序即將進去前臺時調(diào)用,對應(yīng)applicationWillResignActive(將進入后臺)。這個方法用來撤銷applicationWillResignActive中做的改變。

5.applicationDidBecomeActive(已經(jīng)進入前臺)

程序已經(jīng)變?yōu)锳ctive(前臺)時調(diào)用。對應(yīng)applicationDidEnterBackground(已經(jīng)進入后臺)。若程序之前在后臺,最后在此方法內(nèi)刷新用戶界面。

6.applicationWillTerminate

程序即將退出時調(diào)用。記得保存數(shù)據(jù),如applicationDidEnterBackground方法一樣。

7.獲取狀態(tài)

  • 如果類是AppDelegate類(聲明遵循UIApplicationDelegate協(xié)議),那么可以實現(xiàn)上面的6個方法,當(dāng)App狀態(tài)改變的時候相應(yīng)的方法會被調(diào)用
  • 如果類不是AppDelegate類,那么該類使用NotificationCenter來通知知道App的各種狀態(tài)變化。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:[UIApplication sharedApplication]];

然后實現(xiàn)applicationWillResignActive就行了

- (void)applicationWillResignActive        //自定義的函數(shù)
{
    NSLog(@"%@", NSStringFromSelector(_cmd));
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容