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


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

Основные 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 для каждого из них.

    Примечание Обязательно перечислите все используемые вами типы триггеров, в противном случае фоновая задача не будет зарегистрирована с незадекларированными типами триггеров (метод регистрации не выполнится и вызовет исключение).

    В этом примере фрагмента кода указывается использование триггеров системных событий и 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.