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


Объявление фоновых задач в манифесте приложения

Важные 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>
  1. Измените атрибут EntryPoint на ту же строку, которая используется кодом в качестве точки входа при регистрации фоновой задачи (namespace.classname).

    В этом примере точка входа — ExampleBackgroundTaskNameSpace.ExampleBackgroundTaskClassName:

<Extensions>
    <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ExampleBackgroundTaskClassName">
       <BackgroundTasks>
         <Task Type="" />
       </BackgroundTasks>
    </Extension>
</Extensions>
  1. Измените список атрибута типа задачи, чтобы указать тип регистрации задач, используемый для этой фоновой задачи. Если фоновая задача зарегистрирована с несколькими типами триггеров, добавьте дополнительные элементы задачи и атрибуты 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.