applicationWillEnterForeground vs. applicationDidBecomeActive, applicationWillResignActive vs. applicationDidEnterBackground


215

Який належний делегат, який потрібно реалізувати, коли програма прокидається з фонового режиму, і ви хочете, щоб вона підготувала його до активності?

applicationWillEnterForeground vs applicationDidBecomeActive - в чому різниця?

Якого правильного делегата потрібно реалізувати, коли програма перебуває у режимі сну, і ви хочете підготувати її до очищення та збереження даних?

applicationWillResignActive vs. applicationDidEnterBackground - в чому різниця?

Також я помітив, що applicationWillResignActive дзвонить, коли надходить вхідний SMS або дзвінок, але користувач вирішує натиснути «Ок» і продовжити. Я не хочу, щоб моя програма не вживала жодних дій у цих випадках. Я просто хочу, щоб він продовжував працювати без проміжного очищення, оскільки користувач не вийшов із програми. Отже, я думаю, що має сенс займатися очищенням просто в applicationDidEnterBackground.

Буду вдячний за ваш внесок у передовий досвід щодо вибору делегатів, які слід застосувати для пробудження та сну, а також розгляду подій, таких як переривання SMS / дзвінками.

Дякую

Відповіді:


449

При пробудженні, тобто повторному запуску програми (або через трамплін, перемикання програми або URL) applicationWillEnterForeground:, викликається. Він виконується лише один раз, коли додаток стане готовим до використання, після того, як він буде розміщений у фоновому режимі, при цьому його applicationDidBecomeActive:можна буде викликати кілька разів після запуску. Це applicationWillEnterForeground:ідеально підходить для налаштування, яке має відбутися лише один раз після повторного запуску.

applicationWillEnterForeground: це називається:

  • коли програма перезапущена
  • раніше applicationDidBecomeActive:

applicationDidBecomeActive: це називається:

  • коли програма вперше запускається після application:didFinishLaunchingWithOptions:
  • після, applicationWillEnterForeground:якщо немає URL-адреси для обробки.
  • після application:handleOpenURL:називається.
  • після, applicationWillResignActive:якщо користувач ігнорує перерву, наприклад телефонний дзвінок або SMS.

applicationWillResignActive: це називається:

  • коли відбувається перерва, як телефонний дзвінок.
    • якщо користувач приймає дзвінок applicationDidEnterBackground:, викликається.
    • якщо користувач ігнорує дзвінок applicationDidBecomeActive:, викликається.
  • при натисканні кнопки додому або користувач перемикає програми.
  • Документи кажуть, що слід
    • пауза поточних завдань
    • відключити таймери
    • призупинити гру
    • зменшити частоту кадрів OpenGL

applicationDidEnterBackground: це називається:

  • після applicationWillResignActive:
  • Документи кажуть, що слід:
    • випустити спільні ресурси
    • зберегти дані користувача
    • недійсні таймери
    • збережіть стан програми, щоб ви могли відновити його, якщо додаток припинено.
    • вимкнути оновлення інтерфейсу користувача
  • у вас є 5 секунд, щоб зробити те, що вам потрібно, і повернути метод
    • якщо ви не повернетесь протягом ~ 5 секунд, додаток буде припинено.
    • ви можете попросити більше часу beginBackgroundTaskWithExpirationHandler:

Офіційна документація.


10
Ще одне, що потрібно додати. Якщо ви відкриєте у своєму додатку список фонових додатків (двічі клацніть кнопку додому), а потім поверніться до нього (виберіть попередній перегляд свого додатка) - -applicationWillEnterForeground:не буде викликано лише -applicationDidEnterBackground:(припустимо, iOS не вважає, що це повторне запуску).
kpower

@kpower так, це просто зламало мені шию ... ніколи б не подумав, що willEnterForeground не буде називатися в такому випадку ...
TheEye

Хіба це applicationWillEnterForeground:не буде називатися кожен раз із фону на передній план ?! Я не можу знайти випадок, який після цього НЕ називається БЕЗ applicationDidBecomeActive.
Десмонд DAI

Це не точно. applicationWillResignActive можна викликати без applicationDidEnterBackground
MichaelGofron

27

Керування життєвим циклом програми корисно для ваших питань. Для швидкої концепції ви можете побачити Цифри в цьому документі. Ви також можете прочитати коментар з коду, згенерованого майстром XCode. Перелічено так:

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

