Жизненный цикл приложения универсальной платформы Windows (UWP) для Windows 10Windows 10 universal Windows platform (UWP) app lifecycle

В этой статье рассказывается о жизненном цикле приложения универсальной платформы Windows (UWP) с момента его активации и до закрытия.This topic describes the lifecycle of a Universal Windows Platform (UWP) app from the time it is launched until it is closed.

Немного историиA little history

До выпуска Windows 8 у приложений был простой жизненный цикл.Before Windows 8, apps had a simple lifecycle. Приложения Win32 и .NET или работали, или не работали.Win32 and .NET apps are either running or not running. Когда пользователь сворачивал их или переключался на другие задачи, они продолжали работу.When a user minimizes them, or switches away from them, they continue to run. Этого было достаточно, пока портативные устройства и управление питанием не стали играть более важную роль.This was fine until portable devices and power management became increasingly important.

В Windows 8 была представлена новая модель приложений — приложения UWP.Windows 8 introduced a new application model with UWP apps. На высоком уровне было добавлено новое приостановленное состояние.At a high level, a new suspended state was added. Приложение UWP приостанавливается вскоре после того, как пользователь свернет его или переключится на другое приложение.A UWP app is suspended shortly after the user minimizes it or switches to another app. Это означает, что потоки приложения будут остановлены, а приложение останется в памяти, если операционной системе не потребуется освободить ресурсы.This means that the app's threads are stopped and the app is left in memory unless the operating system needs to reclaim resources. Когда пользователь вернется к этому приложению, его работу можно будет быстро восстановить.When the user switches back to the app, it can be quickly restored to a running state.

Существуют различные способы для продолжения работы приложений в фоновом режиме, например фоновые задачи, расширенное выполнение и спонсируемое действием выполнение (например, функция BackgroundMediaEnabled, которая позволяет приложению продолжать воспроизведение мультимедиа в фоновом режиме).There are various ways for apps that need to continue to run when they are in the background such as background tasks, extended execution, and activity sponsored execution (for example, the BackgroundMediaEnabled capability which allows an app to continue to play media in the background). Кроме того, фоновые операции передачи также могут продолжаться, даже если приложение приостановлено или закрыто.Also, background transfer operations can continue even if your app is suspended or even terminated. Дополнительные сведения см. в разделе Как скачать файл.For more info, see How to download a file.

По умолчанию приложения в фоновом режиме приостанавливаются, что приводит к экономии электроэнергии и освобождению ресурсов для активных приложений.By default, apps that are not in the foreground are suspended which results in power savings and more resources available for the app currently in the foreground.

Приостановленное состояние несет с собой новые требования для вас как разработчика, поскольку операционная система может по своему усмотрению завершить работу приостановленного приложения, чтобы освободить ресурсы.The suspended state adds new requirements for you as a developer because the operating system may elect to terminate a suspended app in order to free up resources. Завершенное приложение будет по-прежнему отображаться на панели задач.The terminated app will still appear in the task bar. Если пользователь щелкнет его, приложение должно восстановить состояние, в котором оно было, прежде чем оно было закрыто, поскольку пользователь не будет знать, что система закрыла приложение.When the user click on it, the app must restore the state that it was in before it was terminated because the user will not be aware that the system closed the app. Пользователи могут решить, что приложение ожидало возобновления в фоновом режиме, когда они выполняли другие задачи, поэтому они будут ждать, что приложение окажется том же состоянии, в котором оно находилось ранее.They will think that it has been waiting in the background while they were doing other things and will expect it to be in the same state it was in when they left it. В этой статье мы рассмотрим, как реализовать это.In this topic we will look at how to accomplish that.

В Windows 10 версии 1607 представлены два дополнительных состояния модели приложения: Работает на переднем плане и Работает в фоновом режиме.Windows 10, version 1607, introduces two more app model states: Running in foreground and Running in background. Мы также рассмотрим эти новые состояния в следующих разделах.We will also look at these new states in the sections that follow.

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

На рисунке показаны возможные состояния модели приложений начиная с Windows 10 версии 1607.This illustration represents the possible app model states starting in Windows 10, version 1607. Изучим стандартный жизненный цикл приложения UWP.Let's walk through the typical lifecycle of a UWP app.

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

Приложения переходят в фоновый режим при запуске или активации.Apps enter the running in background state when they are launched or activated. Если приложению нужно перейти на передний план в связи с запуском приложения переднего плана, приложение получает событие LeavingBackground.If the app needs to move into the foreground due to a foreground app launch, the app then gets the LeavingBackground event.

Хотя термины «запущен» и «активирован» кажутся похожими, они отражают различные способы запуска приложения операционной системой.Although "launched" and "activated" may seem like similar terms, they refer to different ways the operating system may start your app. Сначала рассмотрим запуск приложения.Let's first look at launching an app.

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

