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

重要的应用程序接口(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 元素。 这表明可以使用 2 个后台任务类和总共 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 示例 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>

注释

不能在使用ResourceGroup时指定ServerNameSupportsMultipleInstances