Объявление фоновых задач в манифесте приложения
Важные API
Включите использование фоновых задач, объявив их как расширения в манифесте приложения.
Внимание
Эта статья связана с внепроцессными фоновыми задачами. Фоновые задачи процесса не объявляются в манифесте.
Фоновые задачи вне процесса должны быть объявлены в манифесте приложения или в противном виде приложение не сможет зарегистрировать их (исключение будет создано). Кроме того, фоновые задачи вне процесса должны быть объявлены в манифесте приложения для передачи сертификации.
В этом разделе предполагается, что вы создали один или несколько классов фоновых задач, и что приложение регистрирует каждую фоновую задачу для выполнения в ответ на по крайней мере один триггер.
Добавление расширений вручную
Откройте манифест приложения (Package.appxmanifest) и перейдите к элементу Application. Создайте элемент Extensions (если он еще не существует).
Следующий фрагмент кода взят из примера фоновой задачи:
<Application Id="App"
...
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.SampleBackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
<Task Type="timer" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ServicingComplete">
<BackgroundTasks>
<Task Type="systemEvent"/>
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
Добавление расширения фоновой задачи
Объявите первую фоновую задачу.
Скопируйте этот код в элемент Extensions (вы добавите атрибуты на следующих шагах).
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="">
<BackgroundTasks>
<Task Type="" />
</BackgroundTasks>
</Extension>
</Extensions>
Измените атрибут EntryPoint на ту же строку, которая используется кодом в качестве точки входа при регистрации фоновой задачи (namespace.classname).
В этом примере точка входа — ExampleBackgroundTaskNameSpace.ExampleBackgroundTaskClassName:
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ExampleBackgroundTaskClassName">
<BackgroundTasks>
<Task Type="" />
</BackgroundTasks>
</Extension>
</Extensions>
Измените список атрибута типа задачи, чтобы указать тип регистрации задач, используемый для этой фоновой задачи. Если фоновая задача зарегистрирована с несколькими типами триггеров, добавьте дополнительные элементы задачи и атрибуты type для каждого из них.
Обратите внимание , что убедитесь, что каждый из типов триггеров, которые вы используете, или фоновая задача не будет регистрироваться с типами необъявленных триггеров ( метод Register завершится ошибкой и вызовет исключение).
В этом примере фрагмента кода указывается использование триггеров системных событий и push-уведомлений:
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.BackgroundTaskClass">
<BackgroundTasks>
<Task Type="systemEvent" />
<Task Type="pushNotification" />
</BackgroundTasks>
</Extension>
Добавление нескольких расширений фоновых задач
Повторите шаг 2 для каждого дополнительного фонового класса задач, зарегистрированного приложением.
В следующем примере показан полный элемент Application из примера фоновой задачи. В этом примере показано использование 2 фоновых классов задач в общей сложности 3 типа триггеров. Скопируйте раздел extensions этого примера и измените его по мере необходимости, чтобы объявить фоновые задачи в манифесте приложения.
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="BackgroundTask.App">
<uap:VisualElements
DisplayName="BackgroundTask"
Square150x150Logo="Assets\StoreLogo-sdk.png"
Square44x44Logo="Assets\SmallTile-sdk.png"
Description="BackgroundTask"
BackgroundColor="#00b2f0">
<uap:LockScreen Notification="badgeAndTileText" BadgeLogo="Assets\smalltile-Windows-sdk.png" />
<uap:SplashScreen Image="Assets\Splash-sdk.png" />
<uap:DefaultTile DefaultSize="square150x150Logo" Wide310x150Logo="Assets\tile-sdk.png" >
<uap:ShowNameOnTiles>
<uap:ShowOn Tile="square150x150Logo" />
<uap:ShowOn Tile="wide310x150Logo" />
</uap:ShowNameOnTiles>
</uap:DefaultTile>
</uap:VisualElements>
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.SampleBackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
<Task Type="timer" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ServicingComplete">
<BackgroundTasks>
<Task Type="systemEvent"/>
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
</Applications>
Объявление того, где будет выполняться фоновая задача
Вы можете указать, где выполняются фоновые задачи:
- По умолчанию они выполняются в процессе BackgroundTaskHost.exe.
- В том же процессе, что и приложение переднего плана.
- Используется
ResourceGroup
для размещения нескольких фоновых задач в одном процессе размещения или разделения их на разные процессы. - Используется
SupportsMultipleInstances
для запуска фонового процесса в новом процессе, который получает собственные ограничения ресурсов (память, ЦП) при каждом запуске нового триггера.
Выполнение в том же процессе, что и приложение переднего плана
Ниже приведен пример XML, который объявляет фоновую задачу, которая выполняется в том же процессе, что и приложение переднего плана.
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="ExecModelTestBackgroundTasks.ApplicationTriggerTask">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
</Extensions>
При указании EntryPoint приложение получает обратный вызов к указанному методу при срабатывании триггера. Если не указать EntryPoint, приложение получает обратный вызов через OnBackgroundActivated(). Дополнительные сведения см. в статье "Создание и регистрация фоновой задачи в процессе".
Укажите, где выполняется фоновая задача с атрибутом ResourceGroup.
Ниже приведен пример XML, который объявляет фоновую задачу, которая выполняется в процессе BackgroundTaskHost.exe, но в отдельном экземпляре фоновых задач из того же приложения. Обратите внимание на атрибут, определяющий ResourceGroup
, какие фоновые задачи будут выполняться вместе.
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.SessionConnectedTriggerTask" ResourceGroup="foo">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.TimeZoneTriggerTask" ResourceGroup="foo">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.TimerTriggerTask" ResourceGroup="bar">
<BackgroundTasks>
<Task Type="timer" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.ApplicationTriggerTask" ResourceGroup="bar">
<BackgroundTasks>
<Task Type="general" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.MaintenanceTriggerTask" ResourceGroup="foobar">
<BackgroundTasks>
<Task Type="general" />
</BackgroundTasks>
</Extension>
</Extensions>
Выполнение в новом процессе при каждом срабатывании триггера с помощью атрибута SupportsMultipleInstances
В этом примере объявляется фоновая задача, которая выполняется в новом процессе, который получает собственные ограничения ресурсов (память и ЦП) при каждом запуске нового триггера. Обратите внимание на использование SupportsMultipleInstances
этого поведения. Чтобы использовать этот атрибут, необходимо использовать целевой пакет SDK версии 10.0.15063 (Windows 10 Creators Update) или более поздней.
<Package
xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4"
...
<Applications>
<Application ...>
...
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.TimerTriggerTask">
<BackgroundTasks uap4:SupportsMultipleInstances="true">
<Task Type="timer" />
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
</Applications>
Примечание.
Невозможно указать ResourceGroup
или ServerName
в сочетании с SupportsMultipleInstances
.