При запуске приложения вызывается метод OnLaunched.The OnLaunched method is called when an app is launched. Ему передается параметр LaunchActivatedEventArgs, который, помимо прочего, предоставляет аргументы, переданные приложению, идентификатор плитки, которая запустила приложение, и его предыдущее состояние.It is passed a LaunchActivatedEventArgs parameter which provides, among other things, the arguments passed to the app, the identifier of the tile that launched the app, and the previous state that the app was in.

Получить предыдущее состояние приложения можно с помощью функции LaunchActivatedEventArgs.PreviousExecutionState, которая возвращает объект ApplicationExecutionState.Get the previous state of your app from LaunchActivatedEventArgs.PreviousExecutionState which returns an ApplicationExecutionState. Далее описаны его значения и соответствующие действия.Its values and the appropriate action to take due to that state are as follows:

ApplicationExecutionStateApplicationExecutionState ОбъяснениеExplanation Предстоящее действиеAction to take
NotRunningNotRunning Приложение могло быть в этом состоянии, поскольку оно еще не запущено с момента последней перезагрузки или входа пользователя в систему.An app could be in this state because it hasn't been launched since the last time the user rebooted or logged in. Кроме того, приложение может оказаться в этом состоянии, если оно работало, но затем было закрыто пользователем или в результате сбоя.It can also be in this state if it was running but then crashed, or because the user closed it earlier. Инициализировать приложение так, будто оно запускается в первый раз в сеансе текущего пользователя.Initialize the app as if it is running for the first time in the current user session.
SuspendedSuspended Пользователь свернул приложение или переключился на другую задачу и не вернулся в течение нескольких секунд.The user either minimized or switched away from your app and didn't return to it within a few seconds. Если приложение было приостановлено, его состояние сохраняется в памяти.When the app was suspended, its state remained in memory. Вам нужно просто повторно получить все дескрипторы файлов или другие ресурсы, освобожденные, когда приложение было приостановлено.You only need to reacquire any file handles or other resources you released when the app was suspended.
TerminatedTerminated Приложение было ранее приостановлено, но затем закрыто, поскольку системе потребовалась дополнительная память.The app was previously suspended but was then shutdown at some point because the system needed to reclaim memory. Восстановить состояние, в котором приложение находилось, когда пользователь переключился на другую задачу.Restore the state that the app was in when the user switched away from it.
ClosedByUserClosedByUser Пользователь закрыл приложение жестом в режиме планшета или с помощью сочетания клавиш ALT+F4.The user closed the app with the close gesture in tablet mode, or with Alt+F4. Когда пользователь закрывает приложение, оно сначала приостанавливается и затем завершает работу.When the user closes the app, it is first suspended and then terminated. Так как приложение, по сути, прошло те же этапы, которые ведут к состоянию Terminated, выполните такие же действия, как и для этого состояния.Because the app has essentially gone through the same steps that lead to the Terminated state, handle this the same way you would the Terminated state.
RunningRunning Приложение было уже открыто, когда пользователь попытался запустить его снова.The app was already open when the user tried to launch it again. Отсутствует.Nothing. Обратите внимание, что другой экземпляр приложения не запущен.Note that another instance of your app is not launched. Уже запущенный экземпляр просто активируется.The already running instance is simply activated.

Примечание Текущий сеанс пользователя основана на входа в систему Windows.*Note***Current user session is based on Windows logon. Пока текущий пользователь не выйдет из системы, не завершит работу или не перезагрузит Windows, сеанс этого пользователя сохраняется для всех событий, таких как проверка подлинности на экране блокировки, переключение пользователя и т. д.As long as the current user hasn't logged off, shut down, or restarted Windows, the current user session persists across events such as lock screen authentication, switch-user, and so on.

Следует помнить об одном из важных обстоятельств — если у устройства достаточно ресурсов, операционная система будет предварительно запускать часто используемые приложения, для которых такая функция разрешения, чтобы оптимизировать производительность.One important circumstance to be aware of is that if the device has sufficient resources, the operating system will prelaunch frequently used apps that have opted in for that behavior in order to optimize responsiveness. Приложения, которые предварительно запускаются в фоновом режиме, а затем быстро приостанавливаются, чтобы когда пользователь переключился на них, их можно было возобновить, что будет быстрее, чем обычный запуск приложения.Apps that are prelaunched are launched in the background and then quickly suspended so that when the user switches to them, they can be resumed which is faster than launching the app.

