Какой метод вызывается после 'applicationDidBecomeActive'? - PullRequest
3 голосов
/ 05 декабря 2011

это мой первый вопрос, так как у меня возникла проблема при разработке моего первого приложения для iOS. Это одно из тысяч приложений для фонариков, однако я стараюсь использовать в нем как можно больше возможностей. Одним из них является сохранение состояния приложения, когда оно переходит в фоновый режим или завершает работу. После перехода на передний план (iOS 4 или выше) или перезапуска я загружаю настройки из файла и повторно их применяю. Одна из настроек, очевидно, AVCaptureDevice.torchMode. Однако с этим я сталкиваюсь. Я повторно применяю эти настройки в методе applicationDidBecomeActive. Кажется, все работает, но когда я очень быстро нажимаю кнопку «Домой», а затем перезапускаю приложение, приложение делает следующее (я отложил метод applicationDidBecomeActive, чтобы это увидеть):

1. показывает черный экран (загрузка)
2. выполняет applicationDidBecomeActive и включает светодиод (здесь я выставил задержку)
3. показывает мой текущий UIViewController и в тот же момент выключает светодиод

Это происходит только после вызова приложения из фона сразу после его отправки туда. Я знаю, что это не реалистичный сценарий использования, но мне нравится думать, что ошибки часто "складываются", и из-за этого (возможно) плохого дизайна я могу столкнуться с другими проблемами в будущем. Я абсолютно уверен, что это не мой код выключения светодиода, поскольку я NSLog всякий раз, когда мой код изменяет свойство AVCaptureDevice.torchMode. Итак, если быть точным, мой вопрос:
Какой метод вызывается после applicationDidBecomeActive, возможно, связанного с UIViewController, который может выключить мой факел? И есть ли какое-нибудь возможное решение или обходной путь?

Ответы [ 2 ]

5 голосов
/ 05 декабря 2011

Согласно руководству по программированию приложения для iOS :

Возврат на передний план - это шанс вашего приложения перезапустить задачи что он остановился, когда перешел на задний план. Шаги, которые происходят при перемещении на передний план показаны на рисунке 3-6. applicationWillEnterForeground: метод должен отменить все, что было сделано в вашем applicationDidEnterBackground: метод, и applicationDidBecomeActive: метод должен продолжать выполнять то же самое задачи активации, которые были бы во время запуска .

Вы пытались повторно применить свои настройки в методе applicationDidBecomeActive: вместо applicationWillEnterForeground:?

Еще одна вещь, которую следует учитывать, это работа с уведомлениями:

В методах applicationDidBecomeActive: или applicationDidBecomeActive: AppDelegate вы можете указать своему делегату приложения отправлять уведомления контроллерам:

- (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.
     */

    // Dispatch notification to controllers
    [[NSNotificationCenter defaultCenter] postNotificationName: @"didBecomeActive" 
                                                        object: nil 
                                                      userInfo: nil];
}

Как только вы это сделаете, контроллер представления может зарегистрироваться для этих уведомлений (например, в их методе init) следующим образом:

[[NSNotificationCenter defaultCenter] addObserver: self 
                                                 selector: @selector(loadSettings) 
                                                     name: @"didBecomeActive" 
                                                   object: nil];

Таким образом, ваш контроллер знает, что приложение только что стало активным, и может выполнить любой метод, который вы хотите.

В этом примере вы говорите своему контроллеру представления выполнить метод loadSettings, когда он получает уведомление didBecomeActive (которое было отправлено делегатом приложения).

3 голосов
/ 06 декабря 2011

У меня есть только ответ, почему быстрый запуск приложения отображает черный экран, я не имею в виду только личный опыт и наблюдения.

Когда приложение отправляется в фоновый режим ОСпытается сделать снимок экрана вместо Default.png.Если вы запустите приложение до того, как будет сделан снимок экрана, и у вас нет Default.png в вашем проекте, вы получите это.

Все еще размышляете над вопросом.

...