Поделиться через


жизненный цикл приложений универсальная платформа Windows (UWP)

В этом разделе описывается жизненный цикл приложения универсальная платформа Windows (UWP) с момента его запуска до его закрытия.

Немного истории

До Windows 8 приложения имели простой жизненный цикл. Приложения Win32 и .NET выполняются или не выполняются. Когда пользователь сворачивать их или переключаться от них, они продолжают работать. Это было хорошо до тех пор, пока переносные устройства и управление питанием стали все более важными.

Windows 8 представила новую модель приложения с приложениями UWP. На высоком уровне добавлено новое приостановленное состояние. Приложение UWP приостановлено вскоре после того, как пользователь свернет его или переключится на другое приложение. Это означает, что потоки приложения остановлены, и приложение остается в памяти, если операционная система не должна восстановить ресурсы. Когда пользователь переключается обратно в приложение, его можно быстро восстановить в состоянии выполнения.

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

По умолчанию приложения, которые не находятся на переднем плане, приостановлены. Это приводит к экономии энергии и дополнительных ресурсов, доступных для приложения в настоящее время на переднем плане.

Приостановленное состояние добавляет новые требования для разработчика, так как операционная система может завершить приостановленное приложение, чтобы освободить ресурсы. Завершенное приложение по-прежнему появится на панели задач. Когда пользователь щелкает его, приложение должно восстановить состояние, в которое оно было завершено, так как пользователь не будет знать, что система закрыла приложение. Они будут думать, что он ждал в фоновом режиме, пока они делали другие вещи и будут ожидать, что он будет в том же состоянии, что он был в, когда они покинули его. В этом разделе мы рассмотрим, как это сделать.

Windows 10 версии 1607 появилась еще две состояния модели приложений: выполнение на переднем плане и запуск в фоновом режиме. Мы рассмотрим эти дополнительные состояния в следующих разделах.

Состояние выполнения приложения

На этом рисунке представлены возможные состояния модели приложений, начиная с Windows 10 версии 1607. Рассмотрим типичный жизненный цикл приложения UWP.

Схема состояния, показывающая переходы между состояниями выполнения приложения

Приложения вводят выполнение в фоновом состоянии при запуске или активации. Если приложению необходимо перейти на передний план из-за запуска переднего плана, приложение получает событие "Выходя на передний план".

Хотя "запущенные" и "активированные" могут показаться похожими терминами, они ссылаются на разные способы запуска приложения. Сначала рассмотрим запуск приложения.

Запуск приложения

Метод OnLaunched вызывается при запуске приложения. Он передает параметр LaunchActivatedEventArgs , который предоставляет, помимо прочего, аргументы, переданные приложению, идентификатор плитки, запускающей приложение, и предыдущее состояние, в котором находилось приложение.

Получите предыдущее состояние приложения из LaunchActivatedEventArgs.PreviousExecutionState , который возвращает ApplicationExecutionState. Его значения и соответствующее действие для выполнения из-за этого состояния приведены следующим образом:

ApplicationExecutionState Описание Предстоящее действие
NotRunning Приложение может находиться в этом состоянии, так как оно не было запущено с момента последнего перезагрузки или входа пользователя. Он также может находиться в этом состоянии, если он был запущен, но затем завершился сбоем или потому, что пользователь закрыл его ранее. Инициализировать приложение, как если бы оно выполнялось в первый раз в текущем сеансе пользователя.
Приостановлено Пользователь либо свернул или отключился от приложения и не вернулся к нему в течение нескольких секунд. Когда приложение было приостановлено, его состояние осталось в памяти. При приостановке приложения необходимо повторно присвоить все дескрипторы файлов или другие ресурсы, выпущенные вами.
Завершен Приложение было приостановлено ранее, но затем было завершено в какой-то момент, так как система необходима для освобождения памяти. Восстановите состояние, в которое приложение находилось, когда пользователь отключился от него.
ClosedByUser Пользователь закрыл приложение с помощью кнопки закрытия системы или alt+F4. Когда пользователь закрывает приложение, его сначала приостанавливают и завершают. Так как приложение по сути прошло те же действия, которые приводят к завершенному состоянию, обработайте это так же, как состояние "Завершено".
Выполнение Приложение уже было открыто, когда пользователь пытался снова запустить его. Ничего. Обратите внимание, что другой экземпляр приложения не запускается. Уже запущенный экземпляр просто активируется.

Примечание.

Текущий сеанс пользователя основан на входе в Систему Windows. Если текущий пользователь не выключил, выключил или перезапустил Windows, текущий сеанс пользователя сохраняется в таких событиях, как проверка подлинности экрана блокировки, переключение пользователя и т. д.

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