Из-за предварительного запуска метод OnLaunched() приложения может быть вызван системой, а не пользователем.Because of prelaunch, the app’s OnLaunched() method may be initiated by the system rather than by the user. Поскольку приложение предварительно запущено в фоновом режиме, может потребоваться другое действие в OnLaunched ().Because the app is prelaunched in the background you may need to take different action in OnLaunched(). Например, если приложение начинает воспроизводить музыку после запуска, будет неизвестно, откуда она берется, поскольку приложение было предварительно запущено в фоновом режиме.For example, if your app starts playing music when launched, they will not know where it is coming from because the app is prelaunched in the background. Как только приложение будет предварительно запущено в фоновом режиме, последует вызов Application.Suspending.Once your app is prelaunched in the background, it is followed by a call to Application.Suspending. Затем, когда пользователь запускает приложение, вызывается событие возобновления, а также метод OnLaunched().Then, when the user does launch the app, the resuming event is invoked as well as the OnLaunched() method. Дополнительные сведения о работе с предварительным запуском см. в разделе Обработка предварительного запуска приложения.See Handle app prelaunch for additional information about how to handle the prelaunch scenario. Предварительно запускаются только приложения, которые явно разрешили эту функцию.Only apps that opt-in are prelaunched.

При запуске приложения Windows отображает его экран-заставку.Windows displays a splash screen for the app when it is launched. Подробнее о настройке экрана-заставки см. в статье Добавление экрана-заставки.To configure the splash screen, see Adding a splash screen.

Когда отображается экран-заставка, приложение должно зарегистрировать обработчики событий и настроить элементы пользовательского интерфейса для начальной страницы.While the splash screen is displayed, your app should register event handlers and set up any custom UI it needs for the initial page. Убедитесь, что эти задачи, выполняемые в конструкторе приложения и методе OnLaunched(), завершаются в течение нескольких секунд, или система может посчитать, что приложение не отвечает, и завершить его.See that these tasks running in the application’s constructor and OnLaunched() are completed within a few seconds or the system may think your app is unresponsive and terminate it. Если приложению требуется запросить данные из сети или получить большой объем информации с диска, эти действия необходимо совершать отдельно от запуска.If an app needs to request data from the network or needs to retrieve large amounts of data from disk, these activities should be completed outside of launch. Приложение может использовать собственный настраиваемый пользовательский интерфейс или расширенный экран-заставку, ожидая завершения таких продолжительных операций.An app can use its own custom loading UI or an extended splash screen while it waits for long running operations to finish. Подробнее см. в разделах Более продолжительное отображение экрана-заставки и Пример экрана-заставки.See Display a splash screen for more time and the Splash screen sample for more info.

После завершения запуска приложение переходит в состояние Running, и экран-заставка исчезает, а все соответствующие ресурсы и объекты удаляются.After the app completes launching, it enters the Running state and the splash screen disappears and all splash screen resources and objects are cleared.

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

В отличие от запуска пользователем приложение может быть активировано системой.In contrast to being launched by the user, an app can be activated by the system. Приложение может быть активировано контрактом, например контрактом отправки данных.An app may be activated by a contract such as the share contract. Кроме того, оно может быть активировано для обработки пользовательского протокола URI или файла с расширением, с которым связано ваше приложение.Or it may be activated to handle a custom URI protocol or a file with an extension that your app is registered to handle. Перечень способов активации приложения см. в статье ActivationKind.For a list of ways your app can be activated, see ActivationKind.

Класс Windows.UI.Xaml.Application определяет методы, которые можно переопределить для обработки различных типов активации приложения.The Windows.UI.Xaml.Application class defines methods you can override to handle the various ways your app may be activated. Метод OnActivated используется для обработки всех возможных типов активации.OnActivated can handle all possible activation types. Однако более часто используются другие методы обработки наиболее распространенных типов активации, и метод OnActivated используется как резервный для менее распространенных типов активации.However, it's more common to use specific methods to handle the most common activation types, and use OnActivated as the fallback method for the less common activation types. Существуют другие методы для конкретных активаций:These are the additional methods for specific activations:

OnCachedFileUpdaterActivated;OnCachedFileUpdaterActivated
OnFileActivated;OnFileActivated
OnFileOpenPickerActivated OnFileSavePickerActivatedOnFileOpenPickerActivated OnFileSavePickerActivated
OnSearchActivated;OnSearchActivated
OnShareTargetActivated.OnShareTargetActivated

Данные события для этих методов содержат то же свойство PreviousExecutionState, которое мы видели выше. Оно указывает, в каком состоянии находилось приложение перед активацией.The event data for these methods includes the same PreviousExecutionState property that we saw above, which tells you which state your app was in before it was activated. Интерпретируйте состояние и определите ваши действия так же, как описано в разделе Запуск приложения.Interpret the state and what you should do it the same way as described above in the App launch section.

