你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 淺析 UIApplication 生命周期的一些 delegate 辦法

淺析 UIApplication 生命周期的一些 delegate 辦法

編輯:IOS開發綜合

前言

網上有很多關於順序啟動進程和UIApplicationDelegate辦法調用順序的文章。筆者這裡不再引見順序的啟動進程和delegate辦法的調用進程。而是引見一下UIApplication會在什麼狀況下調用UIApplicationDelegate的哪些辦法。以及罕見的場景下,哪些辦法會被調用,蘋果為什麼會這樣做。

回憶

首先讓我們先來回憶下與順序啟動進程相關的一些delegate辦法的調用機遇。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  NSLog(@"順序啟動完成:%s",__func__);
  return YES;
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    NSLog(@"曾經取得焦點:%s",__func__);
}

- (void)applicationWillResignActive:(UIApplication *)application {
    NSLog(@"將要釋放焦點:%s",__func__);
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"曾經進入後台:%s",__func__);
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    NSLog(@"將要進入前台:%s",__func__);
}

- (void)applicationWillTerminate:(UIApplication *)application {
    NSLog(@"順序將要加入:%s",__func__);
}

情形一 順序啟動

順序被加載到內存,完成啟動,application對象會自動調用delegate的上面這個辦法,證明順序曾經啟動完成。所以這個辦法也是首先會被application回調的辦法,且這個辦法在整個順序的生命周期中只會被調用一次。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

順序啟動時,回調完下面的辦法,會持續回調delegate的曾經取得了焦點的辦法,證明順序曾經取得了焦點。

- (void)applicationDidBecomeActive:(UIApplication *)application;

結論:使用啟動進程中,會順次調用delegate曾經啟動完成和曾經取得焦點的辦法,不會調用曾經進入前台的辦法。

情形二 順序從前台加入到後台

當順序處於前台時,單擊home鍵,順序會自動加入到後台。在這個進程中,順序會先回調delegate的將要得到焦點的辦法,證明順序將要得到焦點。

- (void)applicationWillResignActive:(UIApplication *)application;

調用完下面的辦法後,順序緊接著會調用delegate曾經進入後台的辦法,證明順序曾經進入後台。

- (void)applicationDidEnterBackground:(UIApplication *)application;

結論:單擊home鍵進入後台會順次調用delegate的將要得到焦點的辦法和曾經進入後台的辦法。

情形三 順序從後台進入到前台

(4)從後台進入前台(無論是雙擊home鍵進入或許點擊使用圖標進入),會回調delegate的將要進入前台辦法,證明順序將要進入前台。

- (void)applicationWillEnterForeground:(UIApplication *)application;

回調完下面的辦法,緊接著會持續回調delegate的曾經取得焦點的辦法,證明順序曾經取得了焦點。

- (void)applicationDidBecomeActive:(UIApplication *)application;

結論:從後台進入前台,會順次調用delegate的將要進入前台和曾經取得焦點的辦法。

情形四 雙擊home鍵切換順序

在前台,雙擊home鍵,只會調用delegate的將要得到焦點的辦法,證明順序將要得到焦點。

- (void)applicationWillResignActive:(UIApplication *)application;

當用戶真正切換使用時分,才會持續調用delegate的曾經進入後台的辦法,證明順序曾經進入後台。

- (void)applicationDidEnterBackground:(UIApplication *)application;

結論:雙擊home鍵切換使用。會辨別調用順序將要得到焦點的辦法和順序曾經進入後台的辦法。 且這兩個辦法是分開調用的。即,雙擊home鍵時調用將要得到焦點的辦法,選擇其他使用時調用曾經進入後台的辦法。

情形五 在前台雙擊home鍵殺死順序

雙擊home鍵時,只會調用delegate的將要得到焦點的辦法(下面曾經說過),證明順序將要得到焦點。

- (void)applicationWillResignActive:(UIApplication *)application;

然先手指上滑殺死順序,會直接調用delegate的曾經進入後台的辦法,證明順序曾經進入後台。

- (void)applicationDidEnterBackground:(UIApplication *)application;

然後緊接著調用delegate的順序將要加入的辦法,證明順序將要被殺死。

