Задержка приостановки приложения с помощью расширенного сеанса выполнения
В этой статье рассказывается, как использовать расширенный сеанс выполнения, когда работа приложения приостановлена, чтобы оно могло выполняться в свернутом состоянии или на экране блокировки.
Когда пользователь сворачивает приложение или переключается на другую задачу, его работа приостанавливается. Память приложения задействуется, но код не выполняется. Эта схема применима ко всем выпускам операционной системы, в которой есть визуальный интерфейс пользователя. Дополнительные сведения о процессах, происходящих при приостановке приложения, см. в разделе Жизненный цикл приложения.
Бывают случаи, когда необходимо, чтобы приложение выполнялось, а не приостанавливало работу, когда пользователь покидает его или при сворачивании приложения. Например, приложение для подсчета шагов должно работать и отслеживать шаги, даже когда пользователь переходит к использованию других приложений.
Если требуется, чтобы приложение продолжало работу, это может обеспечить операционная система либо приложение может отправить запрос, чтобы продолжить выполнение. Например, при воспроизведении звука в фоновом режиме операционная система может поддерживать работу приложения дольше, если выполнить шаги из раздела Воспроизведение мультимедиа в фоновом режиме. В противном случае необходимо вручную запросить больше времени для выполнения приложения. Количество времени, которое может быть получено для фонового выполнения, может составлять несколько минут, но вы должны быть готовы обработать сеанс, который может быть отозван в любое время. Эти ограничения времени жизненного цикла приложения отключены, пока приложение работает в режиме отладки. По этой причине важно проверить средство расширенного сеанса выполнения и другие инструменты, использующиеся для откладывания приостановки приложения не в режиме отладки, или путем использования событий жизненного цикла, доступных в Visual Studio.
Для этого требуется создать класс ExtendedExecutionSession, чтобы запросить больше времени на завершение работы приложения в фоновом режиме. Тип создаваемого объекта ExtendedExecutionSession определяется параметром ExtendedExecutionReason , который вы предоставляете при его создании. У перечисления ExtendedExecutionReason есть три значения: Unspecified, LocationTracking и SavingData. Только один сеанс ExtendedExecutionSessionможно запросить в любое время. Попытка создать другой сеанс, когда другой сеанс активен, вызовет исключение 0x8007139F в конструкторе ExtendedExecutionSession с сообщением о том, что состояние группы или ресурса является неподходящим для выполнения запрошенной операции. Не используйте ExtendedExecutionForegroundSession и ExtendedExecutionForegroundReason; Они требуют ограниченных возможностей и недоступны для использования в приложениях Магазина.
Выполнение при сворачивании
Существует два случая, когда можно использовать расширенный сеанс выполнения.
- В любой момент во время рутинного выполнения на переднем плане, когда приложение находится в состоянии выполнения.
- После того как приложение получит событие приостановки (операционная система переводит приложение в приостановленное состояние) в обработчике событий приостановки приложения.
Код для этих двух случаев является одинаковым, но приложение ведет себя немного по-разному в каждом случае. В первом случае приложение остается в состоянии выполнения даже при возникновении события, которое обычно приводит к запуску приостановки (например, переход пользователя из приложения). Приложение никогда не получит событие приостановки, пока активен расширенный сеанс выполнения. При сбросе расширенного сеанса выполнения приложение снова может быть приостановлено.
Во втором случае, если приложение переходит в приостановленное состояние, оно остается в состоянии приостановки в течение расширенного сеанса выполнения. После окончания расширенного сеанса выполнения приложение переходит в приостановленное состояние без дальнейшего уведомления.
Используйте ExtendedExecutionReason.Unspecified при создании класса ExtendedExecutionSession, чтобы запросить дополнительное время, перед тем как приложение перейдет в фоновый режим, для реализации таких сценариев, как обработка мультимедиа, компиляция проекта или поддержание сетевого подключения в активном состоянии. На настольных компьютерах под управлением Windows 10 Домашняя, Windows 10 Pro, Windows 10 Корпоративная и Windows 10 для образовательных учреждений следует использовать этот подход, если требуется, чтобы приложение не приостанавливало работу при его сворачивании.
При запуске продолжительного процесса запросите расширенный сеанс выполнения, чтобы отложить переход приложения в состояние Suspending (Приостановка), который в противном случае произойдет при переходе приложения в фоновый режим. На настольных устройствах к расширенным сеансам выполнения, созданным с помощью ExtendedExecutionReason.Unspecified, применяется ограничение по времени в зависимости от типа питания. Если устройство подключено к розетке, ограничение к продолжительности расширенного сеанса выполнения не применяется. Если устройство работает от батареи, продолжительность расширенного сеанса выполнения может составить до 10 минут в фоновом режиме.
При использовании планшета или ноутбука пользователь может добиться такой же длительности выполнения приложения при его сворачивании за счет уровня заряда батареи, если пункт Разрешить приложению выполнять фоновые задачи выбран в разделе Использование заряда батареи конкретными приложениями. (Чтобы найти этот параметр на ноутбуке, перейдите в раздел Параметры.>Системы>Батареи>Использование батареи по приложениям (ссылка под процентом оставшегося заряда батареи) > выберите приложение > Отключить управляемые по Windows> выберите Разрешить приложению выполнять фоновые задачи.
Во всех выпусках ОС подобные расширенные сеансы выполнения останавливаются, когда устройство переходит в режим ожидания с подключением. На мобильных устройствах под управлением Windows 10 Mobile подобные расширенные сеансы выполнения будут работать пока включен экран. При отключении экрана устройство сразу же попытается перейти в режим ожидания с подключением и пониженным энергопотреблением. На настольных устройствах сеанс будет продолжать работать при появлении экрана блокировки. Устройство не будет переходить в режим ожидания с подключением в течение некоторого времени после отключения экрана. В выпуске операционной системы для Xbox устройство переходит в режим ожидания с подключением через один час при условии, что пользователь не менял значение, заданное по умолчанию.
Отслеживание местоположения пользователя
Задайте значение ExtendedExecutionReason.LocationTracking при создании класса ExtendedExecutionSession, если требуется, чтобы ваше приложение регулярно получало данные о местоположении из класса GeoLocator. Приложениям для занятий спортом и навигации требуется постоянно отслеживать местоположение пользователя, поэтому при работе с ними всегда следует задавать это значение.
Расширенный сеанс выполнения для отслеживания расположения может выполняться любое время, в том числе при блокировке экрана на мобильном устройстве. Однако на одном устройстве может быть запущен только один такой сеанс. Расширенный сеанс выполнения для отслеживания местоположения можно запросить, только когда приложение находится на переднем плане и в состоянии Running (Выполнение). Это гарантирует, что пользователь будет осведомлен о том, что приложение инициализировало расширенный сеанс выполнения для отслеживания местоположения. Также можно использовать класс GeoLocator, когда приложение находится в фоновом режиме с помощью фоновой задачи или службы приложения без запроса расширенного сеанса выполнения для отслеживания местоположения.
Локальное сохранение важных данных
Задайте значение ExtendedExecutionReason.SavingData при создании класса ExtendedExecutionSession, чтобы данные пользователя сохранялись, когда это требуется. В противном случае, если данные не будут сохранены перед завершением работы приложения, они будут утеряны, что негативно отразиться на удобстве работы пользователя.
Не используйте подобные сеансы, чтобы продлить жизненный цикл приложения для отправки или скачивания данных. Если вам нужно отправить данные, запросите фоновую передачу данных или зарегистрируйте класс MaintenanceTrigger, который будет отвечать за передачу данных при наличии питания от сети переменного тока. Расширенный сеанс выполнения ExtendedExecutionReason.SavingData можно запросить, когда приложение находится на переднем плане и в состоянии Running (Выполнение) или в фоновом режиме и в состоянии Suspending (Приостановка).
Состояние Suspending (Приостановка) — это последняя возможность приложения продолжать выполнение в течение его жизненного цикла, перед тем как его работа будет завершена. ExtendedExecutionReason.SavingData — это единственный тип сеанса ExtendedExecutionSession, который можно запросить в состоянии Suspending. Отправка запроса на расширенный сеанс выполнения ExtendedExecutionReason.SavingData, когда приложение находится в состоянии Suspending (Приостановка), создает условия для возникновения потенциальной проблемы, о которой вам следует знать. Если расширенный сеанс выполнения запрашивается, когда приложение находится в состоянии Suspending (Приостановка) и пользователь запрашивает повторный запуск приложения, запуск может занять много времени. Это обусловлено тем, что время расширенного сеанса выполнения должно истечь до того, как старый экземпляр приложения сможет быть закрыт, чтобы можно было запустить новый. Сохранение пользовательской среды обеспечивается за счет продления времени запуска приложения.
Запрос, ликвидация и отзыв
Существует три основных способа взаимодействия с расширенным сеансом выполнения: запрос, ликвидация и отзыв. Процесс создания запроса смоделирован в следующем примере кода.
Запрос
var newSession = new ExtendedExecutionSession(); newSession.Reason = ExtendedExecutionReason.Unspecified; newSession.Revoked += SessionRevoked; ExtendedExecutionResult result = await newSession.RequestExtensionAsync(); switch (result)
При вызове метода RequestExtensionAsync выполняется проверка операционной системы на предмет того, подтвердил ли пользователь работу приложения в фоновом режиме, а также достаточно ли в системе ресурсов для активации выполнения приложения в фоновом режиме. Только один сеанс будет одобрен для приложения в любой момент времени, из-за чего поступление последующих вызовов к RequestExtensionAsync будет приводить к отклонению сеанса.
Вы можете проверить класс BackgroundExecutionManager заранее, чтобы узнать значение перечисления BackgroundAccessStatus, задаваемое пользователем и указывающее на то, может ли приложение выполняться в фоновом режиме. Дополнительные сведения об этих пользовательских параметрах см. в разделе Фоновые процессы и электропитание.
Перечисление ExtendedExecutionReason указывает на процесс, который ваше приложение выполняет в фоновом режиме. Строка Description (Описание) — это строка в читаемом формате, содержащая объяснение того, почему вашему приложению требуется выполнить конкретный процесс. Эта строка не отображается для пользователя, но может стать доступна в будущих выпусках Windows. Чтобы обеспечить корректную остановку расширенного сеанса выполнения, когда пользователь или система решат прекратить работу приложения в фоновом режиме, необходимо использовать обработчик событий отзыва Revoked.
Отменен
Если приложение запущено в расширенном сеансе выполнения, а системе необходимо остановить фоновый процесс из-за того, что приложению переднего плана требуются ресурсы, то этот сеанс отзывается. Расширенный сеанс выполнения прерывается только после запуска обработчика событий Revoked (Отзыв).
После запуска события Revoked (Отзыв) для расширенного сеанса выполнения ExtendedExecutionReason.SavingData у приложения есть одна секунда на то, чтобы завершить выполняемый процесс и приостановку — Suspending.
Отзыв может возникать по многим причинам: по достижении временного предела выполнения, квоты электроэнергии, выделенной для работы фонового процесса, либо когда требуется высвободить память, чтобы пользователь смог запустить новое приложение в фоновом режиме.
Ниже приведен пример обработчика событий Revoked (Отзыв):
private async void SessionRevoked(object sender, ExtendedExecutionRevokedEventArgs args) < await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => < switch (args.Reason) < case ExtendedExecutionRevokedReason.Resumed: rootPage.NotifyUser("Extended execution revoked due to returning to foreground.", NotifyType.StatusMessage); break; case ExtendedExecutionRevokedReason.SystemPolicy: rootPage.NotifyUser("Extended execution revoked due to system policy.", NotifyType.StatusMessage); break; >EndExtendedExecution(); >); >
Dispose
Последний шаг — это ликвидация расширенного сеанса выполнения. Сеансы, а также любые другие потребляющие память ресурсы, необходимо ликвидировать, чтобы электроэнергия, используемая приложением во время ожидания закрытия сеанса, не шла в зачет квоты на электроэнергию для работы самого приложения. С целью сохранения как можно большего объема квоты на электроэнергию для приложения, необходимо ликвидировать сеанс, когда работа с ним завершена, чтобы приложение смогло быстрее перейти в состояние Suspended (Приостановка).
Самостоятельная ликвидация сеанса, а не ожидание возникновения события отзыва позволяет снизить интенсивность использования квоты на электроэнергию для вашего приложения. Это значит, что ваше приложение сможет выполняться в фоновом режиме дольше во время следующих сеансов, так как у вас будет больший объем квоты на электроэнергию. Чтобы можно было вызвать метод Dispose (Ликвидация) для объекта ExtendedExecutionSession, на него должна быть установлена ссылка до завершения процесса.
Фрагмент кода, который ликвидирует расширенный сеанс выполнения.
void ClearExtendedExecution(ExtendedExecutionSession session) < if (session != null) < session.Revoked -= SessionRevoked; session.Dispose(); session = null; >>
Для одного приложения одновременно может быть запущен только один расширенный сеанс выполнения класса ExtendedExecutionSession. Многие приложения используют асинхронные задачи для выполнения сложных процессов, которым требуется доступ к таким ресурсам, как память, сеть или сетевые службы. Если для выполнения процесса требуется несколько асинхронных задач, необходимо учитывать состояние каждой из этих задач, перед тем как ликвидировать сеанс ExtendedExecutionSession и приостановить приложение. Для этого необходимо установить ссылку для подсчета количества задач, которые все еще выполняются, и не ликвидировать сеанс, пока это значение не достигнет нуля.
Ниже приведен пример кода, осуществляющий управление несколькими задачами в ходе работы расширенного сеанса выполнения. Дополнительные сведения о том, как использовать эту возможность в вашем приложении, см. в примере кода по ссылке ниже.
static class ExtendedExecutionHelper < private static ExtendedExecutionSession session = null; private static int taskCount = 0; public static bool IsRunning < get < if (session != null) < return true; >else < return false; >> > public static async Task RequestSessionAsync(ExtendedExecutionReason reason, TypedEventHandler revoked, String description) < // The previous Extended Execution must be closed before a new one can be requested. ClearSession(); var newSession = new ExtendedExecutionSession(); newSession.Reason = reason; newSession.Description = description; newSession.Revoked += SessionRevoked; // Add a revoked handler provided by the app in order to clean up an operation that had to be halted prematurely if(revoked != null) < newSession.Revoked += revoked; >ExtendedExecutionResult result = await newSession.RequestExtensionAsync(); switch (result) < case ExtendedExecutionResult.Allowed: session = newSession; break; default: case ExtendedExecutionResult.Denied: newSession.Dispose(); break; >return result; > public static void ClearSession() < if (session != null) < session.Dispose(); session = null; >taskCount = 0; > public static Deferral GetExecutionDeferral() < if (session == null) < throw new InvalidOperationException("No extended execution session is active"); >taskCount++; return new Deferral(OnTaskCompleted); > private static void OnTaskCompleted() < if (taskCount >0) < taskCount--; >//If there are no more running tasks than end the extended lifetime by clearing the session if (taskCount == 0 && session != null) < ClearSession(); >> private static void SessionRevoked(object sender, ExtendedExecutionRevokedEventArgs args) < //The session has been prematurely revoked due to system constraints, ensure the session is disposed if (session != null) < session.Dispose(); session = null; >taskCount = 0; > >
Проверка использования ресурсов приложением
Настройка использования памяти и электроэнергии вашим приложением является важным шагом для обеспечения того, что операционная система будет разрешать вашему приложению выполняться, когда оно больше не будет работать на переднем плане. Используйте API-интерфейсы управления памятью, чтобы узнать, сколько памяти потребляет ваше приложение. Чем больше памяти потребляет ваше приложение, тем сложнее операционной системе поддерживать его выполнение, когда другое приложение работает на переднем плане. Пользователь полностью контролирует все фоновые действия, которые может выполнять ваше приложение, и видит, как ваше приложение влияет на расход заряда батареи.
Используйте метод BackgroundExecutionManager.RequestAccessAsync, чтобы определить, принял ли пользователь решение ограничить фоновую активность вашего приложения. Следите за расходом заряда батареи и запускайте приложения в фоновом режиме только тогда, когда необходимо завершить интересующее пользователя действие.
Оптимизация времени приостановки и возобновления работы
Создайте приложения универсальная платформа Windows (UWP), которые упрощают использование системы времени существования процесса для эффективного возобновления после приостановки или завершения работы.
Launch
При повторной активации приложения после приостановки или завершения проверка, чтобы узнать, истекло ли длительное время. Если да, попробуйте вернуться на главную целевую страницу приложения вместо отображения устаревших данных пользователя. Это также приведет к более быстрому запуску.
Во время активации всегда проверка значение PreviousExecutionState параметра args (например, для запущенных активаций проверка LaunchActivatedEventArgs.PreviousExecutionState). Если значение имеет значение ClosedByUser или NotRunning, не тратьте время на восстановление ранее сохраненного состояния. В этом случае правильно, чтобы обеспечить свежий опыт — и это приведет к более быстрому запуску.
Вместо того, чтобы с нетерпением восстановить ранее сохраненное состояние, рассмотрите возможность отслеживания этого состояния и только восстановления по требованию. Например, рассмотрим ситуацию, когда приложение было приостановлено, сохранено состояние на 3 страницы и затем было завершено. При повторном запуске, если вы решите вернуть пользователя на 3-ю страницу, не восстанавливайте состояние для первых 2 страниц. Вместо этого удерживайте на этом состоянии и используйте его только после того, как вы знаете, что вам нужно.
Во время выполнения
Рекомендуется не ждать события приостановки, а затем сохранять большое количество состояний. Вместо этого приложение должно постепенно сохранять меньшее количество состояния при запуске. Это особенно важно для крупных приложений, которые подвержены риску истечения времени во время приостановки, если они пытаются сохранить все одновременно.
Однако необходимо найти хороший баланс между добавочным сохранением и производительностью приложения во время выполнения. Хороший компромисс заключается в том, чтобы постепенно отслеживать измененные данные (и поэтому необходимо сохранить) и использовать событие приостановки для фактического сохранения этих данных (что быстрее, чем сохранение всех данных или изучение всего состояния приложения, чтобы решить, что сохранить).
Не используйте события «Активировано» или «Видимость» для выбора состояния сохранения. Когда пользователь переключается с вашего приложения, окно деактивируется, но система ожидает короткое время (около 10 секунд) перед приостановкой приложения. Это позволяет повысить скорость реагирования, если пользователь быстро переключается на приложение. Дождитесь события приостановки перед выполнением логики приостановки.
Приостановить
Во время приостановки уменьшите объем памяти приложения. Если приложение использует меньше памяти во время приостановки, общая система будет более адаптивной и меньше приостановленных приложений (включая ваши) будет прекращена. Однако сбалансируйте это с необходимостью возобновления snappy: не сокращайте объем памяти, что возобновление значительно замедляется, пока ваше приложение перезагрузит много данных в память.
Для управляемых приложений система будет выполнять передачу сборки мусора после завершения обработчиков приостановки приложения. Не забудьте воспользоваться этим путем выпуска ссылок на объекты, которые помогут уменьшить объем памяти приложения во время приостановки.
В идеале приложение завершится с логикой приостановки менее чем за 1 секунду. Чем быстрее вы можете приостановить работу, тем лучше — это приведет к тому, что пользовательская работа с оснастки для других приложений и частей системы. Если необходимо, логика приостановки может занять до 5 секунд на настольных устройствах или 10 секунд на мобильных устройствах. Если превышено это время, приложение будет внезапно завершено. Вы не хотите, чтобы это произошло, потому что, если это делается, когда пользователь переключается на приложение, будет запущен новый процесс, и интерфейс будет чувствовать себя гораздо медленнее по сравнению с возобновлением приостановленного приложения.
Возобновить
Большинство приложений не должны делать ничего особенного при возобновлении, поэтому обычно вы не будете обрабатывать это событие. Некоторые приложения используют возобновление для восстановления подключений, которые были закрыты во время приостановки, или для обновления данных, которые могут быть устаревшими. Вместо того, чтобы выполнять эту работу с нетерпением, создайте приложение, чтобы инициировать эти действия по требованию. Это приведет к более быстрому работе, когда пользователь переключается на приостановленное приложение и гарантирует, что вы выполняете только работу, которую пользователь действительно нуждается.
Избегайте ненужного завершения
Система времени существования процесса UWP может приостановить или завершить приложение по различным причинам. Этот процесс предназначен для быстрого возвращения приложения в состояние, в которое оно было выполнено до приостановки или завершения работы. Когда все готово, пользователь не будет знать, что приложение когда-либо остановлено. Ниже приведены некоторые рекомендации, которые приложение UWP может использовать для упрощения системных переходов в течение всего времени существования приложения.
Приложение может быть приостановлено, когда пользователь перемещает его в фон или когда система входит в состояние низкой мощности. Когда приложение приостановлено, оно вызывает событие приостановки и имеет до 5 секунд, чтобы сохранить свои данные. Если обработчик событий приостановки приложения не завершается в течение 5 секунд, система предполагает, что приложение перестало отвечать и завершает его. Завершаемое приложение снова проходит через длительный процесс запуска, а не сразу загружается в память, когда пользователь переключается на него.
Сериализация только при необходимости
Многие приложения сериализуют все свои данные при приостановке. Если вам нужно хранить только небольшой объем данных параметров приложения, то вместо сериализации данных следует использовать локальное хранилище Параметры вместо сериализации данных. Используйте сериализацию для больших объемов данных и для данных, отличных от параметров.
При сериализации данных следует избегать повторной инициализации, если она не изменилась. Требуется дополнительное время для сериализации и сохранения данных, а также дополнительное время для чтения и десериализации его при повторной активации приложения. Вместо этого мы рекомендуем приложению определить, изменилось ли его состояние, а если да, сериализация и десериализация только измененных данных. Хороший способ убедиться, что это происходит, заключается в периодической сериализации данных в фоновом режиме после внесения изменений. При использовании этого метода все, что необходимо сериализовать при приостановке, уже сохранено, чтобы не было никаких действий, и приложение приостанавливается быстро.
Сериализация данных в C# и Visual Basic
DataContractSerializer упрощает сериализацию пользовательских классов, хотя он менее эффективен в плане производительности, чем класс XmlSerializer. Если вам нужна более высокая производительность, рассмотрите возможность переключения. Как правило, не следует загружать более одного сериализатора, и следует предпочесть XmlSerializer , если вам не нужны функции другого сериализатора.
Уменьшение объема памяти
Система пытается сохранить максимальное количество приостановленных приложений в памяти, чтобы пользователи могли быстро и надежно переключаться между ними. Когда приложение приостановлено и остается в памяти системы, оно может быстро быть доставлено на передний план для взаимодействия пользователя без необходимости отображать экран-заставку или выполнять длинную операцию загрузки. Если недостаточно ресурсов для хранения приложения в памяти, приложение завершается. Это делает управление памятью важной по двум причинам:
- Освобождение как можно больше памяти при приостановке сводит к минимуму вероятность завершения приложения из-за нехватки ресурсов во время приостановки.
- Сокращение общего объема памяти, используемой приложением, снижает вероятность завершения работы других приложений во время приостановки.
Выпуск ресурсов
Некоторые объекты, такие как файлы и устройства, занимают большое количество памяти. Мы рекомендуем во время приостановки обрабатывать выпуск приложения для этих объектов и повторно создавать их при необходимости. Это также хорошее время для очистки любых кэшей, которые не будут допустимыми при возобновлении работы приложения. Дополнительный шаг платформы XAML выполняется от вашего имени для приложений C# и Visual Basic — сборка мусора, если это необходимо. Это гарантирует, что все объекты больше не ссылаются в коде приложения.
Быстрое возобновление
Приостановленное приложение можно возобновить, когда пользователь перемещает его на передний план или когда система выходит из состояния низкой мощности. Когда приложение возобновляется из приостановленного состояния, оно продолжается от места его приостановки. Данные приложения не теряются, так как он был сохранен в памяти, даже если приложение было приостановлено в течение длительного периода времени.
Большинству приложений не нужно обрабатывать событие возобновления . Когда приложение возобновляется, переменные и объекты имеют точно то же состояние, что и при приостановке приложения. Обработка события возобновления только в том случае, если необходимо обновить данные или объекты, которые могли бы измениться между временем приостановки приложения, и когда оно было возобновлено, например содержимое (например, данные канала обновления), сетевые подключения, которые могли устареть, или если необходимо повторно получить доступ к устройству (например, веб-камера).
См. также
Этот процесс приостановлен для повышения производительности системы
Как отключить приложения UWP, работающие в фоновом режиме в Windows 10
В Windows 10 многие приложения работают в фоновом режиме, синхронизируют уведомления и выполняют обновления. Однако вы можете заблокировать его. Посмотрите, как отключить приложения, запущенные в фоновом режиме в Windows 10.
В Windows 10 вы найдете множество приложений, установленных по умолчанию, которые могут выполняться в фоновом режиме. Все приложения UWP (Universal Windows Platform), которые одновременно загружаются из Windows 10 Store, а также те, у которых есть новый интерфейс, имеют возможность запускаться в фоновом режиме. Это можно использовать, например, для обновления приложений или для проверки уведомлений. Приложения такого типа могут также собирать, например, статистические данные и отправлять их в Microsoft.
К счастью, как пользователь вы полностью контролируете, какие приложения работают в фоновом режиме. Вы можете отключить фоновое действие выбранных приложений или полностью заблокировать фоновое действие приложения UWP. Это позволит сэкономить аккумулятор (если у вас есть ноутбук) и сбросить систему.
Отключение приложений UWP, работающих в фоновом режиме в Windows 10
Соответствующий параметр можно найти в системных настройках. Для этого откройте меню «Пуск», затем щелкните значок шестеренки, чтобы ввести настройки.
В настройках выберите вкладку «Конфиденциальность». Появится список доступных параметров, связанных с защитой данных. В боковом меню слева перейдите к следующей вкладке с именем «Приложения в фоновом режиме».
Здесь вы можете найти список всех приложений, которые могут выполняться в фоновом режиме. Как я уже упоминал, это, конечно, приложения типа UWP, то есть системные приложения из Windows 10 или приложения, загруженные из хранилища Windows 10. Вы не найдете классические программы, такие как Windows 7.
В списке вы можете снять отметку с приложений, которые должны быть заблокированы для фоновой активности. Помните, однако, что если вы блокируете активность в фоновом режиме, он не будет получать никаких уведомлений и выполнять какие-либо операции. Например, если вы заблокируете приложение электронной почты, вы не получите уведомление о новом письме, пока вы не начнете это приложение самостоятельно.
Если вы хотите отключить сразу все приложения, работающие в фоновом режиме, достаточно переключить главный слайдер «Разрешить запуск приложений в фоновом режиме» в положение «выключено». Тогда никакое приложение UWP не будет разрешено работать в фоновом режиме.
Что это LockApp.exe в Windows 10
Процесс LockApp.exe напрямую относится к экрану блокировки Windows 10. По умолчанию можно его обнаружить в диспетчере задач. Этот процесс UWP приостановлен для повышения производительности. Он полностью безопасен и отвечает за отображение интересных изображений и фактов на загрузочном экране.
Эта статья подробнее расскажет, что это такое LockApp.exe в Windows 10. При необходимости экран блокировки можно полностью отключить. Процесс уже не будет отображаться в диспетчере задач. Вопрос, только стоит ли его отключать? Поскольку сейчас он стал действительно полезным для пользователей.
Что такое LockApp.exe
В разделе диспетчера задач можно найти процесс Экран блокировки Windows по умолчанию > LockApp.exe. Файл экрана блокировки располагается в папке: C:\ Windows\ SystemApps\ Microsoft.LockApp_cw5n1h2txyewy.
LockApp.exe — это универсальное UWP приложение, которое отвечает за отображение красивых и уникальных изображений на экране блокировки & входа. Дополнительно показываются интересные факты о месте на картинке, календарь и много другого.
Вчера был, а сейчас нет в списке процессов LockApp.exe? Для блокировки системы нажмите сочетание клавиш Win+L. Разблокируйте устройство и посмотрите, что отображается в диспетчере задач. Будет приостановлено процесс LockApp.exe.
Как отключить LockApp.exe
Можно с уверенностью отключить процесс LockApp.exe (снять задачу) особенно если он уже приостановлен. При необходимости он будет опять задействован. Например, Вам нужно заблокировать компьютер, чтобы отойти от рабочего места.
Откройте редактор реестра выполнив команду regedit в окне Win+R. Перейдите в расположение: HKEY_LOCAL_MACHINE\ SOFTWARE\ Microsoft\ Windows\ CurrentVersion\ Authentication\ LogonUI\ SessionData.
Найдите параметр AllowLockScreen и его значение измените на 0. Можно и другими способами попробовать убрать экран блокировки в Windows 10. После перезагрузки компьютера он не будет отображаться.
Application Lifecycle в приложениях Windows 8.1 и UWP
В приложениях Windows Store жизненный цикл довольно похож на картинку. Он довольно простой и содержит всего 3 состояния: NotRunning – Running – Suspended
Для себя я мысленно отождествляю его с «Не копать – Копать – Перекур». Опытные работяги знают, что с перекура к работе можно уже не вернуться. Опытные разработчики сохраняют состояние приложения при событии Suspending и возвращают его впоследствии в исходное состояние при возобновлении работы приложения.
В приложениях Windows UWP (Windows 10) все точно так же, но появились новые фичи.
Давайте сначала разберем общее для 8.1 и UWP. На следующей схеме отображен жизненный цикл приложения. Также на ней показано как называются переходы между состояниями.
Немного с другой стороны жизненный процесс приложения показан на следующем рисунке:
Из состояния Suspended приложение может перейти в состояние Running или же в случае, если системе необходимы ресурсы, то работа приложения может быть завершена.
Состояния всего 3, хотя перечисление состояний ApplicationExecutionState содержит в себе больше членов: NotRunning, Running, Suspended, Terminated, ClosedByUser.
Последние 2 члена перечисления помогут нам при активации приложения получить информацию о том как приложение было завершено с помощью аргумента IActivatedEventArgs.PreviousExecutionState события OnActivated или же события OnLaunched. Если приложение работает на десктопе, то в режим Suspended оно переходит после того как пользователь сворачивает приложение. В режиме планшета приложение приостанавливается после переключения на другое приложение (в 8 и 8.1 перед приостановкой проходит несколько секунд, в 10-ке все происходит гораздо быстрее).
Вот такая вот чехарда может происходить за время, начиная с запуска и заканчивая завершением приложения:
Как вы можете догадаться исходя из этой картинки у приложения есть максимум 5 секунд, чтобы завершить свою работу перед переходом в состояние Suspended. Если вы пользуетесь Windows 10, то в диспетчере задач на закладке «Подробности» можете увидеть список процессов, а также приложений, которые на данный момент находятся в состоянии «Приостановлено», т.е. Suspended. В Windows 8.1 информацию о состоянии приложения тоже можно найти в диспетчере задач.
Для того чтобы протестировать код Suspending и Resuming можно отобразить панель с переходами в режимы работы приложения. Для этого необходимо в меню «Вид» — «Панели инструментов» выбрать «Место отладки». И тогда с помощью вот такой панели мы сможем вызвать необходимое событие жизненного цикла.
Давайте разберем, как в коде C# сохранить состояние приложения. Сначала после инициализации приложения добавим обработчик события (метод с верной сигнатурой).
Сам метод сохранения данных выглядит так:
Обратите внимание, что код метода содержит deferral, который чем то немного подобен транзакции. Если ОС потребуется завершить работу приложения, то она будет ожидать выполнения всего кода, заключенного между объявлением deferral и его завершением. Но помните что у вас всего 5 секунд на сохранение данных.
Аналогично событию Suspending есть событие Resuming. С помощью его можно отловить событие восстановления работы приложения из состояния Suspended. Но обратите внимание, что событие Resuming произойдет только если приложение восстановлено. Если оно запущено заново, то это событие выполнено не будет, поэтому в зависимости от потребностей можно добавлять в код обработку событий OnLaunched или OnActivated (со всеми его вариациями – OnFileActivated, OnSearchActivated и т.п.).
Если использовать OnLaunched или OnActivated, то можно проверить какое было прошлое состояние приложения:
Все, что было сейчас написано подходит и для приложений Windows 8.1 и для приложений Windows UWP.
Теперь о том какая фича добавилась в 10-ке. Примерно вот такая схема актуальна для UWP:
Как вы можете заметить, добавилась возможность продлить процесс перехода в состояние Suspended. Как правило ненадолго, но даже пара секунд в таких случаях играет роль. В случае, если приложение находится в состоянии Extended Execution и операционная система хочет освободить ресурсы, завершив работу приложения – срабатывает Revoke – это возможность что-то сделать до того как работа приложения будет прервана. На выполнение Revoke вам дается не больше секунды. Зачем нужен Revoke если он такой короткий? Типичный пример сохранить где-либо флаг и при следующем запуске предупредить пользователя, что не все последние данные были удачно сохранены при приостановке приложения.
Кстати, если про Extended Execution уже было сказано и не раз, то некоторые тонкости почти не упоминались. Я попробовал разобраться и рассказать о них вам.
Extended Execution может быть использовано для достижения двух целей. Первая это продлить процесс сохранения настроек при событии Suspending, а вторая это использование в определенном типе приложений, у которых выполнение при Extended Execution может продолжаться бесконечно. Это например приложения, отслеживающие текущую локацию, воспроизводящие аудио или же VOIP приложения. В таком случае выполнение приложения будет чем-то подобно на background task. Оно будет происходит в фоне и не будет иметь доступ к UI. При Extended Execution необходимо обязательно указать причину по которой выполнение приложения должно быть продолжено. Это может быть ExtendedExecutionReason.LocationTracking или SavingData или Unspecified.
Продлить процесс сохранения настроек при приостановке работы приложения можно во время самого события Suspending.
Этот способ позволяет нам продлить процесс «засыпания» приложения для того чтобы сохранить все требуемые данные.
Второй способ позволяет нам продлить выполнение кода приложения, внеся код заранее специальным запросом (не в OnSuspending). Желательно выполнять запрос как можно раньше, например в событии OnNavigatedTo() или в Loaded().
Этот способ немного похож на background task, так как при нем приложение работает долго, если не сказать всегда. Это как раз способ для приложений с отслеживанием геолокации и подобных. Таких приложений одновременно в системе может выполняться ограниченное количество, так что при регистрации Extended Execution возможен отказ.
Довольно хороший пример я нашел здесь: The new background features in Windows 10 Разобрался с ним, опробовал, и сейчас расскажу вам.
Для того чтобы работать с геолокацией нам нужно будет в манифесте приложения на закладке «Возможности» поставить галочку напротив пункта «Расположение». После этого начнем с того, что в MainPage добавим ссылки на пространства имен:
После чего добавим переменную в область видимости класса:
В XAML файл в самый первый тэг Page добавляем Loaded=«Page_Loaded». И далее в коде метода Page_Loaded:
Здесь мы инициализируем ExtendedExecutionSession и запрашиваем разрешение на выполнение продления жизни приложения. В зависимости от того разрешено нам или нет мы записываем в настройки значение 1 или 0. После, во время работы приложения мы сможем таким образом определить разрешено ли выполнение в фоне или нет. Это сделано исключительно для примера. В реальном рабочем приложении логирование реализовать можно каким-либо другим способом.
Далее мы создаем объект типа Geolocator и событию PositionChanged назначаем метод Locator_PositionChanged, которое произойдет если текущее расположение изменится как минимум на 100 метров. В этом методе реализуем отображение toast уведомления:
Не забывайте о том, что в выполнении Extended Execution может быть отказано. Это делается для того чтобы у устройства была возможность найти грань между энергосбережением, высокой производительностью и функционалом работающим в фоновом режиме.
После выключения на телефоне режима экономии заряда и запрета выполнения в фоновом режиме большинству приложений (дабы пул не был занят), смог протестировать приложение в действии.
Эта группа процессов uwp используется для приостановки процессов в целях повышения производительности систему
Всем привет! Как можно отключить этот процесс? Ибо из за него, живая плитка в windows 10 перестала обновятся..
Голосование за лучший ответ
Удалить приложения, руками править службы в реестре
Похожие вопросы
Ваш браузер устарел
Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.