Примечаниепри входе в систему с учетной записью администратора на компьютере, то не сможете активировать приложения UWP.NoteIf you log on using the computer's Administrator account, you can't activate UWP apps.

Выполнение в фоновом режимеRunning in the background

Начиная с Windows 10 версии 1607 приложения могут выполнять фоновые задачи в том же процессе, в котором работает само приложение.Starting with Windows 10, version 1607, apps can run background tasks within the same process as the app itself. Подробнее об этом см. в статье Модель фонового действия с одним процессом.Read more about it in Background activity with the Single Process Model. В этой статье мы не рассматриваем фоновую обработку с одним процессом, но следует отметить, что в жизненный цикл приложения добавлены два новых события, связанные с фоновым выполнением приложения.We won't go into in-process background processing in this article, but how this impacts the app lifecycle is that two new events have been added related to when your app is in the background. Это события EnteredBackground и LeavingBackground.They are: EnteredBackground and LeavingBackground.

Они также отражают, может ли пользователь видеть интерфейс приложения.These events also reflect whether the user can see your app's UI.

Выполнение в фоновом режиме — это состояние по умолчанию запущенного, активируемого или возобновляемого приложения.Running in the background is the default state that an application is launched, activated, or resumed into. В этом состоянии пользовательского интерфейс приложения еще не виден.In this state your application UI is not visible yet.

Выполнение на переднем планеRunning in the foreground

Пользовательский интерфейс приложения, которое выполняется на переднем плане, виден.Running in the foreground means that your app's UI is visible.

Событие LeavingBackground срабатывает непосредственно перед отображением пользовательского интерфейса и перед тем, как приложение переходит в состояние выполнения на переднем плане.The LeavingBackground event is fired just before your application UI is visible and before entering the running in foreground state. Оно также активируется, когда пользователь возвращается к приложению.It also fires when the user switches back to your app.

Ранее лучшим местом для загрузки ресурсов интерфейса были обработчики событий Activated и Resuming.Previously, the best location to load UI assets was in the Activated or Resuming event handlers. Теперь же обработчик события LeavingBackground — лучший способ проверить готовность вашего интерфейса.Now LeavingBackground is the best place to verify that your UI is ready.

Важно убедиться, что визуальные ресурсы готовы к этому моменту, поскольку это последняя возможность выполнить необходимые задачи, прежде чем пользователь увидит приложение.It is important to check that visual assets are ready by this time because this is the last opportunity to do work before your application is visible to the user. Все действия с пользовательским интерфейсом в этом обработчике событий нужно выполнить быстро, так как это влияет на время запуска и возобновления приложения.All UI work in this event handler should complete quickly, as it impacts the launch and resume time that the user experiences. Событие LeavingBackground дает время подготовить первый кадр интерфейса.LeavingBackground is the time to ensure the first frame of UI is ready. Затем длительные вызовы хранилища или сети должны обрабатываться асинхронно, чтобы обработчик событий мог снова активироваться.Then, long-running storage or network calls should be handled asynchronously so that the event handler may return.

Когда пользователь переключается на другую задачу, ваше приложение снова переходит в фоновое состояние.When the user switches away from your application, your app reenters the running in background state.

Повторный переход в фоновое состояниеReentering the background state

Событие EnteredBackground указывает, что приложение больше не отображается на переднем плане.The EnteredBackground event indicates that your app is no longer visible in the foreground. На настольном компьютере событие EnteredBackground срабатывает, когда приложение свертывается, на телефоне — при переключении на начальный экран или другое приложение.On the desktop EnteredBackground fires when your app is minimized; on phone, when switching to the home screen or another app.

Уменьшение объема памяти, которое потребляет приложениеReduce your app's memory usage

Поскольку пользователь больше не видит потребление, рекомендуется именно здесь прекратить отрисовку пользовательского интерфейса и анимации.Since your app is no longer visible to the user, this is the best place to stop UI rendering work and animations. Чтобы возобновить эти задачи, можно использовать LeavingBackground.You can use LeavingBackground to start that work again.

Если вы планируете выполнять какие-то задачи в фоновом режиме, здесь можно к этому подготовиться.If you are going to do work in the background, this is the place to prepare for it. Лучше всего проверить свойство MemoryManager.AppMemoryUsageLevel и, если требуется, уменьшить объем памяти, который использует ваше приложение, работающее в фоновом режиме, чтобы система не закрыла его, чтобы освободить ресурсы.It is best to check MemoryManager.AppMemoryUsageLevel and, if needed, reduce the amount of memory being used by your app when it is running in the background so that your app doesn't risk being terminated by the system to free up resources.

Дополнительные сведения см. в статье Уменьшение используемого объема памяти при переходе приложения в фоновое состояние.See Reduce memory usage when your app moves to the background state for more details.

