添加后台任务是开发app,必需的功能。比如动态磁贴就需要后台任务的支持。但是怎么添加后台任务?添加后台任务后为什么不触发?还是有小伙伴遇到这样的问题。所以写下了这篇文章,记录如何快速简单的添加后台任务。

一、新建解决方案

1、新建windows通用项目,命名为“BackgroundTaskDemo”

2、在解决方案资源管理器,右键解决方案,选择”添加“-”新建项目“,新建windows运行时组件。命名为”BackgroundTasks“,应用内所有的后台任务都写在这里面。

3、删掉默认的class1.cs,新建一个类,命名为“ToastBackgroundTask”

二、配置后台任务

1、在”BackgroundTaskDemo”中,打开“Package.appxmanifest”,按下图设置。

三、写后台事件的类

1、由于很多方法在windows运行组件里是不能写的,所以这里单独新建一个类库项目。

2、新建一个类,命名为”ToastBackgroundTaskHelper“,这里是做了一个Toast通知。代码如下:(需要安装Nuget:”Microsoft.Toolkit.Uwp.Notifications“)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using Microsoft.Toolkit.Uwp.Notifications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Notifications;

namespace BackgroundTaskShare
{
public class ToastBackgroundTaskHelper
{

public static void PopToast()
{
// Generate the toast notification content and pop the toast
ToastContent content = GenerateToastContent();
ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(content.GetXml()));
}

public static ToastContent GenerateToastContent()
{
return new ToastContent()
{
Launch = "action=viewEvent&eventId=1983",
Scenario = ToastScenario.Reminder,

Visual = new ToastVisual()
{
BindingGeneric = new ToastBindingGeneric()
{
Children =
{
new AdaptiveText()
{
Text = "Adaptive Tiles Meeting"
},

new AdaptiveText()
{
Text = "Conf Room 2001 / Building 135"
},

new AdaptiveText()
{
Text = "10:00 AM - 10:30 AM"
}
}
}
},

Actions = new ToastActionsCustom()
{
Inputs =
{
new ToastSelectionBox("snoozeTime")
{
DefaultSelectionBoxItemId = "15",
Items =
{
new ToastSelectionBoxItem("1", "1 minute"),
new ToastSelectionBoxItem("15", "15 minutes"),
new ToastSelectionBoxItem("60", "1 hour"),
new ToastSelectionBoxItem("240", "4 hours"),
new ToastSelectionBoxItem("1440", "1 day")
}
}
},

Buttons =
{
new ToastButtonSnooze()
{
SelectionBoxId = "snoozeTime"
},

new ToastButtonDismiss()
}
}
};
}

}
}

四、处理 ToastBackgroundTask

1、要调用 ToastBackgroundTaskHelper 里面的方法,首先需要在BackgroundTasks中添加对BackgroundTaskShare的引用。

2、处理ToastBackgroundTask.cs,代码如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using Microsoft.Toolkit.Uwp.Notifications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.ApplicationModel.Background;

namespace BackgroundTasks
{
// 记得要加sealed
public sealed class ToastBackgroundTask:IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
var defferral = taskInstance.GetDeferral();
// 这里写你的后台操作,操作耗时如果超过5秒就失败了,有异步操作的记得加async
BackgroundTaskShare.ToastBackgroundTaskHelper.PopToast();

defferral.Complete();
}



}
}

五、注册和取消后台任务

1、首先在BackgroundTaskDemo中添加对“BackgroundTasks”的引用。

2、在 BackgroundTaskDemo中安装Nuget:“Microsoft.Toolkit.Uwp”,使用如下方法进行注册和取消后台任务。

1
2
3
4
5
// 注册 
BackgroundTaskRegistration registered = BackgroundTaskHelper.Register(typeof(BackgroundTasks.ToastBackgroundTask),new TimeTrigger(15, false), false, true, new SystemCondition(SystemConditionType.InternetAvailable));

// 取消
BackgroundTaskHelper.Unregister(typeof(BackgroundTasks.ToastBackgroundTask));

上面设置为在有网络的情况下每15分钟触发一次后台任务。

六、调试后台任务

1、运行Demo后注册后台任务,稍等一会儿,点开VS的生命周期事件,就可以看到ToastBackgroundTask。需要调试的话就可以在 ToastBackgroundTask 中设置断点。

2、点击后就会立刻运行后台任务,结果如下。说明代码是没有问题的。

这样子就大功告成了。需要的可以下载Demo。

七、Demo下载

BackgroundTaskDemoDownload