1. applicationWillEnterForeground:.
2. applicationDidBecomeActive:.
Наряду с этими сообщениями мы будем получать разнообразные уведомления от iOS, когда приложение будет переходить в фоновый режим или возвращаться в приоритетный.
Чтобы можно было сохранять и вновь загружать состояние наших приложений, нужно тщательно взвешивать, выполнение каких задач следует приостановить, переходя в фоновый режим, а возобновить — лишь когда программа вернется в приоритетный режим. Рассмотрим пример. Сама система может с легкостью восстанавливать сетевые соединения. Поэтому мы можем ничего специально не предпринимать, если качаем файл из Сети. Но когда мы, например, пишем игру, лучше слушать те уведомления, которые iOS направляет нашей программе, работающей в фоновом режиме, и адекватно на них реагировать. В таком случае можно просто «поставить на паузу» игровой движок. Это же при необходимости можно проделать и со звуковым движком.
После того как приложение отправлено в фоновый режим, у него есть около 10 секунд, чтобы сохранить все несохраненные данные и приготовиться к тому, чтобы вернуться в приоритетный режим в любой момент, когда этого потребует пользователь. При необходимости можно также запросить у операционной системы дополнительное время на исполнение этих функций (подробнее об этом рассказано в разделе 14.2).
Рассмотрим сохранение состояния на примере. Предположим, мы пишем игру для iOS. Когда игра отправляется в фоновый режим, нам нужно сделать следующее.
1. Приостановить игровой движок.
2. Сохранить на диск очки, заработанные пользователем.
3. Сохранить на диск информацию об уровне, на котором остановилась игра. В частности, будем сохранять точку, которой пользователь достиг на этом уровне, физические аспекты уровня, положение камеры и т. д.
Когда пользователь снова откроет игру, переводя приложение в приоритетный режим, нам нужно выполнить следующее.
1. Загрузить с диска заработанные пользователем очки.
2. Загрузить с диска тот уровень, на котором пользователь прервал игру.
3. Возобновить работу игрового движка.
А теперь предположим, что делегат нашего приложения — это игровой движок. Определим в заголовочном файле делегата приложения несколько методов:
#import
@interface AppDelegate: UIResponder
@property (nonatomic, strong) UIWindow *window;
/* Сохраняем состояние нашего приложения. */
— (void) saveUserScore;
— (void) saveLevelToDisk;
— (void) pauseGameEngine;
/* Загружаем состояние нашего приложения. */
— (void) loadUserScore;
— (void) loadLevelFromDisk;
— (void) resumeGameEngine;
@end
Переходим к работе с заглушками методов, уже присутствующими в файле реализации делегата приложения:
#import «AppDelegate.h»
@implementation AppDelegate
— (void) saveUserScore{
/* Здесь сохраняем очки, заработанные пользователем. */
}
— (void) saveLevelToDisk{
/* Сохраняем на диске текущий уровень и положение игрока
на карте этого уровня. */
}
— (void) pauseGameEngine{
/* Здесь приостанавливаем работу игрового движка. */
}
— (void) loadUserScore{
/* Загружаем обратно в память местонахождение игрока. */
}
— (void) loadLevelFromDisk{
/* Загружаем последнее местонахождение игрока на карте. */
}
— (void) resumeGameEngine{
/* Здесь возобновляем работу игрового движка. */
}
Теперь нужно удостовериться, что наше приложение способно обрабатывать прерывания, в частности входящие звонки, поступающие на iPhone. В таких случаях приложение не будет переходить в фоновый режим, но тем не менее станет неактивным. Если, например, пользователь закончит телефонный разговор, то iOS вернет наше приложение в активное состояние. Итак, когда приложение становится неактивным, нужно убедиться, что приостановлена работа игрового движка. Когда приложение снова активизируется, работу игрового движка можно возобновить. На самом деле, когда приложение становится неактивным, перед нами не стоит необходимость сохранять все на диске (как минимум в этом примере), так как iOS вернет приложение в предыдущее состояние лишь после того, как приложение вновь станет активным:
— (void)applicationWillResignActive:(UIApplication *)application{
[self pauseGameEngine];
}
— (void)applicationDidBecomeActive:(UIApplication *)application{
[self resumeGameEngine];
}
Теперь все просто. Как только наше приложение уйдет в фоновый режим, мы сохраним состояние этой программы, а когда она вернется в приоритетный режим — вновь загрузим это состояние:
Читать дальше
Конец ознакомительного отрывка
Купить книгу