【Win10开发】Toast通知——后台激活
前篇文章我们写了关于Toast的前台激活,那么接下来就讲一讲它的后台激活。当通知出现时并不会出现app的界面,但是app能在后台获取到通知中的信息。
关于xaml和Toast通知架构我们在这里就不再赘述了,请参考前两篇博客。然后我们就来创建通知实例。
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
ToastNotification notification = new ToastNotification(doc); //创建通知
DateTime statTime = DateTime.Now.AddSeconds(); //指定应传递 Toast 通知的时间
ScheduledToastNotification recurringToast = new ScheduledToastNotification(doc, statTime); //创建计划的 Toast 通知对象
ToastNotificationManager.CreateToastNotifier().AddToSchedule(recurringToast); //向计划中添加 Toast 通知
我们为通知做一个计划,使其在5秒后再进行通知。
接下来我们需要创建一个后台任务,我们先创建一个类库,将其命名为Background,这里需要注意下,这个类库的输出类型必须选择Windows运行时组件才不会爆,感谢Edi.Wang,我也是看到他的博客才知道的。

我们接着创建BackgroundTask类,并在类中写以下代码。
public sealed class BackgroundTask : IBackgroundTask
{
public async void Run(IBackgroundTaskInstance taskInstance)
{
var deferral = taskInstance.GetDeferral();
ToastNotificationActionTriggerDetail details = taskInstance.TriggerDetails as ToastNotificationActionTriggerDetail;
if (details != null)
{
// 是否选择“确定”
string arg = details.Argument;
if (arg == "ok")
{
// 获取数据
string value = details.UserInput["name"] as string;
// 保存数据
StorageFolder local = ApplicationData.Current.LocalFolder;
JsonObject jsonObj = new JsonObject();
jsonObj.SetNamedValue("name", JsonValue.CreateStringValue(value));
StorageFile dataFile = await local.CreateFileAsync("data.json", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(dataFile, jsonObj.Stringify(), Windows.Storage.Streams.UnicodeEncoding.Utf8);
}
}
deferral.Complete();
}
}
BackgroundTask继承IBackgroundTask接口并实现,注意 ,后台任务类本身和后台任务项目中的所有其他类都需要是处于 sealed 状态的 public 类。Run方法是一个入口点,当触发指定事件时,将调用该入口点,每个后台任务都需要该方法。接下来的工作就简单了,我们将Toast获取到的值保存到一个Json文件中,当下次启动app时读取这个文件。
那么既然要用到后台任务,那么我们就需要在应用清单里面申明一下。首先打开Package.appxmanifest,切到“申明“选项卡,添加后台任务,属性里面勾选“常规”。


入口点EntryPoint属性与注册后台任务时的入口点相同 (namespace.classname)。
当然我们还可以手动添加这些信息。在application节点下添加以下代码。
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="Background.BackgroundTask">
<BackgroundTasks>
<Task Type="general" />
</BackgroundTasks>
</Extension>
</Extensions>
好的,接下来就是后台任务的注册。我们将注册封装为一个方法。
public static async Task<BackgroundTaskRegistration> RegisterBackgroundTask(Type taskEntryPoint,string taskName,IBackgroundTrigger trigger)
{
var status = await BackgroundExecutionManager.RequestAccessAsync();
if (status == BackgroundAccessStatus.Unspecified || status == BackgroundAccessStatus.Denied)
{
return null;
} foreach (var cur in BackgroundTaskRegistration.AllTasks)
{
if (cur.Value.Name == taskName)
{
cur.Value.Unregister(true);
}
} var builder = new BackgroundTaskBuilder
{
Name = taskName,
TaskEntryPoint = taskEntryPoint.FullName
}; builder.SetTrigger(trigger); BackgroundTaskRegistration task = builder.Register(); return task;
}
接下来就可以注册了。
private async Task RegisterBackgroundTask()
{
var task = await RegisterBackgroundTask(
typeof(Background.BackgroundTask),
"BackgroundTask",
new ToastNotificationActionTrigger()
);
}
后台任务基本完成。接下来,只要在app下次启动时读取那个json文件就行。
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
try
{
// 读入后台保存的内容
StorageFolder local = ApplicationData.Current.LocalFolder;
StorageFile dataFile = await local.GetFileAsync("data.json");
if (dataFile == null) return; string jsstr = await FileIO.ReadTextAsync(dataFile, Windows.Storage.Streams.UnicodeEncoding.Utf8); JsonObject jsobj = null;
if (JsonObject.TryParse(jsstr, out jsobj))
{
string s = jsobj.GetNamedString("name");
ShowText($"您的姓名是:{s}");
}
await dataFile.DeleteAsync();
}
catch (Exception ex)
{
Debug.WriteLine($"文件读取异常:{ex.Message},异常类型:{ex.GetType().Name}。");
}
}
public void ShowText(string msg)
{
getInfo.Text = msg;
}
至此,这个小demo就完成了。 : )
最后,当然是看看效果喽。。。
启动app。点击通知,关闭app。等待5秒后出现通知。


