Объявление фоновых задач в манифесте приложения
Важные 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 элемента Task, указав в нем тип регистрации задач, используемый с этой фоновой задачей. Если фоновая задача зарегистрирована с несколькими типами триггеров, добавьте дополнительные элементы Task и атрибуты Type для каждого из них.
Примечание Обязательно перечислите все типы триггеров, которые вы используете, иначе фоновая задача не будет регистрироваться с необъявленными типами триггеров (метод Register завершится ошибкой и вызовет исключение).
Этот пример фрагмента показывает использование триггеров системных событий и push-уведомлений:
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.BackgroundTaskClass">
<BackgroundTasks>
<Task Type="systemEvent" />
<Task Type="pushNotification" />
</BackgroundTasks>
</Extension>
Добавление нескольких расширений фоновой задачи
Повторите этап 2 для каждого дополнительного класса фоновой задачи, регистрируемого вашим приложением.
В следующем примере демонстрируется полный элемент Application из образца фоновой задачи. Здесь показано использование двух классов фоновых задач с тремя типами триггеров. Чтобы объявить фоновые задачи в манифесте вашего приложения, скопируйте раздел 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
.
Связанные темы
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по