- (void)applicationWillResignActive:(UIApplication *)application
{
    /*
     Sent when the application is about to move from active to inactive state. 
     This can occur for certain types of temporary interruptions (such as an 
     incoming phone call or SMS message) or when the user quits the application 
     and it begins the transition to the background state.
     Use this method to pause ongoing tasks, disable timers, and throttle down 
     OpenGL ES frame rates. Games should use this method to pause the game.
     */
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    /*
     Use this method to release shared resources, save user data, invalidate 
     timers, and store enough application state information to restore your 
     application to its current state in case it is terminated later. 
     If your application supports background execution, this method is called 
     instead of applicationWillTerminate: when the user quits.
     */
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    /*
     Called as part of the transition from the background to the active state; 
     here you can undo many of the changes made on entering the background.
     */
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    /*
     Restart any tasks that were paused (or not yet started) while the 
     application was inactive. If the application was previously in the 
     background, optionally refresh the user interface.
     */
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    /*
     Called when the application is about to terminate.
     Save data if appropriate.
     See also applicationDidEnterBackground:.
     */
}

Для отримання більш детальних пояснень зверніться до офіційного документа для UIApplicationDelegate


Посилання мертва.
Фліппі Босман

Перегляньте деякі описи та посилання на 2019 рік.
tomjpsun

13

Я ще трохи розгубився з відповіддю Дано, тому зробив невеликий тест, щоб отримати потік подій у певних сценаріях для моєї довідки, але це може бути корисним і для вас. Це для програм, які НЕ використовують UIApplicationExitsOnSuspendу своєму інформаційному списку. Це було проведено на симуляторі iOS 8 +, підтвердженому пристроєм iOS 7. Вибачте імена обробника подій Xamarin. Вони дуже схожі.

  • Початкові та всі наступні запуски з не працюючого стану:

ЗакінченоЗапуск

Увімкнено

  • Перерва (телефонний дзвінок, верхній розсув вниз, нижній розсув):
  • Кнопка "Домашня сторінка" двічі натискає список неактивних програм, а потім перебирає наш додаток:

OnResignActivation


Увімкнено

  • Кнопка "Домашня сторінка" двічі натискає список неактивних програм, вибираючи інший додаток, а потім знову запускаємо наш додаток:
  • Натисніть кнопку "Головна", потім перезапустіть:
  • Блокування (кнопка включення / вимкнення), а потім розблокування:

OnResignActivation

DidEnterBackground


WillEnterForeground

Увімкнено

  • Двічі натисніть кнопку "Домашня сторінка" та закрийте додаток: (наступний перезапуск - перший випадок)

OnResignActivation

DidEnterBackground

DidEnterBackground (лише для iOS 7?)

Так, DidEnterBackgroundвикликається двічі на пристрої iOS7. Обидва рази стан застосунку UIA є Фоном. Однак симулятор iOS 8 цього не робить. Для цього потрібне тестування на пристрої iOS 8. Я оновлю свою відповідь, коли отримаю руку, або хтось інший міг би підтвердити це.


9

applicationWillEnterForeground це називається:

коли програма перезапущена (переходить із фону на передній план) Цей метод не використовується, коли програма запущена вперше, тобто коли applicationDidFinishLaunchвикликається, але лише коли виходить з фону applicationDidBecomeActive

applicationDidBecomeActive це називається

коли додаток запускається перший раз після того, як didFinishLaunching після того, як applicationWillEnterForegroundякщо немає URL для обробки. після application:handleOpenURL:називається. після, applicationWillResignActiveякщо користувач ігнорує перерву, наприклад телефонний дзвінок або SMS. після зникнення alarView де-небудь з програми


Чи випадково ви знаєте, чи це було змінено на iOS 7? Я пам’ятаю (я можу помилитися) робив речі (iOS 5/6) у applicationWillEnterForeground і виконував цей запуск при першому запуску програми. Відтепер у 7.1 / 8 ви маєте рацію, що програмаWillEnterForeground не викликається при запуску.
Jinyoung Кім

7

applicationWillResignActive викликається, коли система запитує дозволи. (в iOS 10). На всякий випадок, коли хтось потрапить у ту саму неприємність, як я ...


будь-яка ідея, яким методом викликати після дозволу поп звільнення? У мене є цей випуск stackoverflow.com/questions/26059927 / ...
Суреш Durishetti

5

В iOS 8+ є тонка, але важлива різниця для здійснення телефонного дзвінка.

У iOS 7, якщо користувач здійснює телефонний дзвінок, викликаються і applicationWillResignActive: і applicationDidEnterBackground:. Але в iOS 8+ називається лише додатокWillResignActive:.


1

Для iOS 13+ будуть виконані наступні методи:

- (void)sceneWillEnterForeground:(UIScene *)scene
- (void)sceneDidBecomeActive:(UIScene *)scene
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.