Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 468 / 15 | Длительность: 18:38:00
Специальности: Программист
Лекция 8:

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

События жизненного цикла приложения для Windows Phone

В ходе взаимодействия приложений для Windows Phone с пользователем и системой оно проходит через различные состояния, имея возможность реагировать на их смену, обрабатывая соответствующие события. В файле App.xaml, который входит в стандартный проект приложения для Windows Phone, по умолчанию, оформлена подписка на четыре события жизненного цикла приложения. Это – события Launching, Closing, Activated, Decativated (Листинг 9.1). Пустые обработчики событий расположены в файле кода App.xaml.cs.

<Application.ApplicationLifetimeObjects>
    <!--Обязательный объект, обрабатывающий события времени жизни приложения-->
    <shell:PhoneApplicationService
        Launching="Application_Launching" Closing="Application_Closing"
        Activated="Application_Activated" Deactivated="Application_Deactivated"/>
</Application.ApplicationLifetimeObjects>
Листинг 9.1. Подписка на события в App.xaml
// Код для выполнения при запуске приложения (например, из меню "Пуск")
// Этот код не будет выполняться при повторной активации приложения
private void Application_Launching(object sender, LaunchingEventArgs e)
{
}

// Код для выполнения при активации приложения (переводится в основной режим)
// Этот код не будет выполняться при первом запуске приложения
private void Application_Activated(object sender, ActivatedEventArgs e)
{
}

// Код для выполнения при деактивации приложения (отправляется в фоновый режим)
// Этот код не будет выполняться при закрытии приложения
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
}

// Код для выполнения при закрытии приложения 
// (например, при нажатии пользователем кнопки "Назад")
// Этот код не будет выполняться при деактивации приложения
private void Application_Closing(object sender, ClosingEventArgs e)
{
}
Листинг 9.2. Пустые обработчики событий в App.xaml.cs

Рассмотрим особенности обработки этих событий.

Launching. Когда пользователь запускает приложение, например с начального экрана телефона, выполняется данное событие. Не каждый запуск приложения приводит к его выполнению, так как если приложение было некоторое время назад запущено и пребывает в фоновом режиме и пользователь попытается вернуться к нему, это событие выполнено не будет. При обработке этого события можно произвести начальную инициализацию свойств приложения, например, загрузив настройки, сохранённые ранее в хранилище данных приложения, произвести попытку подключения к веб-службе, выполнить другие подготовительные действия. Однако, хотя обработчик данного события и является наиболее очевидным местом для выполнения подобных задач, следует максимально сократить нагрузку, которая на него возлагается. Здесь следует выполнять лишь те задачи, без которых приложение попросту неработоспособно, то есть – не может корректно отобразить первую страницу. Кроме того, если запуск приложения окажется слишком длительным, оно не пройдёт сертификацию в Магазине. Поэтому задачи, которые могут занимать довольно много времени (например – вышеупомянутое подключение к сетевым службам) лучше выполнять сразу же после запуска приложения, предоставив пользователю некоторый функционал. Эти задачи можно выполнять в фоновых процессах, что позволит сохранить высокую скорость отклика интерфейса приложения.

После того, как приложение запущено, оно переходит в состояние исполнения (Running), то есть – выполнения своих основных задач. Обратите внимание на то, что активное приложение может оказаться в ситуации простоя (idle), когда, например, пользователь заблокирует экран устройства, или интерфейс приложения будет перекрыт другими элементами. Из соображений экономии заряда батарей телефона подобную ситуацию следует корректно обрабатывать (здесь можно найти подробности об этом: http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff941090%28v=vs.105%29.aspx). Например, в режиме простоя приложение может прекратить использование энергоёмких функций, отключить анимацию. Когда обнаружено, что пользователь снова готов работать с приложением (например, когда разблокирован экран устройства, при условии, что в приложении отключено обнаружение простоя приложения, так как если данная функция включена, приложение деактивируется при блокировке устройства), приостановленные функции можно вновь активировать.

Deactivated. Деактивация приложения происходит при различных обстоятельствах. Например, при блокировке устройства (при условии, что включено обнаружение простоя приложения), при запуске приложением другого приложения (например, веб-браузера для открытия гиперссылки на веб-ресурс). После деактивации пользователь может вернуться в приложение, тогда будет выполнено событие Activated, а может и не вернуться – поэтому при деактивации следует выполнить действия по сохранению данных приложения. При этом при обработке данного события желательно так же не перегружать его, его следует обработать как можно быстрее. Поэтому, если окажется, что в приложении при деактивации нужно выполнять какие-либо ресурсоёмкие операции, имеет смысл рассмотреть вариант выполнения этих операций в процессе работы приложения. Например, периодически выполняя сохранение каких-либо данных, чтобы при деактивации не пришлось выполнять слишком большого объема работ.

Activated. Если приложение было деактивировано и пользователь снова возвращается к нему, вызывается это событие. При этом, хотя внешне это может выглядеть как повторный запуск приложения, событие Launching не вызывается. Здесь можно проверить состояние приложения, при необходимости загрузить сохранённые ранее данные.

Closing. Событие закрытия приложения. Вызывается, например, когда пользователь закрывает приложение, нажимая кнопку Назад, находясь на его начальной странице. Здесь следует сохранить состояние приложения, руководствуясь теми же соображениями, что и при обработке события Deactivated.

Вышеописанные события относятся к приложению в целом. Для того, чтобы реагировать на перемещения пользователя по страницам приложения, можно воспользоваться методами страниц приложения OnNavigatedTo (переход на страницу) и OnNavigatedFrom (переход со страницы). Эти виртуальные методы можно переопределить в программных файлах кода, имеющихся на странице и пользоваться ими, например, для сохранения каких-либо данных страниц, которые должны быть доступны другим страницам, для проверки данных, которые пользователь ввёл на странице и т.д.

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

В приложении есть две страницы, одна из которых – MainPage – является начальной страницей, загружаемой после запуска приложения. На странице MainPage есть ссылка для перехода на страницу Page1, которая не содержит дополнительных элементов управления. На рис. 9.1. приведено окно Visual Studio в виде, который оно имеет после успешных испытаний приложения. В частности, обратите внимание на окно Вывод (его можно открыть командой Просмотреть > Вывод) – именно в него и выводятся отладочные сообщения.

Приложение для исследования событий жизненного цикла приложения

увеличить изображение
Рис. 9.1. Приложение для исследования событий жизненного цикла приложения