Сохранение состоянияSave your state

Обработчик события приостановки является лучшим местом для сохранения состояния приложения.The suspending event handler is the best place to save your app state. Если вы выполняете какие-то задачи в фоновом режиме, такие как воспроизведение звука, с использованием расширенного сеанса выполнения или фоновую задачу, выполняемую внутри процесса, то лучше сохранить данные не синхронно с обработчиком событий EnteredBackground.However, if you are doing work in the background (for example, audio playback, using an extended execution session or in-proc background task), it is also a good practice to save your data asynchronously from your EnteredBackground event handler. Это связано с тем, что приложение может быть завершено, пока оно находится в фоновом режиме с более низким приоритетом.This is because it is possible for your app to be terminated while it is at a lower priority in the background. Поскольку в этом случае приложение не перейдет в приостановленное состояние, ваши данные будут потеряны.And because the app will not have gone through the suspended state in that case, your data will be lost.

Сохраните данные в обработчике событий EnteredBackground, прежде чем начнутся работы в фоновом режиме, чтобы повысить эффективность его возврата на передний план.Saving your data in your EnteredBackground event handler, before background activity begins, ensures a good user experience when the user brings your app back to the foreground. Вы можете использовать API данных приложения для сохранения параметров и данных.You can use the application data APIs to save data and settings. Подробнее: Хранение и извлечение параметров и прочих данных приложения.For more info, see Store and retrieve settings and other app data.

Если после сохранения данных вы превысили ограничение используемого объема памяти, вы сможете освободить память, так как данные можно снова загрузить позже.After you save your data, if you are over your memory usage limit, then you can release your data from memory since you can reload it later. При этом фоновым процессам станут доступны дополнительные ресурсы.That will free memory that can be used by the assets needed for background activity.

Помните, что если приложение выполняет фоновые задачи, оно может перейти из фонового состояния в состояние выполнения на переднем плане, минуя приостановленное состояние.Be aware that if your app has background activity in progress that it can move from the running in the background state to the running in the foreground state without ever reaching the suspended state.

Асинхронные работа и отсрочкиAsynchronous work and Deferrals

Если вы используете асинхронный вызов в обработчике, контроль после его завершения возвращается немедленно.If you make an asynchronous call within your handler, control returns immediately from that asynchronous call. Это означает, что обработчик событий вернет управление приложению, которое сможет перейти в следующее состояние, даже если асинхронный вызов еще не завершен.That means that execution can then return from your event handler and your app will move to the next state even though the asynchronous call hasn't completed yet. Используйте метод GetDeferral объекта EnteredBackgroundEventArgs, который передается обработчику события, чтобы задержать приостановку после вызова метода Complete возвращенного объекта Windows.Foundation.Deferral.Use the GetDeferral method on the EnteredBackgroundEventArgs object that is passed to your event handler to delay suspension until after you call the Complete method on the returned Windows.Foundation.Deferral object.

Отсрочка не увеличивает время, необходимое для выполнения кода перед завершением работы приложения.A deferral doesn't increase the amount you have to run your code before your app is terminated. Она только откладывает завершение до вызова метода Complete отсрочки или наступления крайнего срока (в зависимости от того, происходит первым).It only delays termination until either the deferral's Complete method is called, or the deadline passes-whichever comes first.

Если вам нужно больше времени для сохранения состояния, изучите способы его сохранения на стадиях, предшествующих переходу приложения в фоновый режим, чтобы в обработчике событий EnteredBackground нужно было сохранить меньше данных.If you need more time to save your state, investigate ways to save your state in stages before your app enters the background state so that there is less to save in your EnteredBackground event handler. Кроме того, вы можете запросить расширенный сеанс выполнения (ExtendedExecutionSession), чтобы получить больше времени.Or you may request an ExtendedExecutionSession to get more time. Нет гарантии, что запрос будет удовлетворен, поэтому лучше найти способ минимизировать время, необходимое для сохранения состояния.There is no guarantee that the request will be granted, however, so it is best to find ways to minimize the amount of time you need to save your state.

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

Когда пользователь сворачивает приложение, Windows ждет несколько секунд, чтобы узнать, вернется ли пользователь к нему.When the user minimizes an app Windows waits a few seconds to see whether the user will switch back to it. Если это не происходит, не запрошен расширенный сеанс выполнения, фоновая задача или спонсируемое действием выполнение, Windows приостанавливает приложение.If they do not switch back within this time window, and no extended execution, background task, or activity sponsored execution is active, Windows suspends the app. Приложение также приостанавливается, когда появляется экран блокировки, если для приложения нет активного расширенного сеанса выполнения и т. д.An app is also suspended when the lock screen appears as long as no extended execution session, etc. is active in that app.

