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

重要的 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 属性列表以指示该后台任务所使用的任务注册类型。 如果后台任务注册了多个触发器类型,需要为每个触发器类型添加附加的 Task 元素和 Type 属性。

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

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

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

添加多个后台任务扩展

对你的应用注册的每个额外的后台任务类重复步骤 2。

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

<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 声明了在前台应用程序所处的同一进程中运行的后台任务。

<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 属性触发新触发器时,在新进程中运行

此示例声明在新进程中运行的后台任务,每次触发新触发器时,该进程会获取自己的资源限制(内存和 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>

注意

不能与 SupportsMultipleInstances 一起指定 ResourceGroupServerName