之前也有一篇关于通知的,不过那是锁屏通知,博客链接:Windows Phone 8.1锁屏通知 关键词-----badge
Toast通知概述:Toast 通知概述(Windows 运行时应用)
ToastT通知呢就是指弹出通知,爪机的时候(无论你正在使用另外一个应用还是就是在开始界面上)会时不时在屏幕顶
端弹出来应用的通知,提醒你去玩它或者有新的消息通更新。简单来说就是应用跟用户的通信,让你去点开这个应
用,目的就达到了。
当然在Windows的应用商店应用上也是有的,Windows的Toast通知显示在屏幕右上角。为了人性化考虑,可以在应用
中给出用户是否需要Toast通知的开关选择。
弹出方式很像Popup弹出的效果,对于Popup相关认识,我的另一篇博客有作介绍:Windows Phone 8.1中的Popup
通知作为体验的一部分,当应用不是活动的前台的应用时才显示出来,要不然就显得不伦不类了。
在Toast通知出现的时候当然也是伴随着声音提示的,包含文本和图像。
引用微软的一句解释即是:
引发 Toast 通知在本质上与发送磁贴通知相同:为特定模板创建一个 XML 负载,将该负载传递给一个管理器对象以
进行显示。Toast 通知在视觉上与磁贴明显不同,但标记结构几乎相同。
所以喽,我们可以在这个XML中定义要显示的内容。
Toast通知分为两种:
一个停留时间短(7秒,我试了下,感觉没有7秒这么长)-----标准Toast,
一个停留时间长(25秒,这个就不支持,就更不用说了)----持续期较长的Toast
注意Windows Phone 8.1不支持持续时间长的Toast
之前说了,Toast有一个XML模板负载,当然微软也给我们提供了许多XML模板,每个模板具有不同的内容和布局。
但是运用到WP8.1的时候,不管我们用什么模板,他都会呈现出ToastText02 的已修改版本的样式:没有图像,带有
两个文本字符串(在同一行,第一个字符串为粗体)以及应用的方形 150×150 徽标.所以在WP8.1中Toast通知选择
图像是没有意义的
具体见链接:
Toast 通知模板的完整列表及说明: Toast 模板目录(Windows 运行时应用)
Toast音频模板:Toast 音频选项目录(Windows 运行时应用)
Toast通知元素定义:Toast 架构
下面给出ToastText02的XML模板结构:
<toast>
<visual>
<binding template="ToastText02">
<text id="1">headlineText</text>
<text id="2">bodyText</text>
</binding>
</visual>
</toast>
音频XML结构:
<audio src="ms-winsoundevent:Notification.Mail" loop="false"/>
可以看出,ToastText02的模板中本不存在audio的标签,这时候如果你要Toast通知有声音,就必须将audio加到
ToastText02的XML树结构中,注意audio标签的父标签直接是toast标签!
当然音频可以只播放一次,也可以循环播放(?!貌似不可以)具体如下:
非循环播放的声音:
以下声音仅播放一次且不重复。将 loop 属性设置为 false。如上给出的音频XML结构
1.Notification.Default
在下列情况下播放的声音:
被显式指定时,没有指定其他音频选项时,指定了无效的音频选项时,没有其他音频选项适合你的方案时
2.Notification.IM
应用场景:收到一条新的即时消息通知。
3.Notification.Mail
方案:收到一封新的电子邮件。
4.Notification.Reminder
方案:一个日历项到期。
5.Notification.SMS
方案:收到一条新的文本消息。
循环播放的声音-----但是经测试,好像不是那回事,压根没循环播放,WP8.1应该是不支持的,详见代码
以下声音可以有选择地循环播放,直到通知被解决。
注意:循环播放音频需要将 audio 元素的父 toast 元素中的 duration 属性设置为“long”。
如果在 Toast 模板中已指定循环播放音频但来源无效或未指定,则将使用 Notification.Looping.Call 声音
XML结构:
<toast duration="long">
......
<audio src="ms-winsoundevent:Notification.Looping.Call");audio.setAttribute("loop", "true");" loop="true"/>
</toast>
1.Notification.Looping.Alarm/...2/3/4/5/6/7/8/9/10
方案:倒计时秒表已到 0
2.Notification.Looping.Call/...2/3/4/5/6/7/8/9/10
方案:收到一个来电
不播放声音
若要发送 Toast 通知,且在抵达时不播放声音,则必须照此来将 audio 元素中的 silent 属性设置为“true”。
audio 元素是必需的,不能简单地省略。
XML结构:
<audio silent="true"/>
好了,终于可以贴上伪代码吧,XAML部分啥都不用写,直接在.cs中写即可
为了效果明显,我设置了计时器让它每隔8秒重复推送通知。当然前提是弄清楚,你会发现当我们挂起我们写的应用
的时候或者直接杀死它的时候,推送就停止了,所以说这种静态的推送通知意义不大,大部分的通知需求都是必须结
合后台任务来完成的
(这个也很好理解,当我们不玩狂野飙车的时候,有时候它就会突然蹦出来一个Toast通知,提醒我们去玩一玩,试想
我们都没打开它,它怎么能推送通知呢,其实这个跟它的后台任务是关联着的)
具体要认识后台任务的话,我的博客中也有介绍到:Windows Phone 8.1后台任务
还有就是大家自己可以试试,发现其实设置循环播放Toast通知音频是无效的。貌似WP8.1是不支持的,想来也意义不
大,反而会招致用户反感,声音提醒一次便也足够了,如果不停的重复提醒声,那不得烦死。
当然,忘了说了,一切的前提还要建立在应用允许你这么做,也就是说允许Toast通知推送,要在程序的清单文件
中,在应用程序选项卡下面的支持Toast通知一栏选择 是 即可
伪代码:
相关核心类的官方解释
ToastNotificationManager类:ToastNotificationManager Class
public MainPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0,0,8);
timer.Tick += ToastNoticeSend;
timer.Start();
}
public void ToastNoticeSend(object sender, object e)
{
ToastTemplateType template = ToastTemplateType.ToastText02;
XmlDocument xdoc = ToastNotificationManager.GetTemplateContent(template);
//文本
XmlNodeList xnodelist = xdoc.GetElementsByTagName("text");
xnodelist[0].AppendChild(xdoc.CreateTextNode("看!"));
xnodelist[1].AppendChild(xdoc.CreateTextNode("这就是Toast通知!"));
//音频,可以看出ToastText02模板中没有音频标签audio,所以我们要自己添加
//非循环播放
//IXmlNode ixnode = xdoc.SelectSingleNode("/toast");
//XmlElement audio = xdoc.CreateElement("audio");
//audio.SetAttribute("src", "ms-winsoundevent:Notification.IM");
//ixnode.AppendChild(audio);
//循环播放------全然无用,那就应该在WP8.1中不支持Toast通知音频循环播放
//IXmlNode ixnode = xdoc.SelectSingleNode("/toast");
//XmlElement toast = (XmlElement)xdoc.SelectSingleNode("toast");
//toast.SetAttribute("duration", "long");
//XmlElement audio = xdoc.CreateElement("audio");
//audio.SetAttribute("src", "ms-winsoundevent:Notification.Looping.Call");
//audio.SetAttribute("loop", "true");
//ixnode.AppendChild(audio);
//不播放音频
//就算把以下这段删掉,不设置audio标签,Toast通知也会有默认声音的,所以就解释了为什么一定要设置
IXmlNode ixnode = xdoc.SelectSingleNode("/toast");
XmlElement audio = xdoc.CreateElement("audio");
audio.SetAttribute("silent", "true");
ixnode.AppendChild(audio);
//创建Toast通知并且发送通知
ToastNotification notification = new ToastNotification(xdoc);
ToastNotificationManager.CreateToastNotifier().Show(notification);
}
运行截图:
大家自己可以试试,其实也可以自定义通知的。甚至你可以不用他的模板自己写,或者用Popup写个类通知也是可以
的。
実に おもしろい
推荐链接:(这样可以一下子学Toast,Tile,Badge,对应的是Toast通知,磁贴通知,锁屏通知)
重新想象 Windows 8 Store Apps (34) - 通知: Toast Demo, Tile Demo, Badge Demo
重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解