1. 程式人生 > >iOS總結-APP程式啟動週期

iOS總結-APP程式啟動週期

參考https://www.jianshu.com/p/d60b388b19f5

執行流程:

1.程式入口   進入main函式,設定AppDelegaye稱為函式代理

2.程式完成載入 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

3.建立window視窗

4.程式被啟用- (void)applicationDidBecomeActive:(UIApplication *)application

5.當點選home鍵  程式取消啟用狀態 - (void)applicationWillResignActive:(UIApplication *)application

程式進入後臺- (void)applicationDidEnterBackground:(UIApplication *)application

6.點選進入工程    程式進入前臺 - (void)applicationWillEnterForeground:(UIApplication *)application

程式被啟用 - (void)applicationDidBecomeActive:(UIApplication *)application

applicationWillResignActive(非活動): 當電話、簡訊進來或鎖屏等情況下,這時應用程式掛起進入非活動狀態,也就是手機介面還是顯示著你當前的應用程式的視窗,只不過被別的任務強制佔用了,也可能是即將進入後臺狀態,先進入非活動狀態,再進入後臺狀態

applicationDidEnterBackground:當前視窗不是你的app,大多數程式進入後臺會停留一會,時間到之後進入掛起狀態,特殊處理,如生成一個runloop就可以長期處於後臺狀態執行。

suspender(掛起): 程式在後臺不能執行程式碼。系統會自動把程式變成這個狀態,不能發通知。當系統記憶體低時,清除掉。

main函式解釋:

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

UIApplicationMain函式

UIKIT_EXTERN int UIApplicationMain(int argc, char * _Nonnull * _Null_unspecified argv, NSString * _Nullable principalClassName, NSString * _Nullable delegateClassName);

argc,argv引數是為了與c語言保持一致。

principalClassName(主要類名)和delegateClassName(委託類名)

(1)如果principalClassName是nil,那麼它的將從Info.plist去獲取,如果Info.plist沒有,則預設為UIApplication.principalClass這個類除了管理整個程式的生命週期之外什麼都不做,它只負責監聽事件然後交給delegateClass去做。

  (2)delegateClass將在工程新建時例項化一個物件。NSStringFromClass([AppDelegate class])

  正常啟動:

 切換到後臺: 

點選重新進入程式 

didFinishLaunchingWithOptions:   程式首次已經完成啟動時執行,一般在這個函式裡建立window物件,將程式內容通過window呈現給使用者。

applicationWillResignActive:(非活動)程式失去active狀態時呼叫,如有電話進來或按下home鍵,之後程式進入後臺狀態

該函式裡面主要執行操作: a.暫停正在執行的任務  b.禁止計時器  c. 減少OpenGL ES 幀率  d.若為遊戲應暫停遊戲

applicationDidEnterBackground:已經進入後臺   /    applicationDidBecomeActive 已經變為前臺

該方法用來: a. 釋放共享資源 b. 儲存使用者資料,寫到硬碟   c. 作廢計時器 d. 儲存足夠的程式狀態

 applicationWillEnterForeground:即將進入前臺

操作:撤銷applicationWillResignActive:裡面的操作     

applicationDidBecomeActive  進入前臺  

操作:對應applicationDidEnterBackground:方法裡面的 ,重新整理使用者介面

applicationWillTerminate:  程式即將退出, 和applicationDidEnterBackground:實現的一樣