Из-за предварительного запуска метод OnLaunched() приложения может быть инициирован системой, а не пользователем. Так как приложение предварительно запущено в фоновом режиме, может потребоваться выполнить различные действия в OnLaunched(). Например, если приложение начинает воспроизводить музыку при запуске, они не будут знать, откуда оно происходит, так как приложение предварительно запущено в фоновом режиме. После предварительного запуска приложения в фоновом режиме за ним следует вызов Application.Suspending. Затем, когда пользователь запускает приложение, вызывается событие возобновления, а также метод OnLaunched(). Дополнительные сведения о том, как обрабатывать сценарий предварительного запуска, см. в разделе "Обработка предварительного запуска приложения ". Предварительно запущены только приложения, которые выбираются.

В Windows отображается экран-заставка для приложения при запуске. Сведения о настройке экрана-заставки см. в разделе "Добавление экрана-заставки".

Пока отображается экран-заставка, приложение должно зарегистрировать обработчики событий и настроить любой пользовательский интерфейс, необходимый для начальной страницы. Узнайте, что эти задачи выполняются в конструкторе приложения и OnLaunched() выполняются в течение нескольких секунд, или система может думать, что ваше приложение не отвечает и завершает его. Если приложению нужно запрашивать данные из сети или получать большие объемы данных с диска, эти действия должны выполняться вне запуска. Приложение может использовать собственный пользовательский интерфейс загрузки или расширенный экран-заставки, пока он ожидает завершения длительных операций. Дополнительные сведения см. в разделе "Отображение экрана-заставки" для получения дополнительных сведений.

После завершения запуска приложение вводит состояние "Выполнение ", а экран-заставка исчезает, а все ресурсы и объекты экрана-заставки очищаются.

Активация приложения

В отличие от запуска пользователя, приложение может быть активировано системой. Приложение может быть активировано контрактом, например контрактом общей папки. Или его можно активировать для обработки пользовательского протокола URI или файла с расширением, которое приложение зарегистрировано для обработки. Список способов активации приложения см. в разделе ActivationKind.

Класс Windows.UI.Xaml.Application определяет методы, которые можно переопределить для обработки различных способов активации приложения. OnActivated может обрабатывать все возможные типы активации. Однако чаще используются определенные методы для обработки наиболее распространенных типов активации и использования OnActivated в качестве резервного метода для менее распространенных типов активации. Это дополнительные методы для конкретных активаций:

OnCachedFileUpdaterActivated
OnFileActivated
OnFileOpenPickerActivated OnFileSavePickerActivated
OnSearchActivated
OnShareTargetActivated

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

Примечание. Если вы входите в систему с помощью учетной записи администратора компьютера, вы не можете активировать приложения UWP.

Выполнение в фоновом режиме

Начиная с Windows 10 версии 1607 приложения могут выполнять фоновые задачи в том же процессе, что и само приложение. Узнайте больше об этом в фоновом действии с помощью модели единого процесса. В этой статье мы не перейдем к фоновой обработке в процессе, но как это влияет на жизненный цикл приложения, заключается в том, что два новых события были добавлены, связанные с тем, когда ваше приложение находится в фоновом режиме. Они: Введеныbackground и ОставитьBackground.

Эти события также отражают, может ли пользователь видеть пользовательский интерфейс приложения.

Выполнение в фоновом режиме — это состояние по умолчанию, в которое запускается приложение, активируется или возобновляется. В этом состоянии пользовательский интерфейс приложения пока не отображается.

Выполнение на переднем плане

Выполнение на переднем плане означает, что пользовательский интерфейс вашего приложения отображается.

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

Ранее лучшее расположение для загрузки ресурсов пользовательского интерфейса было в обработчиках событий "Активировано " или "Возобновление ". Теперь ОставитьBackground лучше всего, чтобы убедиться, что пользовательский интерфейс готов.

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

Когда пользователь переключается с приложения, приложение повторно включает запущенное в фоновом состоянии.

Повторное получение фонового состояния

Событие EnteredBackground указывает, что приложение больше не отображается на переднем плане. На рабочем столе EnteredBackground возникает при сворачивании приложения; на телефоне при переключении на домашний экран или другое приложение.

Сокращение использования памяти приложения

Так как приложение больше не отображается пользователю, это лучшее место для остановки работы и анимации отрисовки пользовательского интерфейса. Чтобы начать эту работу снова, можно использовать ОставитьBackground .

