📅  最后修改于: 2020-11-18 10:11:49             🧑  作者: Mango
通用Windows平台(UWP)引入了新的机制,这些机制使应用程序可以在应用程序不在前台运行时执行某些功能。 UWP还提高了应用程序在后台为后台任务和触发器延长执行时间的能力。后台执行是应用程序生命周期的真正补充。
后台任务的重要功能是-
后台任务是由系统或时间事件触发的,并且可能受一个或多个条件的约束。
触发后台任务时,其关联的处理程序将运行并执行后台任务的工作。
即使注册了后台任务的应用程序被挂起,后台任务也可以运行。
它们是标准应用程序平台的一部分,本质上为应用程序提供了注册系统事件(触发)的功能。当该事件发生时,它们将在后台运行预定义的代码块。系统触发器包括事件,例如网络连接或系统时区的变化。
不能保证后台执行,因此它不适用于关键功能。
操作系统对于可以同时运行多少个后台任务有一个限制。因此,即使触发触发器并满足条件,任务仍无法运行。
创建一个后台任务类,并注册它以在您的应用程序不在前台时运行。您可以通过编写实现IBackgroundTask接口的类在后台运行代码。以下示例代码显示了后台任务类的非常基本的起点。
public sealed class MyBackgroundTask : IBackgroundTask {
public void Run(IBackgroundTaskInstance taskInstance){
// write code
}
}
您可以请求访问后台任务,如下所示。
var access = await BackgroundExecutionManager.RequestAccessAsync();
switch (access) {
case BackgroundAccessStatus.Unspecified:
break;
case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity:
break;
case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity:
break;
case BackgroundAccessStatus.Denied:
break;
default:
break;
}
要构建和注册后台任务,请使用以下代码。
var task = new BackgroundTaskBuilder {
Name = "My Task",
TaskEntryPoint = typeof(BackgroundStuff.MyBackgroundTask).ToString()
};
var trigger = new ApplicationTrigger();
task.SetTrigger(trigger);
task.Register();
await trigger.RequestAsync();
通过执行以下所有给定步骤,让我们了解一个后台任务的简单示例。
创建一个新的空白UWP项目“ UWPBackgroundDemo”,然后在XAML文件中添加一个按钮。
下面给出的是其中注册了后台任务的按钮单击事件实现。
using System;
using Windows.ApplicationModel.Background;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
// The Blank Page item template is documented at
http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace UWPBackgroundDemo {
///
/// An empty page that can be used on its own or navigated to within a Frame.
///
public sealed partial class MainPage : Page {
public MainPage() {
this.InitializeComponent();
}
private async void button_Click(object sender, RoutedEventArgs e) {
var access = await BackgroundExecutionManager.RequestAccessAsync();
switch (access){
case BackgroundAccessStatus.Unspecified:
break;
case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity:
break;
case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity:
break;
case BackgroundAccessStatus.Denied:
break;
default:
break;
}
var task = new BackgroundTaskBuilder {
Name = "My Task",
TaskEntryPoint = typeof(BackgroundStuff.MyBackgroundTask).ToString()
};
var trigger = new ApplicationTrigger();
task.SetTrigger(trigger);
var condition = new SystemCondition(SystemConditionType.InternetAvailable);
task.Register();
await trigger.RequestAsync();
}
}
}
现在创建另一个项目,但是这次从菜单中选择“ Windows运行时组件”(通用Windows),并将名称“背景材料”命名为该项目。
下面给出的是C#代码。其中包含MyBackgroundTask类植入,它将运行后台任务。
using Windows.ApplicationModel.Background;
using Windows.UI.Notifications;
namespace BackgroundStuff {
public sealed class MyBackgroundTask : IBackgroundTask {
public void Run(IBackgroundTaskInstance taskInstance) {
SendToast("Hi this is background Task");
}
public static void SendToast(string message) {
var template = ToastTemplateType.ToastText01;
var xml = ToastNotificationManager.GetTemplateContent(template);
var elements = xml.GetElementsByTagName("Test");
var text = xml.CreateTextNode(message);
elements[0].AppendChild(text);
var toast = new ToastNotification(xml);
ToastNotificationManager.CreateToastNotifier().Show(toast);
}
}
}
要使该项目在UWPBackgroundDemo项目中可访问,请在解决方案资源管理器中右键单击“引用”>“添加引用” ,然后添加BackgroundStuff项目。
现在,让我们转到UWPBackgroundDemo项目的Package.appxmanifest文件,并在“声明”选项卡中添加以下信息。
首先构建Background填充项目,然后构建并执行UWPBackgroundDemo项目。
编译并执行上述代码后,您将看到以下窗口。
当您单击按钮时,它将运行后台任务,并在窗口的右端显示一个通知。