Если приложение приостановлено, оно вызывает событие Application.Suspending.When an app is suspended, it invokes the Application.Suspending event. Шаблоны проектов UWP Visual Studio предоставляют обработчик этого события, OnSuspending, в файле App.xaml.cs.Visual Studio’s UWP project templates provide a handler for this event called OnSuspending in App.xaml.cs. До Windows 10 версии 1607 код для сохранения состояния здесь размещался здесь.Prior to Windows 10, version 1607, you would put the code to save your state here. Теперь рекомендуется сохранять состояние при входе в фоновый режим, как описано выше.Now the recommendation is to save your state when you enter the background state, as described above.

Вам также нужно освободить монопольные ресурсы и дескрипторы файлов, чтобы другие приложения могли получать к ним доступ, пока приложение приостановлено.You should release exclusive resources and file handles so that other apps can access them while your app is suspended. К примерам монопольных ресурсов относятся камеры, устройства ввода-вывода, внешние устройства и сетевые ресурсы.Examples of exclusive resources include cameras, I/O devices, external devices, and network resources. Явное освобождение монопольных ресурсов и дескрипторов файлов обеспечивает доступ к ним других приложений на то время, пока приложение приостановлено.Explicitly releasing exclusive resources and file handles helps to ensure that other apps can access them while your app is suspended. После возобновления приложение должно вернуться к использованию тех же монопольных ресурсов и дескрипторов файлов.When the app is resumed, it should reacquire its exclusive resources and file handles.

Помните о крайнем срокеBe aware of the deadline

Чтобы устройство работало быстро, на время, необходимое для выполнения кода в обработчике события приостановки, наложено ограничение.In order to ensure a fast and responsive device, there is a limit for the amount of time you have to run your code in your suspending event handler. Для каждого устройства оно различное, и вы можете узнать его с помощью свойства Deadline объекта SuspendingOperation.It is different for each device, and you can find out what it is using a property of the SuspendingOperation object called the deadline.

Как и в случае с EnteredBackground, если используется асинхронный вызов из обработчика, управление немедленно возвращается после его завершения.As with the EnteredBackground event handler, if you make an asynchronous call from your handler, control returns immediately from that asynchronous call. Это означает, что обработчик событий вернет управление приложению, которое сможет перейти в приостановленное состояние, даже если асинхронный вызов еще не завершен.That means that execution can then return from your event handler and your app will move to the suspend state even though the asynchronous call hasn't completed yet. Используйте метод GetDeferral объекта SuspendingOperation (доступного через аргументы события), чтобы отложить переход в приостановленное состояние до момента, когда будет вызван метод Complete возвращенного объекта SuspendingDeferral.Use the GetDeferral method on the SuspendingOperation object (available via the event args) to delay entering the suspended state until after you call the Complete method on the returned SuspendingDeferral object.

Если вам требуется дополнительное время, вы можете запросить расширенный сеанс выполнения (ExtendedExecutionSession).If you need more time, you may request an ExtendedExecutionSession. Однако нет гарантии, что запрос будет удовлетворен, поэтому лучше найти способ минимизировать время, необходимое для сохранения данных в обработчике события Suspended.There is no guarantee that the request will be granted, however, so it is best to find ways to minimize the amount of time you need in your Suspended event handler.

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

Система старается сохранить ваше приложение и его данные в памяти, пока его выполнение приостановлено.The system attempts to keep your app and its data in memory while it's suspended. Тем не менее, если ресурсов системы для сохранения вашего приложения в памяти недостаточно, система завершает его работу.However, if the system does not have the resources to keep your app in memory, it will terminate your app. Приложения не получают уведомление о том, что они будут завершены, поэтому единственная возможность сохранить данные приложения — обработчик событий OnSuspension или асинхронный вызов из обработчика **EnteredBackground **.Apps don't receive a notification that they are being terminated, so the only opportunity you have to save your app's data is in your OnSuspension event handler, or asynchronously from your EnteredBackground handler.

Когда приложение определяет, что оно было активировано после завершения работы, ему нужно загрузить сохраненные данные, чтобы перейти в состояние до завершения работы.When your app determines that it has been activated after being terminated, it should load the application data that it saved so that the app is in the same state it was in before it was terminated. Когда пользователь снова переключается на приостановленное приложение, работа которого была завершена, приложению необходимо восстановить свои данные в методе OnLaunched.When the user switches back to a suspended app that has been terminated, the app should restore its application data in its OnLaunched method. Система не уведомляет приложение о завершении его работы, поэтому в случае приостановки приложение должно сохранять свои данные и освобождать монопольные ресурсы и дескрипторы файлов, а затем восстанавливать их во время активации после завершения работы.The system doesn't notify an app when it is terminated, so your app must save its application data and release exclusive resources and file handles before it is suspended, and restore them when the app is activated after termination.

