在应用程序清单中声明后台任务
重要的 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 属性。
请注意 ,请确保列出所使用的每个触发器类型,或者后台任务不会向未声明的触发器类型注册( 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>
注意
不能指定 ResourceGroup
或 ServerName
与 SupportsMultipleInstances
.