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:實現的一樣