Замечание об отладке с использованием Microsoft Visual Studio: с помощью Visual Studio можно предотвратить приостановку системой Windows работы программы, подключенной к отладчику.A note about debugging using Visual Studio: Visual Studio prevents Windows from suspending an app that is attached to the debugger. Это позволяет пользователю видеть пользовательский интерфейс отладчика Visual Studio во время выполнения приложения.This is to allow the user to view the Visual Studio debug UI while the app is running. При отладке программы с помощью Visual Studio вы можете отправить ей событие приостановки.When you're debugging an app, you can send it a suspend event using Visual Studio. Убедитесь, что отображается панель инструментов Место отладки, а затем щелкните значок Приостановить.Make sure the Debug Location toolbar is being shown, then click the Suspend icon.

Возобновление работы приложенияApp resume

Работа приостановленного приложения возобновляется, когда пользователь переключается на него или если оно активно во время выхода устройства из состояния пониженного энергопотребления.A suspended app is resumed when the user switches to it or when it is the active app when the device comes out of a low power state.

Когда работа приложения возобновляется из приостановленного состояния, оно переходит состояние выполнения не переднем плане, а система восстанавливает работу приложения с места приостановки так, будто оно и не закрывалось.When an app is resumed from the Suspended state, it enters the Running in background state and the system restores the app where it left off so that it appears to the user as if it has been running all along. При этом данные приложения, которые сохранены в памяти, не будут потеряны.No app data stored in memory is lost. Поэтому большинству приложений не требуется восстанавливать состояние при возобновлении, хотя им необходимо повторно получить все дескрипторы файлов и устройств, которые они освободили после приостановки, и восстановить явное состояние, действующее на момент приостановки приложения.Therefore, most apps don't need to restore state when they are resumed though they should reacquire any file or device handles that they released when they were suspended, and restore any state that was explicitly released when the app was suspended.

Приложение может быть приостановлено на несколько часов или дней.You app may be suspended for hours or days. Если ваше приложение работает с содержимым или сетевыми подключениями, которые могут устареть за это время, оно должно обновить их после возобновления работы.If your app has content or network connections that may have gone stale, these should be refreshed when the app resumes. Если приложение зарегистрировало обработчик события Application.Resuming, то он будет вызываться при возобновлении работы приложения после выхода из состояния Suspended.If an app registered an event handler for the Application.Resuming event, it is called when the app is resumed from the Suspended state. С помощью этого обработчика событий вы можете обновлять содержимое и данные приложения.You can refresh your app content and data in this event handler.

Если приостановленное приложение активировано для участия в контракте приложений или расширении, оно получает сначала событие Resuming, а затем— событие Activated.If a suspended app is activated to participate in an app contract or extension, it receives the Resuming event first, then the Activated event.

Если работа приостановленное приложения была завершена, событие Resuming не срабатывает, а вызывается метод OnLaunched(), при этом параметру ApplicationExecutionState присвоено значение Terminated.If the suspended app was terminated, there is no Resuming event and instead OnLaunched() is called with an ApplicationExecutionState of Terminated. Поскольку вы сохранили состояние во время приостановки приложения, вы можете восстановить его в методе OnLaunched (), чтобы приложение выглядело так же, как и до приостановки.Because you saved your state when the app was suspended, you can restore that state during OnLaunched() so that your app appears to the user as it was when they switched away from it.

Когда приложение приостановлено, оно не получает никаких сетевых событий, для получения которых зарегистрировано.While an app is suspended, it does not receive any network events that it registered to receive. Эти сетевые события не добавляются в очередь, а просто пропускаются.These network events are not queued--they are simply missed. Поэтому при возобновлении работы ваше приложение должно проверять состояние сети.Therefore, your app should test the network status when it is resumed.

Примечаниеиз-за события возобновления не вызывается из потока пользовательского интерфейса, необходимо использовать диспетчер, если код в обработчике возобновления взаимодействует с пользовательским Интерфейсом.NoteBecause the Resuming event is not raised from the UI thread, a dispatcher must be used if the code in your resume handler communicates with your UI. Пример кода см. в статье Обновление потока пользовательского интерфейса из фонового потока.See Update the UI thread from a background thread for a code example of how to do this.

Общие рекомендации см. в руководстве по приостановке и возобновлению работы приложения.For general guidelines, see Guidelines for app suspend and resume.

Закрытие приложенийApp close

Обычно пользователям не нужно закрывать приложения. Они могут разрешить Windows управлять ими.Generally, users don't need to close apps, they can let Windows manage them. Но пользователь может закрыть приложение с помощью соответствующего жеста, нажав клавиши ALT+F4 или воспользовавшись диспетчером задач в Windows Phone.However, users can choose to close an app using the close gesture or by pressing Alt+F4 or by using the task switcher on Windows Phone.

