Жизненный цикл приложения в Windows Phone Mango
Статья устарела
Данная статья была написана в начале 2012 г., в эпоху Windows Phone 7.
Примечание. Данная статья является переводом статьи Execution Model Overview for Windows Phone. Если вы обнаружите неточности перевода - сообщите, пожалуйста, в комментариях к этой статье внизу страницы.
Модель выполнения для телефона Windows Phone определяет жизненный цикл приложений, работающих на данном телефоне, с момента их запуска до завершения. Эта модель разработана для того, чтобы на всех этапах обеспечить быстрое и легкое взаимодействие с пользователем. Для достижения этого в один момент времени Windows Phone позволяет быть активным только одному приложению. Если пользователь переключается с приложения, операционная система переводит его в неактивное состояние. В случае, если доступной памяти устройства окажется недостаточно для активного приложения, операционная система начнет завершать неактивные приложения с учетом давности их использования. Стандартная архитектура приложения дает ему возможность управления собственным состоянием во время приостановки и возобновления этого приложения. Благодаря этому создается такое взаимодействие с пользователем, при котором для него поддерживается видимость только одного постоянно запущенного экземпляра приложения, даже если оно было завершено и возобновлено.
Модель выполнения также предлагает пользователям единообразную по виду интерфейса систему навигации между приложениями. В Windows Phone пользователи могут перемещаться вперед, запуская приложения из списка установленных приложений или из тайлов в стартовом меню. Есть и дополнительные способы, такие как нажатие на всплывающее уведомление, связанное с приложением. Пользователи могут также перемещаться обратно по страницам запущенного приложения или по стеку ранее запущенных приложений с помощью кнопки «назад» на аппарате. В Windows Phone 7.5 Mango добавлена возможность выбора одного из ранее запущенных приложений путем нажатия и удерживания на аппарате кнопки «назад».
Данная статья содержит подробные пояснения, касающиеся жизненного цикла приложений Windows Phone, и краткий обзор действий, необходимых для разработки быстрых приложений, которые обеспечат единообразную систему навигации.
Несмотря на то, что операционная система управляет выполнением всех приложений одинаково, обработка прерываний приложения XNA-игр требует особого внимания. Если вы создаете XNA- приложение, прочтите этот раздел, а затем ознакомьтесь с документом Захоронение для игр на Windows Phone 7.
Терминология
Для начала вам следует ознакомиться со следующими терминами и понятиями.
Состояние приложения | Данные, которые используются несколькими страницами в приложении. Например - данные, полученные с веб-сервиса. Вы можете по-разному использовать эти данные на разных страницах, но их можно рассматривать как принадлежащие к приложению в целом. Распространено заблуждение, что все данные о состоянии приложения должны сохраняться, только когда приложение завершает работу, но зачастую лучше сохранять эти данные, когда пользователь переходит на другую страницу. Это помогает уменьшить количество кода для управления состоянием, который должен быть выполнен, пока приложение завершает работу. |
Состояние страницы | Текущее визуальное состояние одной страницы приложения. Если у вас есть страница, содержащая элементы управления, и пользователь переходит с вашего приложения, а потом возвращается на него, он ожидает, что все элементы управления на странице будут иметь те же самые значения, что и в момент ухода. Когда страница загружена, приложение, управляющее ее состоянием, иногда так устанавливает значение элементов управления, что пользователь воспринимает приложение как сохраненное. Когда пользователь запускает новый экземпляр приложения, состояние интерфейса страницы пользователя должно отражать, что это новая копия, а не загружать состояние с предыдущего экземпляра приложения. Для управления состоянием приложения существует 4 основных события: Launching, Deactivated, Activated и Closing. Обработчики этих событий включены в объект Application, являющийся частью приложения Windows Phone. Код для управления состоянием приложения нужно писать в обработчиках этих событий. |
События приложения | Важное примечание: все события приложения имеют ограничение времени выполнения в 10 секунд. Если приложение превысит этот предел, оно сразу же будет завершено. Поэтому внутри обработчиков событий приложения следует избегать выполнения ресурсоемких задач, таких как чтение и запись в изолированное хранилище. По возможности эти задачи должны выполняться в фоновом потоке. Сохранение данных приложения по мере их изменения на протяжении всего жизненного цикла приложения уменьшает объем кода для управления состоянием, который необходимо выполнить в обработчиках событий. |
События страницы | Объект класса PhoneApplicationPage, от которого наследуются все страницы Windows Phone, имеет два метода: OnNavigatedTo и OnNavigatedFrom, которые нужно переопределять для управления состоянием страницы. |
Захоронение (Tombstoning) | Процесс, при котором приложение завершается, но сохраняются некоторые данные о состоянии приложения и отдельных страниц в нем. Сохраненные данные включают в себя текущую страницу приложения и стек переходов назад по ранее посещенным страницам в приложении. Если пользователь возвращается к захороненному приложению, оно воссоздается, и автоматически восстанавливаются текущая страница и история страниц. |
Словари состояния | Каждое приложение Windows Phone и каждая его страница содержат объект Dictionary, в котором вы можете хранить пары «ключ/значение». Эти словари сохраняются, когда приложение захороняется. Когда после захоронения приложение воссоздается, эти словари могут используются для восстановления состояния приложения. Обратите внимание, что все данные в этих словарях должны быть сериализуемыми. |
Жизненный цикл приложения Windows Phone
На следующем рисунке показан жизненный цикл приложения Windows Phone . На этой диаграмме кругами обозначены состояния приложения. Прямоугольники изображают либо события приложения, либо события на уровне страницы, при которых приложения должны управлять своим состоянием.
В следующем разделе рассматриваются все элементы жизненного цикла приложения для Windows Phone и действия, которые приложение должно выполнить на каждом этапе. Раздел содержит краткую информацию о том, что операционная система и пользователь делают для реализации изменений в состоянии приложения. Упрощенный перечень событий и действий, которые должно выполнить приложение, можно посмотреть в конце данной статьи.
Событие Launching
Событие Launching возникает при запуске пользователем нового экземпляра приложения из списка установленных приложений или из тайлов в стартовом меню. Кроме того, есть дополнительные способы запуска, такие как нажатие на всплывающее уведомление, связанное с приложением, или выбор приложения из меню Photos Extra. Запущенное таким образом приложение должно казаться пользователю новым экземпляром, а не продолжением предыдущего экземпляра. Для гарантии того, что ваше приложение загрузится быстро, в обработчике события должно выполняться как можно меньше кода. В частности, избегайте таких ресурсоемких задач, как сетевые операции и операции с файлами. Лучше выполнить эти задачи в фоновом потоке после того, как ваше приложение будет загружено.
Running
После запуска приложение выполняется и работает до тех пор, пока пользователь не переходит из приложения дальше или не перемещается обратно за первую страницу приложения. Приложения Windows Phone не должны предоставлять пользователю механизмы выхода или завершения. Приложение остается в состоянии Running, когда включается блокировка экрана телефона, кроме случая, когда отключено обнаружение простоя приложения . Дополнительную информацию можно посмотреть в статье Idle Detection for Windows Phone.
Метод OnNavigatedFrom
Метод OnNavigatedFrom вызывается всякий раз, когда пользователь уходит с текущей страницы приложения. Вызов этого метода может произойти в результате обычной навигации на страницам в пределах одного приложения. Он также вызывается, когда приложение приостановлено (см. следующий раздел). Всякий раз, когда вызывается этот метод, приложение должно сохранять состояние страницы таким образом, чтобы она могла быть восстановлена по возвращению на нее. Исключением является обратный переход. Свойство NavigationMode может использоваться для определения того, является ли перемещение обратным переходом, в случае которого нет никакой необходимости сохранять состояние, поскольку при следующем посещении страница будет воссоздана.
В некоторых случаях вам может понадобиться сохранять состояние в методе OnNavigatingFrom. В частности, так нужно сделать для сохранения состояния элемента управления MediaElement.
Событие Deactivated
Событие Deactivated возникает, когда пользователь переходит с вашего приложения дальше, нажав кнопку Start или запустив другое приложение. Событие Deactivated также возникает, если приложение запускает Chooser. Дополнительную информацию о Chooser можно прочесть в статье Launchers and Choosers Overview for Windows Phone. Это событие также возникает при включении блокировки экрана устройства кроме случая, когда отключено обнаружение простоя приложения. В обработчике для события Deactivated ваше приложение должно сохранять любое состояние приложения, чтобы позже оно могло быть восстановлено. Приложения Windows Phone имеют объект State, представляющий собой словарь, который можно использовать для хранения состояния приложения. Если приложение будет захоронено, а затем возобновлено, то этот словарь состояния заполнится данными, которые вы сохранили в Deactivated. Поскольку эти данные присутствуют в памяти, их можно использовать для восстановления состояния без ресурсоемких операций с файлами.
Приложение может быть полностью завершено после вызова Deactivated. Когда приложение завершается, его словарь состояния не сохраняется. По этой причине любые данные, которые должны быть сохранены для всех экземпляров приложения, нужно сохранять изолированном хранилище во время обработки события Deactivated.
Неактивное состояние (Dormant)
После возникновения события Deactivated, при переходе пользователя из приложения, операционная система пытается перевести данное приложение в неактивное состояние. В этом состоянии все потоки приложения останавливаются, ничего не обрабатывается, но приложение остается сохраненным в памяти. Если активировать приложение из этого состояния, ему не потребуется воссоздавать какое-либо состояние, так как оно уже было сохранено. Если после перевода приложения в неактивное состояние были запущены новые приложения, которые требуют больше памяти, чем есть в наличии для обеспечения эффективной работы, операционная система начнет процесс захоронения неактивных приложений для того, чтобы освободить память.
Захороненное состояние (Tombstoned)
Захороненное приложение завершено, но информация о состоянии процесса и словари состояния, заполненные приложением в течение события Deactivated, сохраняются. Одновременно ОС может содержать захороненную информацию для пяти приложений. Если приложение будет захоронено, и пользователь вернется в приложение, при возобновлении оно может использовать эти сохраненные данные. В противном случае, приложение просто завершится.
Событие Activated
Событие Activated вызывается, когда пользователь возвращается к неактивному или захороненному приложению. Приложения должны проверить свойство IsApplicationInstancePreserved базового класса Event args, чтобы определить, из какого состояния - неактивного или захороненного – выходит приложение. Если значение IsApplicationInstancePreserved равно true, то приложение было неактивно, и состояние было автоматически сохранено операционной системой. Если значение равно false, то приложение было захоронено и нужно использовать словарь состояния для восстановления состояния приложения. Во время обработки события Activated приложения не должны выполнять таких ресурсоемких задач, как загрузка из изолированного хранилища или сетевого ресурса, поскольку это приведет к увеличению количества времени, необходимого приложению для возобновления. Такие операции должны выполняться в фоновом потоке после загрузки приложения.
Метод OnNavigatedTo
Метод OnNavigatedTo вызывается, когда пользователь переходит на страницу. Вызов этого метода происходит при: первом запуске приложения, перемещении пользователя между страницами приложения и повторном запуске неактивного или захороненного приложения. В этом методе приложение должно проверить, является ли страница новым экземпляром. Если нет, то не нужно восстанавливать состояние. Если же страница - новый экземпляр, и в словаре состояния для страницы имеются данные, то эти данные должны быть использованы для восстановления состояния этой страницы.
Событие Closing
Событие Closing возникает, когда пользователь переходит обратно за первую страницу приложения. В этом случае приложение завершается без сохранения состояния. В обработчике события Closing ваше приложение может сохранить данные, которые должны сохраняться для всех экземпляров приложения. Для завершения обработки собтий приложений и событий навигации по страницам отводится 10 секунд. В случае превышения этого времени приложение завершается. Поэтому будет разумным сохранять постоянное состояние в течение всего жизненного цикла приложения и стараться не допускать в обработчике события Closing большого количества файлов ввода/вывода.
Данная таблица кратко описывает события, возникающие в течение жизненного цикла приложения, и действий, которые нужно выполнить при каждом событии.
Событие или метод | Действие приложения |
Событие Launching | Выполнять как можно меньше кода. Не совершать ресурсоемких операций, таких как подключение к изолированному хранилищу. |
Метод OnNavigatedFrom | Если это не обратный переход, сохранить состояние пользовательского интерфейса в словаре состояния. |
Событие Deactivated | Сохранить состояние приложения в State в случае его захоронения. Также сохранить постоянное состояние в изолированном хранилище в случае завершения приложения. Не стирать из памяти состояние приложения в случае, если приложение переводится в неактивное состояние. |
Событие Activated | Проверить IsApplicationInstancePreserved. Если значение равно true, ничего не предпринимать. Если значение равно false, использовать данные из State для восстановления состояния приложения. |
Метод OnNavigatedTo | Проверить, является ли страница новым экземпляром. Если нет, то состояние приложения восстановлено операционной системой автоматически. В противном случае, если есть данные в State, использовать их для восстановления пользовательского интерфейса. |
Событие Closing | Сохранить постоянные данные приложения в изолированном хранилище. |
Осторожно: Описанные в этом разделе события дают возможность сохранять и восстанавливать состояние в тот момент, когда пользователь активирует приложение или выходит из него. Тем не менее, рекомендуется сохранять данные о состоянии по мере их изменения. Например, результаты веб-запроса могут быть сохранены на диск или в словарь состояния приложения (или в оба места) в момент их получения из сети. Не нужно ждать, пока произойдет событие Deactivated для сохранения этих данных. Помните, что все события жизненного цикла приложения имеют ограничение в 10 секунд, чтобы приложение завершило любые задачи.