- Windows 10 开发教程
- Windows 10 - 家庭版
- Windows 10 - 简介
- Windows 10 – UWP
- Windows 10 – 第一个应用
- Windows 10 - 应用商店
- Windows 10 - XAML 控件
- Windows 10 - 数据绑定
- Windows 10 - XAML 性能
- Windows 10 - 自适应设计
- Windows 10 - 自适应 UI
- Windows 10 - 自适应代码
- Windows 10 - 文件管理
- Windows 10 - SQLite 数据库
- Windows 10 – 通信
- Windows 10 - 应用本地化
- Windows 10 - 应用生命周期
- Windows 10 - 后台执行
- Windows 10 - 应用服务
- Windows 10 - Web 平台
- Windows 10 - 连接体验
- Windows 10 - 导航
- Windows 10 - 网络
- Windows 10 - 云服务
- Windows 10 - 实时磁贴
- Windows 10 - 共享契约
- Windows 10 - 移植到 Windows
- Windows 10 有用资源
- Windows 10 - 快速指南
- Windows 10 - 有用资源
- Windows 10 - 讨论
Windows 10 开发 - 后台执行
通用 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 文件中添加一个按钮。
<Page
x:Class = "UWPBackgroundDemo.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local = "using:UWPBackgroundDemo"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d">
<Grid Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Button x:Name = "button" Content = "Button"
HorizontalAlignment = "Left" Margin = "159,288,0,0"
VerticalAlignment = "Top" Click = "button_Click"/>
</Grid>
</Page>
以下是 **按钮点击** 事件的实现,其中注册了后台任务。
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 {
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
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),并为该项目命名为 **Background stuff**。
以下是 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 stuff 项目,然后构建并执行 **UWPBackgroundDemo** 项目。
当以上代码编译并执行时,您将看到以下窗口。
当您单击 **按钮** 时,它将运行后台任务,并在窗口的右侧显示通知。