Главная » iPhone » Сервисы приложения iPhone

0

Состояние приложения имеет большее значение для iPhone, нежели для настольного компьютера. Это связано с тем, что многие события на iPhone могут приводить к зависанию приложения, фоновой работе приложения или аварийному его завершению. Эти различные состояния возникают, когда пользователь нажимает домашнюю кнопку (home button), блокирует экран или получает входящий звонок. Приложению важно знать об изменении своего состояния, чтобы сохранить все настройки, остановить потоки или выполнить другие действия.

Базовый класс uiApplication состоит из многих функций для изменения состояний приложения, которые могут быть подменены приложением. Пока имеется не особо много действий, которые приложение может выполнить в связи с изменением своего состояния, но оно может, по крайней мере, предпринять какие-либо шаги для подготовки к этому.

Приостановка

При нажатии домашней кнопки (home button) по умолчанию приложение приостанавливает свою работу. То же самое происходит во время телефонного разговора или блокировки экрана. При этом вызываются методы приостановки.

В зависимости от природы события может вызываться один из трех методов приостановки.

?         applicationWillSuspendUnderLock— экран iPhone блокируется либо путем нажатия кнопки выключения, либо во время ожидания блокировки экрана;

?         applicationWillSuspendForEventsOnly— к вызову ЭТОГО метода приводят события, которые переводят приложения в фоновый режим, например, получение входящего звонка. Также этот метод вызывается в случаях, когда экран заблокирован, но метод applicationWillSuspendUnderLock не подменен;

?         applicationSuspend— этот метод вызывается, когда пользователь нажимает домашнюю кнопку (home button). Для приложения это последний шанс произвести все необходимые действия. Если ни один из двух других методов не подменен, то вызывается данный метод для приостановки всех событий.

Поскольку один метод закрывает недостатки других, то большинство приложений может обрабатывать все приостановленные события, просто подменив

applicationSuspend:

- (void)applicationSuspend:(struct _GSEvent *)event { /* Мы собиаремся приостановить работу, поэтому сделайте здесь что-нибудь. */

1оскольку объем памяти и время жизни батареи весьма ограничены, то во- :х)с ресурсов на iPhone стоит очень остро. Если приложению не нужно вы- п лняться в фоновом режиме, и нет причины удерживать состояние прило- чения, то имеет смысл просто прекратить работу вместо приостановки. Phone достаточно умен, чтобы перезапускать последнее использованное приложение, поэтому пользователь может даже не почувствовать разницы: void)applicationSuspend:(struct _GSEvent *)event { self terminate ];

жно прекращать или приостанавливать работу приложения в зависимого от его состояния. Например, если приложение является клиентом отправки мгновенных сообщений, то приостанавливать его работу имеет смысл только, если он имеет действующее подключение к серверу, так что оно будет продолжать свою работу в фоновом режиме и поддерживать подключение. Если пользователь выходит из программы, то нет никакой причины оставлять ее работать, поэтому более оправданным является прекращение ее работы:

- (void)applicationSuspend:(struct GSEvent *)event { if (connected == NO) {

[ self terminate J; }else {

/* Фоновый режим IM Client */

}

)

Когда приложение приостановлено, то оно просто перемещается в фон и может продолжать свое выполнение. Если выполняется отдельный поток для новых событий, например, новых мгновенных сообщений, то оно все еще способно коммуницировать с процессом и даже отправлять звуковые эффекты для предупреждения пользователя о каких-либо событиях (см. главу 6).

Возобновление

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

Аналогично трем методам, использованным ранее для обработки различных типов приостановок, имеются три метода для возобновления:

?         applicationDidResumeFromUnderLock— приложение, возобновляемое на iPhone, экран которого был заблокирован и выключен:

?         applicationDidResumeForEventsOnly— возобновление приложения ПО окончании телефонного разговора или другого события, приведшего к фоновой работе приложения;

?         applicationDidResume— перехватчик всех остальных событий возобновления.

Методы возобновления подменяются так же, как и их собраться приостановки:

-   (void)applicationDidResume {

/* Мы возобновляемся. Сделайте что-нибудь. */

}

Прекращение работы программы

Если только приложение само не прекратило свою работу, то, как правило, оно не прекращает свою работу, пока не будет завершена работа самого iPhone. Поскольку большинство хороших приложений сами прекращают свою работу (вместо приостановки), то разумно подменить методы прекращения до прекращения работы приложения.

Метод applicationWillTerminate вызывается всякий раз, когда приложение собирается аккуратно завершить свою работу. Он не вызывается, если приложение убивается путем удерживания домашней кнопки. Этот метод должен осуществить все оставшееся освобождение ресурсов, убедиться в том, что все подключения корректно закрыты, и выполнить все остальные задачи, необходимые для выхода из программы:

-   (void)applicationWillTerminate {

/* Мы собираемся выйти, поэтому сделайте что-нибудь. */

}

Для дальнейшего изучения

Вот некоторые приемы, которые можно использовать для экспериментов с сервисами приложения.

?         Используйте pthread или NSThread для создания фонового потока, поддерживающего активное подключение к серверу. Что произойдет с подключением, если приложение приостановит свою работу?

?         Проверьте наличие прототипов UIApplication.h в каталоге вашего пакета инструментов. Вы найдете их в папке /toolchain/sys/usr/include/UIKit/. В главе 7 мы опишем больше методов UIApplication.

Источник: Здзиарски Дж. iPhone. Разработка приложений с открытым кодом: Пер„с англ. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2009. — 368 е.: ил.

По теме:

  • Комментарии