Windows Phone 8.1中的Toast通知

来源:互联网 发布:mysql定时执行sql语句 编辑:程序博客网 时间:2024/06/16 22:21

之前也有一篇关于通知的,不过那是锁屏通知,博客链接: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 详解


1 0
原创粉丝点击