接下来输入信息,点击确定。
再次打开app时,我们可以看到app里面已经出现了Toast通知的信息了。

【Win10开发】Toast通知——后台激活的更多相关文章
- 【Win10开发】Toast通知——前台激活
上篇文章我们将了大体的Toast通知的模板及实例展示,那么,这篇文章就来讲讲Toast的前台激活. 首先是xaml界面,很简单,我们放一个Button和TextBlock,TextBlock用来显示T ...
- 【WIN10】Toast 通知
DEMO下載:http://yunpan.cn/cFSLZQf5ePeTV 访问密码 1fce 1.顯示通知 使用xml確定通知內容. string xml = "<toast la ...
- 【Win 10 应用开发】Toast通知激活应用——前台&后台
老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...
- WP8.1学习系列(第二章)——Toast通知
Toast 通知概述(Windows 运行时应用) 你的应用要想通过 Toast 通知通信,必须在应用的清单文件中声明它支持 Toast.Toast 通知可包含文本,并且 Windows 上的 Toa ...
- Windows10自适应和交互式toast通知[1]
阅读目录: 概述 toast通知的结构 视觉区域(Visual) 行为(Actions) 特定场景下的Toast通知 带多内容的通知 带行为的通知(例子1) 带行为的通知(例子2) 带文本输入框和行为 ...
- Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构
分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...
- 【Win10 应用开发】自适应Toast通知的XML文档结构
老规矩,在开始之前老周先讲个故事. 话说公元2015年7月20日,VS 2015发布.于是,肯定有人会问老周了,C#6有啥新特性,我学不来啊.学不来的话你应该检讨.老周比较保守地计算一下,学会C# 6 ...
- 【Win10开发】Toast通知
Toast 通知是一种发送给用户的暂时消息,包含相关的.具有时效性的信息,并且提供对应用中相关内容的快速访问.它可显示你是在另一个应用中.在“开始”屏幕上.在锁屏上,还是在桌面上.Toast 应该被视 ...
- Toast通知
win10 app 开发中Toast通知的模板只有一种,统一为 ToastGeneric 通用型通知,本文我们来讲讲 Toast 的 XML文档相关知识. 在以前8.1时候的Toast通知方式,到了W ...
随机推荐
- Java NIO2:缓冲区
什么是缓冲区 一个缓冲区对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索.缓冲区像前篇文章讨论的那样被写满和释放,对于每个非布尔原始数据类型都有一个缓 ...
- ASP.Net WebForm温故知新学习笔记:一、aspx与服务器控件探秘
开篇:毫无疑问,ASP.Net WebForm是微软推出的一个跨时代的Web开发模式,它将WinForm开发模式的快捷便利的优点移植到了Web开发上,我们只要学会三步:拖控件→设属性→绑事件,便可以行 ...
- [开源]C#二维码生成解析工具,可添加自定义Logo
二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字 ...
- MySQL MVCC(多版本并发控制)
概述 为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间(undolog),当事务提交之后将重做日志写入磁盘(前提innodb_flush_log_at_trx_commit ...
- Module Zero安装
返回<Module Zero学习目录> 使用模板创建(自动方式) 手动安装 核心(领域)层 基础设施层 展示层 这里需要抱歉的是,这里使用的博客园的Markdown语法,代码显示不是很好看 ...
- Hystrix框架2--超时
timeout 在调用第三方服务时有些情况需要对服务响应时间进行把控,当超时的情况下进行fallback的处理 下面来看下超时的案例 public class CommandTimeout exten ...
- KnockoutJS 3.X API 第六章 组件(2) 组件注册
要使Knockout能够加载和实例化组件,必须使用ko.components.register注册它们,从而提供如此处所述的配置. 注意:作为替代,可以实现一个自定义组件加载器(自定义加载器下一节介绍 ...
- myeclipse转到函数定义的方法去
转到函数的定义CTRl+鼠标左击 myeclipse自动补全的快捷键 alt+/
- Android 裁剪图片为圆形图片
转自http://blog.csdn.net/kkmike999/article/details/16359713 /** * 转换图片成圆形 * * @param bitmap * 传入Bitmap ...
- 深入理解闭包系列第三篇——IIFE
× 目录 [1]实现 [2]用途 前面的话 严格来讲,IIFE并不是闭包,因为它并不满足函数成为闭包的三个条件.但一般地,人们认为IIFE就是闭包,毕竟闭包有多个定义.本文将详细介绍IIFE的实现和用 ...