Не существует какого-либо особого события, указывающего на то, что пользователь закрыл приложение.There is not an event to indicate that the user closed the app. При закрытии приложения пользователем оно сначала приостанавливается, чтобы вы могли сохранить его состояние.When an app is closed by the user, it is first suspended to give you an opportunity to save its state. В Windows8.1 и более поздних версиях после закрытия приложения пользователем приложение удаляется с экрана и списка переключения, но явно не завершена.In Windows8.1 and later, after an app has been closed by the user, the app is removed from the screen and switch list but not explicitly terminated.

Поведение закрыта, пользователя: Если ваше приложение должно сделать что-то другой при закрытии пользователем и разному при закрытии пользователем и Windows, чтобы определить, является ли приложение вело пользователем или системой Windows можно использовать обработчик событий активации.Closed-by-user behavior: If your app needs to do something different when it is closed by the user than when it is closed by Windows, you can use the activation event handler to determine whether the app was terminated by the user or by Windows. Описания состояний ClosedByUser и Terminated приведены в справочных документах по перечислению ApplicationExecutionState.See the descriptions of ClosedByUser and Terminated states in the reference for the ApplicationExecutionState enumeration.

Мы не рекомендуем закрывать приложение программными методами, если в этом нет серьезной необходимости.We recommend that apps not close themselves programmatically unless absolutely necessary. Например, если приложение обнаруживает утечку памяти, оно может закрыться самостоятельно, чтобы обеспечить защиту персональных данных пользователя.For example, if an app detects a memory leak, it can close itself to ensure the security of the user's personal data.

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

Взаимодействие при сбое системы организовано таким образом, чтобы пользователи могли вернуться к выполняемым действиям как можно скорее.The system crash experience is designed to get users back to what they were doing as quickly as possible. Вам не нужно показывать диалоговое окно с предупреждением или иное уведомление, поскольку это вызовет задержку в работе пользователя.You shouldn't provide a warning dialog or other notification because that will delay the user.

Если приложение дает сбой, перестает отвечать или создает исключение, в Microsoft отправляется отчет о проблеме в соответствии с параметрами отзывов и диагностики пользователя.If your app crashes, stops responding, or generates an exception, a problem report is sent to Microsoft per the user's feedback and diagnostics settings. Microsoft включает набор данных об ошибке в предоставляемый отчет о проблеме, что позволяет вам улучшить приложение.Microsoft provides a subset of the error data in the problem report to you so that you can use it to improve your app. Эти данные можно просмотреть на странице «Качество» вашего приложения, расположенной на информационной панели.You'll be able to see this data in your app's Quality page in your Dashboard.

Когда пользователь активирует приложение после сбоя, его обработчик событий активации получает параметр ApplicationExecutionState со значением NotRunning и должен просто отобразить его начальный пользовательский интерфейс и данные.When the user activates an app after it crashes, its activation event handler receives an ApplicationExecutionState value of NotRunning, and should display its initial UI and data. После сбоя не используйте данные приложения, которые вы бы использовали для события Resuming из состояния Suspended, поскольку эти данные могут быть повреждены; см. раздел Рекомендации по приостановке и возобновлению приложений.After a crash, don't routinely use the app data you would have used for Resuming with Suspended because that data could be corrupt; see Guidelines for app suspend and resume.

Удаление приложенияApp removal

Когда пользователь удаляет приложение, вместе с ним удаляются все локальные данные этого приложения.When a user deletes your app, the app is removed, along with all its local data. При удалении приложения не затрагиваются данные пользователей, сохраненные в стандартных расположениях, таких как файлы в библиотеках "Документы" или "Изображения".Removing an app doesn't affect the user's data that was stored in common locations such as the Documents or Pictures libraries.

Жизненный цикл приложения и шаблоны проектов Visual StudioApp lifecycle and the Visual Studio project templates

Базовый код, который соответствует жизненному циклу приложения, содержится в шаблонах проектов Visual Studio.The basic code that is relevant to the app lifecycle is provided in the Visual Studio project templates. Базовое приложение обрабатывает активацию запуска, предоставляет место для восстановления данных приложения и отображает основной пользовательский интерфейс еще до того как, вы добавите собственный код.The basic app handles launch activation, provides a place for you to restore your app data, and displays the primary UI even before you've added any of your own code. Дополнительные сведения см. в статье Шаблоны проектов на C#, VB и C++ для приложений.For more info, see C#, VB, and C++ project templates for apps.

Основные API жизненного цикла приложенияKey application lifecycle APIs