- (void)applicationWillTerminate:(UIApplication *)application;

結論:雙擊home鍵然後殺死順序,會依照如下順序調用delegate的辦法:

- (void)applicationWillResignActive:(UIApplication *)application;(雙擊home鍵調用)

- (void)applicationDidEnterBackground:(UIApplication *)application;
- (void)applicationWillTerminate:(UIApplication *)application;(殺死順序時調用以上這兩個辦法)

情形六 從其他順序前台雙擊home鍵殺死後台順序

假如從其他順序的前台,雙擊home鍵殺死後台順序,被殺死順序只會回調delegate行將加入的辦法。

- (void)applicationWillTerminate:(UIApplication *)application;

為什麼呢?

由於我們是從一個前台順序殺死一個後台順序,這個後台順序現在進入後台時分曾經調用了將要釋放焦點和曾經進入後台的辦法,所以殺死時分只會回調delegate行將終結的辦法。

結論:從一個前台順序殺死一個後台順序。後台順序只會回調delegate的順序行將加入的辦法。

情形七 下拉告訴欄

下拉告訴欄,只會回調delegate的順序將要釋放焦點的辦法。順序並沒有進入後台,所以不會調用進入後台的辦法

- (void)applicationWillResignActive:(UIApplication *)application;

結論:下拉形態欄只會讓順序得到焦點,並不會讓順序進入後台。

由於下拉告訴欄只調用了將要釋放焦點的辦法,沒有調用進入後台辦法,所以收起告訴欄時,只會調用曾經取得焦點的辦法,不會調用進入前台的辦法。

- (void)applicationDidBecomeActive:(UIApplication *)application;

異樣,從屏幕下方向上滑動屏幕,喚收工具欄時分,也只會調用delegate的將要釋放焦點的辦法。收起工具欄時,只會調用delegate的曾經取得焦點的辦法。

結論:下拉告訴欄或許上拉工具欄,都只是回調delegate的行將釋放焦點的辦法,順序不會進入後台。

為什麼

現在學習IOS時分,對這個中央不是很清楚,總是搞不懂為什麼順序的delegate有一個將要進入前台的辦法applicationWillEnterForeground:,卻沒有相似於applicationDidEnterForeground:的曾經進入前台的辦法(純屬捏造)?為什麼順序的delegate有一個曾經進入後台的辦法applicationDidEnterBackground:卻沒有一個相似於applicationWillEnterBackground:的將要進入後台的辦法?為什麼進入前台時,辦法的調用順序是applicationWillEnterForeground:和applicationDidBecomeActive:而不是相反?這些問題不斷困擾著我。

將要進入前台、曾經取得焦點、將要得到焦點、曾經進入後台這幾個辦法是比擬容易混雜的,且調用順序常常被搞混。但是假如了解了蘋果為什麼這麼設計,這些困惑都將迎刃而解。重點來了:假如一個使用順序得到焦點那麼意味著用戶以後無法停止交互操作,正因如此,順序從前台加入到後台時分,普通會先得到焦點再進入後台防止進入後台進程中用戶還可以和順序停止交互。同理,一個使用順序從後台進入前台也是相似的,會先進入前台再取得焦點,這樣進入前台進程中未完全預備好的狀況下用戶無法操作,保證了順序的平安性。

至於為什麼蘋果沒有提供相似於applicationDidEnterForeground:的曾經進入前台的辦法,那是由於順序進入前台後肯定會回調delegate的曾經取得焦點的辦法,所以applicationDidBecomeActive:辦法從實質上就相當於我們想象中的applicationDidEnterForeground:,假如我們想要在順序進入前台後做什麼操作,完全可以把這些操作寫到applicationDidBecomeActive:裡。同理,applicationWillResignActive:就相當於我們想象中的applicationWillEnterForeground:。

另外普通假如使用順序要保管用戶數據會在順序將要得到焦點的辦法中停止 (而不是在曾經進入後台的辦法中執行),由於假如用戶雙擊Home不會進入後台只會登記激活。同理,假如用戶恢復使用形態普通在曾經獲的焦點的辦法中執行(而不是在將要進入前台的辦法中執行)。

【淺析 UIApplication 生命周期的一些 delegate 辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved