Главная » C#, Windows Runtime, XAML, Разработка для Windows 8 » Жизненный цикл приложения Windows Runtime

0

Научившись  сохранять  настройки   и   состояние  приложения   в   локальное хранилище,  попробуем  разобраться,  когда  необходимо  это  делать  и  каким жизненным циклом обладает приложение в Windows 8.

ПосколькувсеприложенияMetroориентируютпользователянаработусконтентом, то  нет  необходимости  держать  приложение  в  памяти,  когда  пользователь начал работу с другим приложением. С другой стороны, пользователь может в любой момент попытаться вернуться в приложение, поэтому производить его запуск с нуля тоже плохо. В связи c этим Windows 8 приостанавливает работу приложения всякий раз, когда пользователь переключается на какое-то другое занятие, и держит это приложение в памяти, пока есть возможность. Как только пользователь возвращается в приложение, Windows 8 может либо активировать существующий в памяти экземпляр, либо же, если приложение было удалено, вызвать его снова. Именно поэтому у разработчика возникает ряд задач.

·                   Как  только  приложение  переходит  в    состояние  ожидания,   данные,

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

·                   В  случае  возобновления  работы  приложения  из  памяти  необходимо определиться, нужно ли обновлять интерфейс  приложения (так как за время его «сна» многое могло  измениться) и восстанавливать сетевые подключения. Ведь если приложение оставалось в режиме сна слишком долго, проще обновить весь интерфейс с нуля.

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

Чтобы  реализовать все   вышеописанные механизмы,  в    классе   Application

представлено несколько полезных событий. Давайте их рассмотрим.

·                   Activated   —   событие   генерируется   в     случае   успешного   запуска приложения.   Теоретически,   именно   здесь   необходимо   определять, как  именно было запущенно  приложение, нужно ли  восстанавливать состояние и др. На  практике переопределить это событие нельзя, и тут существуют другие механизмы.

·                   Suspending  —  это  событие  позволяет сохранить  текущее  состояние приложения. На это у приложения есть 5 секунд, после чего работа будет завершена в любом случае. Ничего сложного в рассматриваемом событии нет,  достаточно   определить  обработчик  и  использовать локальное хранилище для сохранения данных.

·                   Resuming —  событие, которое дает шанс разработчику  восстановить внешние ресурсы в  случае, если приложение было запущено из памяти. Очевидно, что во  время «сна» приложения  сетевые соединения были разрушены,  да  и  контент  мог  измениться.  Тут  нужно  учитывать, что обработчик  этого   события  не  запускается  в    интерфейсном  потоке, следовательно, нужно использовать Dispatcher.

Вернемся к событию Activated. Дело в том, что приложение может быть запущено по многим причинам: для использования приложения как  источника поиска; в   результате передачи какого-то  файла данных;  вследствие  активации через FilePicker и др. Именно поэтому, чтобы  облегчить жизнь разработчику, класс Application предлагает несколько методов перегрузки. Примерами таких методов могут  служить  OnFileActivated,  OnSearchActivated,  OnShareTargetActivated и др.  Иными словами, если запуск Вашего приложения связан с  инициацией какого-то  контракта,  то  нужно  попробовать найти  метод,  соответствующий этому контракту. Если метод для контракта не найден, то можно воспользоваться методом OnActivated, который получает в качестве параметров тип контракта.

async protected override void OnActivated(IActivatedEventArgs args)

{

switch (args.Kind)

{

case ActivationKind.CameraSettings:

. . . .

break;

case ActivationKind.ContactPicker:

. . . .

break;

case ActivationKind.PrintTaskSettings:

. . . .

break;

. . . .

} base.OnActivated(args);

}

Если же Вас не интересуют контракты, то рекомендуется  перегружать метод OnLanched (он уже есть у Вас в коде) и именно тут делать проверки на состояние, из которого было запущено  приложение, а также принимать решения, какие данные нужно обновлять и какую страницу делать основной. Параметр метода OnLauched  содержит  одно  полезное  свойство —   PreviousExecutionState, которое позволяет определить, из какого состояния было запущено приложение. Возможны нижеприведенные значения перечислимого типа.

·                   ClosedByUser — приложение было закрыто пользователем. В этом случае все  хорошо  и  можно  попробовать вычитать  данные,  которые  были сохранены в обработчике события Suspending.

·                   NotRunning — приложение не работало, то есть можно  попробовать восстановить данные.

·                   Running — приложение было активно и работало. Видимо, система еще не успела отправить событие Suspending.

·                   Suspended — приложение было приостановлено и находилось в памяти.

·                   Terminated — работа приложения аварийно завершена, поэтому лучшее решение — запустить его заново.

Базируясь на этих значениях, разработчику предстоит сделать вывод, как вести приложение и нужно ли загружать какие-то данные.

Сергей Лутай, Сергей Байдачный, Windows 8 для C# разработчиков

По теме:

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