APP啓動原理,APPdelegate程序狀態解析

根據以上兩張圖片來看,app的啓動過程以下:微信

一、打開app,調用main函數app

二、main調用UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))ide

第三個參數nil:表明UIApplication類名或者子類名稱,nil 至關於 @"UIApplicaiton";
第四個參數:表明UIApplicaiton的代理名稱NSStringFromClass([AppDelegate class] 至關於 @"AppDelegate";函數

    2.一、UIApplicationMain建立UIApplication對象,AppDelegate對象(UIApplication的代理)oop

    2.二、UIApplication開啓運行循環(Main Runloop)ui

注:UiApplication表明一個應用程序,每個應用程序都有一個UIApplication全局對象(單例),咱們在程序中能夠經過[UIApplication sharedApplication]得到這個對象,進行一些應用級的操做。UIApplication負責監聽接收事件,而由UIApplicationDelegate決定應用程序如何去響應這些事件(生命週期:程序啓動和關閉,系統事件:來電、記事項警告)等等。spa

    2.三、加載info.plist,判斷是否指定mian(xib或者storyboard)若是指定就去加載代理

三、UIApplicationDelegate對象開始處理監聽到的事件(code

      程序啓動成功以後,首先調用application:didFinishLaunchingWithOptions:方法,
  若是info.plist文件中配置了啓動storyboard文件名,則加載storyboard文件。
  若是沒有配置,則根據代碼來建立UIWindow--->UIWindow的rootViewController-->顯示)對象

info.plist文件:

Localiztion native development region CFBundleDevelopmentRegion 本地化相關,若是用戶所在地沒有相應的語言資源,則用這個key的value來做爲默認
Executaule file CFBundleExecutable 程序安裝包的名稱
Bundle name CFBundleDisplayName 設置程序安裝後顯示的名稱。應用程序名稱限制在10-12個字符,若是超出,將被顯示縮寫名稱
Bundle identifier CFBundleIdentifier APP的惟一標識字符串。
InfoDictionary version CFBundleInfoDictionaryVersion  Info.plist格式的版本信息
Bundle OS Type code CFBundlePackageType  用來標識束類型的四個字母長的代碼(目前沒用到過,還不清楚怎麼用)
Bundle versions string, short CFBundleShortVersionString 版本字符串(版本號)
Bundle version CFBundleVersion 構建版本號,每次上傳以後須要增長
Application require iPhone environment LSRequiresIPhoneOS:用於指示程序包是否只能運行在iPhone OS 系統上。Xcode自動加入這個鍵,並將它的值設置爲true。您不該該改變這個鍵的值。
supported interface orientations UISupportedInterfaceOrientations 程序默認支持的方向。

 

APP的狀態:

Not running ( 未運行 ): 程序沒啓動

Inactive ( 未激活 ): 程序在前臺運行,不過沒有接收到事件。在沒有事件處理狀況下程序一般停留在這個狀態。

Active ( 激活 ): 程序在前臺運行並且接收到了事件。這也是前臺的一個正常的模式。

Backgroud ( 後臺 ): 程序在後臺並且能執行代碼,大多數程序進入這個狀態後會在在這個狀態上停留一會。時間到以後會進入掛起狀態(Suspended)。有的程序通過特殊的請求後能夠長期處於Backgroud狀態。

Suspended ( 掛起 ): 程序在後臺可是卻不能執行代碼。系統會自動把程序變成這個狀態並且不會發出通知
當掛起時,程序仍是停留內存中的,當系統內存低時,系統就把掛起的程序清除掉,爲前臺程序提供更多的內存。

APPdelegate中狀態改變調用的方法:

// 程序 開始運行
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      // Override point for customization after application launch.
      return YES;
  }

  // 程序 掛起(有電話進來 或者 鎖屏(拉下狀態欄、雙擊Home鍵使App界面上移) 的時候)
  - (void)applicationWillResignActive:(UIApplication *)application {
    
  }

  // 程序 進入後臺
  - (void)applicationDidEnterBackground:(UIApplication *)application {
  
  }

  // 程序 進入前臺
  - (void)applicationWillEnterForeground:(UIApplication *)application {
  
  }

  // 程序 從新激活(復原)注意:應用程序在啓動時,在調用了「applicationDidFinishLaunching」方法以後 一樣也會 調用「applicationDidBecomeActive」方法!
  - (void)applicationDidBecomeActive:(UIApplication *)application {


  }

  // 程序 終止(注:若是點擊主按鈕強制退出,則不會調用該方法。)
  - (void)applicationWillTerminate:(UIApplication *)application {
     

  }

實際使用中碰到的幾個場景:

  • 「點擊桌面圖標,正常啓動App」 或者 「殺死進程後點擊推送消息,啓動App」 :
    1.application:willFinishLaunchingWithOptions
    2.application:application:didFinishLaunchingWithOptions
    3.applicationDidBecomeActive
    4.application:didRegisterForRemoteNotificationsWithDeviceToken // 接收、處理消息通知

  • 拖下通知中心/雙擊Home鍵,使App界面上移
    applicationWillResignActive

  • 拖上通知中心/再雙擊Home鍵,使App界面恢復原位
    applicationDidBecomeActive

  • 按Home鍵,使App 進入後臺
    1.applicationWillResignActive
    2.applicationDidEnterBackground

  • 點擊App圖標,使App從後臺 恢復至前臺
    1.applicationWillEnterForeground
    2.applicationDidBecomeActive

  • 點擊通知中內心面的遠程推送,使App從後臺 進入前臺
    1.applicationWillEnterForeground
    2.application:didReceiveRemoteNotification // 接收、處理消息通知
    3.applicationDidBecomeActive

  • 上滑 或者 按住App圖標,選擇減號圖標,殺死App進程(終止程序)
    applicationWillTerminate

  • 從APP切換到微信之類的其餘應用以後,再切換回來時 1.applicationWillEnterForeground 2.application:openURL:sourceApplication // 應用間⭐️傳值⭐️ 3.applicationDidBecomeActive
相關文章
相關標籤/搜索