在应用程序清单中声明后台任务

重要的 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. 更改任务类型属性列表,以指示用于此后台任务的任务注册类型。 如果后台任务注册了多个触发器类型,请为每个触发器类型添加其他 Task 元素和 Type 属性。

    请注意 ,请确保列出所使用的每个触发器类型,或者后台任务不会向未声明的触发器类型注册( Register 方法将失败并引发异常)。

    此代码片段示例指示使用系统事件触发器和推送通知:

<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.BackgroundTaskClass">
    <BackgroundTasks>
        <Task Type="systemEvent" />
        <Task Type="pushNotification" />
    </BackgroundTasks>
</Extension>

添加多个后台任务扩展

对应用注册的每个附加后台任务类重复步骤 2。

以下示例是后台任务示例中的完整 Application 元素。 这显示了使用总共 3 个触发器类型的 2 个后台任务类。 复制此示例的“扩展”部分,并根据需要对其进行修改,以在应用程序清单中声明后台任务。

<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 在每次触发新触发器时,在新进程中运行后台进程,该进程获取其自己的资源限制(内存、cpu)。

在前台应用程序所在的同一进程中运行

下面是声明在前台应用程序所在的同一进程中运行的后台任务的 XML 示例 XML。

<Extensions>
    <Extension Category="windows.backgroundTasks" EntryPoint="ExecModelTestBackgroundTasks.ApplicationTriggerTask">
        <BackgroundTasks>
            <Task Type="systemEvent" />
        </BackgroundTasks>
    </Extension>
</Extensions>

指定 EntryPoint 时,应用程序会在触发触发器时收到对指定方法的回调。 如果你没有指定 EntryPoint,应用程序将通过 OnBackgroundActivated() 接收回调。 有关详细信息,请参阅 “创建并注册进程内后台任务 ”。

指定后台任务使用 ResourceGroup 属性运行的位置。

下面是声明在BackgroundTaskHost.exe进程中运行的后台任务的后台任务的示例 XML,但在与同一应用中后台任务的其他实例不同的实例中运行。 请注意属性 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 属性触发触发器时,在新进程中运行

此示例声明在每次触发新触发器时在其自己的资源限制(内存和 CPU)的新进程中运行的后台任务。 SupportsMultipleInstances请注意,使用此功能可启用此行为。 若要使用此属性,必须面向 SDK 版本“10.0.15063”(Windows 10 创意者更新)或更高版本。

<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>

注意

不能指定 ResourceGroupServerNameSupportsMultipleInstances.