Если вы собираетесь работать в фоновом режиме, это место для подготовки к нему. Рекомендуется проверить MemoryManager.AppMemoryUsageLevel , а при необходимости уменьшить объем памяти, используемой приложением при запуске в фоновом режиме, чтобы приложение не рискуло завершить работу системой, чтобы освободить ресурсы.

Дополнительные сведения см. в статье "Уменьшение использования памяти" при переходе приложения в фоновое состояние .

Сохранение состояния

Обработчик событий приостановки — это лучшее место для сохранения состояния приложения. Однако если вы выполняете работу в фоновом режиме (например, воспроизведение звука, использование расширенного сеанса выполнения или фоновой задачи в proc), рекомендуется сохранять данные асинхронно из обработчика событий EnteredBackground . Это связано с тем, что приложение может быть завершено, пока оно находится в более низком приоритете в фоновом режиме. И так как приложение не будет проходить через приостановленное состояние в этом случае, ваши данные будут потеряны.

Сохранение данных в обработчике событий EnteredBackground перед началом фонового действия гарантирует хорошее взаимодействие с пользователем при возврате приложения на передний план. Api данных приложения можно использовать для сохранения данных и параметров. Дополнительные сведения см. в разделе "Магазин" и получение параметров и других данных приложения.

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

Помните, что если в приложении есть фоновая активность, которую он может перейти от запущенного в фоновом состоянии к запуску в состоянии переднего плана, не достигая приостановленного состояния.

Примечание.

При закрытии приложения пользователем можно выполнить событие OnSuspending до события EnteredBackground . В некоторых случаях событие EnteredBackground может не быть запущено до завершения работы приложения. Важно сохранить данные в обработчике событий OnSuspending .

Асинхронная работа и отсрочка

При асинхронном вызове в обработчике элемент управления возвращается немедленно из этого асинхронного вызова. Это означает, что выполнение может затем вернуться из обработчика событий, и приложение перейдет в следующее состояние, даже если асинхронный вызов еще не завершен. Используйте метод GetDeferral в объекте EdBackgroundEventArgs, передаваемом обработчику событий, чтобы отложить приостановку до тех пор, пока не вызовете метод Complete в возвращенном объекте Windows.Foundation.Deferral.

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

Если вам потребуется больше времени для сохранения состояния, изучите способы сохранения состояния на этапах, прежде чем приложение войдет в фоновое состояние, чтобы сохранить в обработчике событий OnSuspending меньше. Кроме того, вы можете запросить extendedExecutionSession , чтобы получить больше времени. Однако нет никаких гарантий предоставления запроса, поэтому рекомендуется найти способы свести к минимуму время, необходимое для сохранения состояния.

Приостановка приложения

Когда пользователь свернет приложение Windows ожидает несколько секунд, чтобы узнать, будет ли пользователь вернуться к нему. Если они не переключаются в течение этого периода времени, а выполнение расширенной задачи, фоновая задача или спонсируемая деятельность активна, Windows приостанавливает приложение. Приложение также приостановлено, если экран блокировки отображается, пока в этом приложении нет расширенного сеанса выполнения и т. д.

При приостановке приложения вызывается событие Application.Suspending . Шаблоны проектов UWP Visual Studio предоставляют обработчик для этого события с именем OnSuspending в App.xaml.cs. Вы должны поместить код, чтобы сохранить состояние приложения здесь.

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

Помните о крайнем сроке

Чтобы обеспечить быстрое и гибкое устройство, в обработчике событий приостановки требуется ограничение на время выполнения кода. Он отличается для каждого устройства, и вы можете узнать, что он использует свойство объекта SuspendingOperation , называемого крайним сроком.

Как и в обработчике событий EnteredBackground , если вы выполняете асинхронный вызов от обработчика, элемент управления возвращается немедленно из этого асинхронного вызова. Это означает, что выполнение может затем вернуться из обработчика событий, и приложение перейдет в состояние приостановки, даже если асинхронный вызов еще не завершен. Используйте метод GetDeferral в объекте SuspendingOperation (доступно через args события), чтобы отложить ввод приостановленного состояния до тех пор, пока не вызовите метод Complete для возвращаемого объекта SuspendingDeferral.

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

Завершение работы приложения

Система пытается сохранить приложение и его данные в памяти во время приостановки. Однако если в системе нет ресурсов для хранения приложения в памяти, оно завершит работу приложения. Приложения не получают уведомления о том, что они завершаются, поэтому единственная возможность сохранить данные приложения в обработчике событий OnSuspending .

