Запуск фоновой задачи в приложении

Узнайте, как использовать ApplicationTrigger для активации фоновой задачи в приложении.

Пример создания триггера приложения см. в этом примере.

В этом разделе предполагается, что есть фоновая задача, которая требуется активировать из вашего приложения. Если у вас еще нет в фоновом режиме, это пример фоновой задачи в BackgroundActivity.cs. Или выполните действия, описанные в Создание и регистрация out-of-process фоновую задачу создать ее.

Зачем использовать триггер приложения

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

Создание триггера приложения

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

// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
_AppTrigger = new ApplicationTrigger();
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
Windows::ApplicationModel::Background::ApplicationTrigger _AppTrigger;
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
ApplicationTrigger ^ _AppTrigger = ref new ApplicationTrigger();

Добавление условия (необязательно)

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

В этом примере для условия задано значение InternetAvailable , чтобы после активации задача выполнялась только после получения доступа к Интернету. Список возможных условий см. в статье SystemConditionType.

SystemCondition internetCondition = new SystemCondition(SystemConditionType.InternetAvailable);
Windows::ApplicationModel::Background::SystemCondition internetCondition{
    Windows::ApplicationModel::Background::SystemConditionType::InternetAvailable };
SystemCondition ^ internetCondition = ref new SystemCondition(SystemConditionType::InternetAvailable)

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

Вызов RequestAccessAsync()

Перед регистрацией ApplicationTrigger фоновой задачи, вызовите RequestAccessAsync для определения уровня фоновой активности позволяет пользователю, так как пользователь отключил фоновой активности для вашего приложения. В разделе оптимизировать фоновой активности Дополнительные сведения о том, как пользователи могут управлять параметрами для фоновой активности.

var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
   // Depending on the value of requestStatus, provide an appropriate response
   // such as notifying the user which functionality won't work as expected
}

Регистрация фоновой задачи

Зарегистрируйте фоновую задачу, вызвав функцию регистрации фоновой задачи. Дополнительные сведения о регистрации фоновых задач, а также просмотреть определение RegisterBackgroundTask() метод в примере кода ниже в разделе регистрация фоновой задачи.

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

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example application trigger";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example application trigger" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example application trigger";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);

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

Вызвать фоновую задачу

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

Запустите фоновую задачу, вызвав метод ApplicationTrigger.RequestAsync. Любой ApplicationTrigger экземпляр будет выполнять.

Обратите внимание, что ApplicationTrigger.RequestAsync невозможно вызвать из фоновой задачи сам или когда приложение находится в фоновом режиме, в рабочее состояние (см. жизненный цикл приложения Дополнительные сведения о состояниях приложения). Он может возвращать DisabledByPolicy Если пользователь установил энергии или конфиденциальности политики, которые препятствуют приложение выполнение фоновой активности. Кроме того одновременно может выполняться только один AppTrigger. Если при попытке выполнить AppTrigger, пока другой уже выполняется, функция вернет CurrentlyRunning.

var result = await _AppTrigger.RequestAsync();

Управление ресурсами для фоновой задачи

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

  • Память: Настройка использования памяти и энергию ваше приложение является ключом к гарантируя, что операционная система будет разрешать запуск фоновой задачи. Используйте API-интерфейсы управления памятью, чтобы узнать, сколько памяти потребляет ваше фоновое задание. Чем больше памяти потребляет ваше фоновое задание, тем сложнее операционной системе поддерживать его выполнение, когда другое приложение работает на переднем плане. Пользователь полностью контролирует все фоновые действия, которые может выполнять ваше приложение, и видит, как ваше приложение влияет на расход заряда батареи.
  • Время ЦП: Фоновые задачи ограничены физическим временем использования, которое они получают в зависимости от типа триггера. Фоновые задачи, инициируемые триггер приложения ограничены около 10 минут.

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

Комментарии

Начиная c Windows 10, пользователю больше не потребуется добавлять приложения на экран блокировки, чтобы использовать фоновые задачи.

Фоновая задача будет запускаться только с помощью ApplicationTrigger, если сначала вызвано RequestAccessAsync.