在应用程序清单中声明后台任务
重要的 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>
更改 EntryPoint 属性以让你的代码使用的字符串与注册后台任务时的入口点相同 (namespace.classname)。
在此示例中,入口点为 ExampleBackgroundTaskNameSpace.ExampleBackgroundTaskClassName:
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ExampleBackgroundTaskClassName">
<BackgroundTasks>
<Task Type="" />
</BackgroundTasks>
</Extension>
</Extensions>
更改 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
一起指定 ResourceGroup
或 ServerName
。
相关主题
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