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


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

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

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

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

Почему используйте триггер приложения

Используйте 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 минут.

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

Замечания

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

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