Когда приложение определяет, что оно было активировано после завершения, оно должно загрузить данные приложения, сохраненные таким образом, чтобы приложение находилось в том же состоянии, в которое оно находилось до его завершения. Когда пользователь переключается обратно на приостановленное приложение, которое было завершено, приложение должно восстановить данные приложения в своем методе OnLaunched. Система не уведомляет приложение о завершении работы, поэтому приложение должно сохранить свои данные приложения и освободить эксклюзивные ресурсы и дескриптор файлов перед приостановкой и восстановить их после активации приложения.

Примечание об отладке с помощью Visual Studio: Visual Studio запрещает Windows приостановить приложение, подключенное к отладчику. Это позволит пользователю просматривать пользовательский интерфейс отладки Visual Studio во время выполнения приложения. При отладке приложения его можно отправить событие приостановки с помощью Visual Studio. Убедитесь, что отображается панель инструментов "Расположение отладки", а затем щелкните значок приостановки .

Резюме приложения

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

Когда приложение возобновляется из приостановленного состояния, оно вводит состояние "Выполнение в фоновом режиме", а система восстанавливает приложение, в котором оно осталось, чтобы он отображался пользователю, как если бы он работал все вместе. Данные приложения, хранящиеся в памяти, не будут потеряны. Поэтому большинству приложений не нужно восстанавливать состояние, когда они возобновляются, хотя они должны повторно запрашивать какие-либо файлы или дескриптор устройства, которые они выпустили при приостановке, и восстановить любое состояние, которое было явно выпущено при приостановке приложения.

Приложение может быть приостановлено в течение нескольких часов или дней. Если у вашего приложения есть содержимое или сетевые подключения, которые, возможно, устарели, они должны быть обновлены при возобновлении работы приложения. Если приложение зарегистрировало обработчик событий для события Application.Resuming , он вызывается, когда приложение возобновляется из приостановленного состояния. Вы можете обновить содержимое и данные приложения в этом обработчике событий.

Если приостановленное приложение активируется для участия в контракте или расширении приложения, оно сначала получает событие возобновления , а затем активированное событие.

Если приостановленное приложение было завершено, событие возобновления не вызывается, а вместо OnLaunched() вызывается с помощью ApplicationExecutionState of Terminated. Так как вы сохранили состояние при приостановке приложения, вы можете восстановить это состояние во время OnLaunched(), чтобы приложение отображалось пользователю, как это было, когда он отключился от него.

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

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

Общие рекомендации см. в руководстве по приостановке и возобновлению работы приложения.

Закрытие приложения

Как правило, пользователям не нужно закрывать приложения, они могут позволить Windows управлять ими. Однако пользователи могут закрыть приложение с помощью жеста закрытия или нажатия клавиш ALT+F4 или с помощью переключателя задач на Windows Phone.

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

Поведение закрытого пользователя. Если приложение должно сделать что-то другое при закрытии пользователем, чем при закрытии Windows, можно использовать обработчик событий активации, чтобы определить, было ли приложение завершено пользователем или Windows. См. описания состояний ClosedByUser и Terminated в справочнике по перечислению ApplicationExecutionState.

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

Сбой приложения

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

Если приложение завершает работу, перестает отвечать или создает исключение, отчет о проблеме отправляется в корпорацию Майкрософт на отзывы пользователя и диагностика параметры. Дополнительные сведения см. в разделе "Диагностика", " Отзывы" и "Конфиденциальность" в Windows . Корпорация Майкрософт предоставляет подмножество данных об ошибках в отчете об ошибке, чтобы вы могли использовать его для улучшения приложения. Эти данные можно увидеть на странице "Качество" приложения на панели мониторинга.

Когда пользователь активирует приложение после сбоя, его обработчик событий активации получает значение ApplicationExecutionState NotRunning и должно отображать исходный пользовательский интерфейс и данные. После сбоя не используйте данные приложения, которые вы использовали бы для возобновления с приостановкой, так как эти данные могут быть повреждены. См. рекомендации по приостановке и возобновлению работы приложения.

Удаление приложений

Когда пользователь удаляет приложение, приложение удаляется вместе со всеми локальными данными. Удаление приложения не влияет на данные пользователя, хранящиеся в общих расположениях, таких как библиотеки документов или рисунков.

Жизненный цикл приложений и шаблоны проектов Visual Studio

Базовый код, соответствующий жизненному циклу приложения, предоставляется в шаблонах проектов Visual Studio. Базовое приложение обрабатывает активацию запуска, предоставляет место для восстановления данных приложения и отображает основной пользовательский интерфейс даже до добавления любого собственного кода. Дополнительные сведения см. в шаблонах проектов C#, VB и C++ для приложений.

Ключевые API жизненного цикла приложений