Toast 通知概述(Windows 运行时应用)

  

  你的应用要想通过 Toast 通知通信,必须在应用的清单文件中声明它支持 Toast。Toast 通知可包含文本,并且 Windows 上的 Toast 通知可包含图像,但不支持辅助操作(例如按钮)。Toast 还可在显示时播放系统定义的声音。在 Windows 上,Toast 通知显示在屏幕的右上角(对于从右到左 (RTL) 的语言,显示在左上角)。在 Windows Phone 8.1 上,Toast 通知显示在屏幕顶部。Toast 通知可由用户激活、取消或忽略。当用户点击或单击通知时,关联的应用将启动,用户可以得到与通知内容相关的结果视图。它是一个应用在另一个应用中中断用户的唯一机制。Toast 专为与锁屏提醒、磁贴通知及应用中 UI 结合使用而设计,旨在让用户即时了解你应用中的相关事件或项目。

  引发 Toast 通知在本质上与发送磁贴通知相同:为特定模板创建一个 XML 负载,将该负载传递给一个管理器对象以进行显示。Toast 通知在视觉上与磁贴明显不同,但标记结构几乎相同。

  有两种类型的 Toast 通知:

  • 标准 toast:多数开发人员都应使用标准 toast 通知。Toast 在出现时会播放一小段声音来提醒用户,并在屏幕上停留 7 秒。标准 Toast 最适合用于 IM 联系人登录或社交媒体更新等通知。
  • 持续期较长的 Toast:此通知的外观与标准 Toast 相同,但会在屏幕上停留 25 秒,你还可以选择让其播放较长的循环音频。当连接的另一端有人在等待而需要吸引用户注意力时,可以使用此类 Toast。此类 Toast 适用于个人到个人的通信(如即时消息和 VOIP 呼叫)。此类 Toast 也可用于日历提醒。

      Windows Phone 8.1 不支持持续时间很长的 Toast。

  

  计划和定期 Toast 通知

Toast 通知可计划为在特定的时间显示。可将此功能用于闹钟、日历提醒和依赖于准确时间的通知。这些通知不依赖于应用的状态或计算机的网络连接。

计划 Toast 也可在短期内显示多次,以提高用户看到它的机会。例如,你可能希望显示一个重要会议提醒 3 次,每次间隔 5 分钟。计划 Toast 通知指定 Windows 应该引发该 Toast 通知的日期和时间。对于定期计划 Toast 通知,指定的时间是 Windows 第一次显示通知的时间。

  

使用 Toast 模板

  Toast 通知基于一组 Windows 提供的 XML 模板,每个模板具有不同的内容和布局。它们可包含一个图像、文本或同时包含二者。使用这些模板,应用能够在它们的通知中维护想要的 Windows 外观。模板为可在一个通知中指定的必要 XML 图像和文本元素提供了一个框架。

    你可以向 Windows Phone 8.1 发送任何 Toast 模板,但它会呈现为 ToastText02 的已修改版本。有关详细信息,请查看 Toast 模板目录

  尽管磁贴和 Toast 通知在定义上具有很多相似性,但 Toast 通知还具有可在显示通知时播放的声音。

  

  Toast 通知的元素在 Toast 架构 中定义。

  有关可用 Toast 通知模板的完整列表及每个模板的说明,请参阅选择 Toast 模板

发送 Toast 通知

 
注意  在此快速入门中,你将直接通过 XML 文档对象模型 (DOM) 操作通知内容。

说明

1. 添加命名空间声明

Windows.UI.Notifications 包含 Toast API。

using Windows.UI.Notifications;
using Windows.Data.Xml.Dom;

2. 为 Toast 选取一个模板并检索其 XML 内容

  从系统提供的模板目录中,选择一个适合你的内容的需求的模板。有关完整的模板列表,请参阅ToastTemplateType 枚举。请注意,你发送的每个单独的通知都可以使用一个不同的模板。

 Windows Phone 8.1 上仅支持 toastText02 模板的一个变体。它可接受两个文本字符串(第一个字符串以粗体文本呈现),但是它们位于同一行上,因此应该仅使用一个短字符串或两个非常短的字符串以避免串联。

  此示例(适用于 Windows)使用 ToastImageAndText01 模板,该模板需要一个图像和一个文本字符串。示例如下所示:

  

  

ToastTemplateType toastTemplate = ToastTemplateType.ToastImageAndText01;
XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);

  GetTemplateContent 方法返回一个 XmlDocument。上面的代码检索以下 XML 框架,你将在后续步骤中通过标准文档对象模型 (DOM) 函数提供该内容的详细信息:

<toast>
<visual>
<binding template="ToastImageAndText01">
<image id="1" src=""/>
<text id="1"></text>
</binding>
</visual>
</toast>

3. 为通知提供文本内容

该示例首先检索模板中标记名称为“text”的所有元素。ToastImageAndText01 模板只包含一个代码分配的文本字符串。该字符串最多可包含三行自动换行的字符串,因此应该相应地设置该字符串的长度以避免被截断。  

XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
toastTextElements[].AppendChild(toastXml.CreateTextNode("Hello World!"));

5. 可选:指定 Toast 持续时间

  你可以选择为 Toast 设置显示持续时间。有两个值:“short”(默认值)和“long”。仅当你的通知属于来电或约会提醒之类的情形时,才使用“long”。有关详细信息,请参阅 Toast 通知概述

   Windows Phone 8.1 上不支持不同的持续时间;所有 Toast 的持续时间都相同。如果将此属性包含在手机 Toast 通知中,则会将其忽略。

注意  默认的持续时间是“short”,因此添加此属性只是为了将持续时间设置为“long”。

IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
((XmlElement)toastNode).SetAttribute("duration", "long");

6. 可选:指定 Toast 音频

  默认情况下,Windows 在显示 Toast 时播放一个较短的声音。你可以选择指定系统提供的声音集中的不同的声音,也可以不指定任何声音。有关详细信息,请参阅 Toast 音频选项目录

  通过 getTemplateContent 检索的模板不包含 audio 元素,因此你必须定义该元素并将其添加到 XML 负载。使用“ms-winsoundevent:”前缀指定声音文件。该示例创建一个 audio 元素并选择将成为其父元素的 toast 元素。

IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
XmlElement audio = toastXml.CreateElement("audio");
//指定非默认的声音。
audio.SetAttribute("src", "ms-winsoundevent:Notification.IM");
//指定不应该播放任何声音。
audio.SetAttribute("silent", "true");
//时间
((XmlElement)toastNode).SetAttribute("duration", "long");
audio.SetAttribute("src", "ms-winsoundevent:Notification.Looping.Alarm");
audio.SetAttribute("loop", "true");
toastNode.AppendChild(audio);

  如果是持续时间较长的 Toast 通知,则可以循环该声音而不是仅播放一次。请注意,循环音频仅对持续时间较长的 Toast 有效。指定在系统指定的声音集中包含的可用于循环的声音。该示例指定循环声音。

  由于它不支持持续时间较长的 Toast,因此 Windows Phone 8.1 不支持循环的音频。

   

7. 指定应用的启动参数

  当用户单击你的 Toast 通知时,你的应用应当会启动,并显示与该通知的内容相关的视图。若要实现此目的,请使用 Toast 元素的 launch 属性,该属性提供一个在通过 Toast 启动应用时,从 Toast 传递到应用的字符串。此字符串没有任何特定形式,它由应用来定义。你的应用在每次被激活时必须检查作为参数形式的此字符串,并相应地调整它的视图或操作。

((XmlElement)toastNode).SetAttribute("launch", "{\"type\":\"toast\",\"param1\":\"12345\",\"param2\":\"67890\"}");

如何处理来自 Toast 通知的激活 (XAML)

 

说明

步骤 1: 在你的 Toast 负载中包含激活数据

  当通过 Toast 通知激活应用时,需要提供与此 Toast 内容有关的信息。然后,应用可以通过启动到关联的视图而不是默认视图来反映该内容。当应用或 Web 服务创建此 Toast 时,它使用 launch 特性来指定此激活信息。你可以将该字符串视为与命令行参数相似。该字符串能够包含可以由应用理解的任何信息,但前提是该信息不导致 XML 负载变为无效。请注意,Toast 的 XML 负载的总大小(包括启动字符串)不得超过 5 KB。

  如果你未包含启动属性字符串,你的应用将正常启动,如同用户从“开始”屏幕启动它。

  在此步骤中,我们假设以前创建了一个名为 toastXml 的 XmlDocument 对象。该示例创建 launch 属性,为它分配字符串值,然后将其添加到 Toast 通知的 XML 负载中。有关创建完整 Toast 通知的说明,请参阅快速入门:发送 Toast 通知

((XmlElement)toastNode).SetAttribute("launch", "{\"type\":\"toast\",\"param1\":\"12345\",\"param2\":\"67890\"}");
<toast launch="{&quot;type&quot;:&quot;toast&quot;:&quot;param1&quot;:&quot;12345&quot;:&quot;param2&quot;:&quot;67890&quot;}">
<visual>
<binding template="ToastImageAndText01">
<image id="1" src="ms-appx:///images/redWide.png" alt="red graphic"/>
<text id="1">Hello World!</text>
</binding>
</visual>
</toast>

步骤 2: 处理应用的“OnLaunched”事件

  当用户单击你的 Toast 或通过触摸选择你的 Toast 时,相关的应用会启动,并引发 OnLaunched 事件。

  注意  如果你在 Toast 中未包含启动特性字符串并且当选择此 Toast 时你的应用已在运行,则不会引发OnLaunched 事件。

  下面的示例显示 OnLaunched 事件的替代语法,在该事件中,你将检索通过 Toast 通知指定的启动字符串并针对其操作。

protected override void OnLaunched(LaunchActivatedEventArgs args)
{
string launchString = args.Arguments ....
}

代码:

<Page.BottomAppBar>
<CommandBar>
<CommandBar.PrimaryCommands>
<AppBarButton Label="Toast1" Click="AppBarButton_Click" />
<AppBarButton Label="Toast2" Click="AppBarButton_Click_1" />
<AppBarButton Label="Toast3" Click="AppBarButton_Click_2" />
</CommandBar.PrimaryCommands>
<CommandBar.SecondaryCommands>
<AppBarButton Label="清除通知ByTag" Click="AppBarButton_Click_3" />
<AppBarButton Label="清除通知ByGroup" Click="AppBarButton_Click_4" />
<AppBarButton Label="清除所有通知" Click="AppBarButton_Click_5" />
</CommandBar.SecondaryCommands>
</CommandBar>
</Page.BottomAppBar>
 /// <summary>
/// ToastText01模板1
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AppBarButton_Click(object sender, RoutedEventArgs e)
{
XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01);
IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
((XmlElement)toastNode).SetAttribute("launch", "启动的参数");
XmlNodeList elements = toastXml.GetElementsByTagName("text");
elements[].AppendChild(toastXml.CreateTextNode("ToastText01示例"+i++));
ToastNotification toastNotification = new ToastNotification(toastXml);
toastNotification.Tag = "tag";
ToastNotificationManager.CreateToastNotifier().Show(toastNotification);
}
/// <summary>
/// ToastText02模板2,并且是静默通知
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AppBarButton_Click_1(object sender, RoutedEventArgs e)
{
XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
XmlNodeList elements = toastXml.GetElementsByTagName("text");
elements[].AppendChild(toastXml.CreateTextNode("ToastText02示例"));
elements[].AppendChild(toastXml.CreateTextNode("一些文字...."+DateTime.Now.ToLocalTime()));
ToastNotification toastNotification = new ToastNotification(toastXml);
toastNotification.Group = "group";
toastNotification.SuppressPopup = true;//没有声音+没有震动+没有横幅,要拉下操作中心才看得到
ToastNotificationManager.CreateToastNotifier().Show(toastNotification);
} /// <summary>
/// 延时通知
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AppBarButton_Click_2(object sender, RoutedEventArgs e)
{
XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText03);
XmlNodeList elements = toastXml.GetElementsByTagName("text");
elements[].AppendChild(toastXml.CreateTextNode("ToastText03示例"));
elements[].AppendChild(toastXml.CreateTextNode("延时通知"));
IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
((XmlElement)toastNode).SetAttribute("launch", "启动的参数");
ScheduledToastNotification toastNotification = new ScheduledToastNotification(toastXml, DateTimeOffset.UtcNow.AddMinutes());
ToastNotificationManager.CreateToastNotifier().AddToSchedule(toastNotification);
}
/// <summary>
/// 清除通知ByTag
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AppBarButton_Click_3(object sender, RoutedEventArgs e)
{
ToastNotificationManager.History.Remove("tag");
}
/// <summary>
/// 清除通知ByGroup
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AppBarButton_Click_4(object sender, RoutedEventArgs e)
{
ToastNotificationManager.History.RemoveGroup("group");
} /// <summary>
/// 清除所有通知
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AppBarButton_Click_5(object sender, RoutedEventArgs e)
{
ToastNotificationManager.History.Clear();
}
}

如果发送Toast设置Launch的值,那么在Application的OnLaunch(LaunchActivatedEventArgs e)方法中可以通过这个e的参数来获取这个值,但是看到启动MainPage的时候会把这个参数带到MainPage中。

 protected override void OnLaunched(LaunchActivatedEventArgs e)
{
....
// 当导航堆栈尚未还原时,导航到第一页,
// 并通过将所需信息作为导航参数传入来配置
// 新页面
Debug.WriteLine("OnLaunched" + e.Arguments);
if (!rootFrame.Navigate(typeof(MainPage), e.Arguments))
{
throw new Exception("Failed to create initial page");
}

我们在这打印出来,下面看MainPage的OnNavigatedTo()方法

protected override void OnNavigatedTo(NavigationEventArgs e)
{
// TODO: 准备此处显示的页面。 // TODO: 如果您的应用程序包含多个页面,请确保
// 通过注册以下事件来处理硬件“后退”按钮:
// Windows.Phone.UI.Input.HardwareButtons.BackPressed 事件。
// 如果使用由某些模板提供的 NavigationHelper,
// 则系统会为您处理该事件。
Debug.WriteLine("OnNavigatedTo:" + e.Content);
tb.Text = e.Parameter.ToString();
}

用于个Text把这个参数显示出来,通过e.Parameter来取这个参数

第一次启动中间一片空白

点击第一个发送Toast

然后长按返回,从任务列表中关闭应用后台,否则将不会触发Application的OnLaunched方法。再从通知栏点击刚才的Toast启动App就会发现,显示了启动参数。

wp中的Toast和Android的Notification非常相像,从表现形式和代码写法都很像。

WP8.1学习系列(第二章)——Toast通知的更多相关文章

  1. WP8.1学习系列(第二十二章)——在页面之间导航

    在本文中 先决条件 创建导航应用 Frame 和 Page 类 页面模板中的导航支持 在页面之间传递信息 缓存页面 摘要 后续步骤 相关主题 重要的 API Page Frame Navigation ...

  2. WP8.1学习系列(第二十五章)——控件样式

      XAML 框架提供许多自定义应用外观的方法.通过样式可以设置控件属性,并重复使用这些设置,以便保持多个控件具有一致的外观. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visua ...

  3. WP8.1学习系列(第二十七章)——ListView和GridView入门

    快速入门:添加 ListView 和 GridView 控件 (XAML)   在本文中 先决条件 选择 ListView 或 GridView 将项添加到项集合 设置项目源 指定项目的外观 指定视图 ...

  4. WP8.1学习系列(第二十三章)——到控件的数据绑定

    在本文中 先决条件 将控件绑定到单个项目 将控件绑定到对象的集合 通过使用数据模板显示控件中的项目 添加详细信息视图 转换数据以在控件中显示 相关主题 本主题介绍了如何在使用 C++.C# 或 Vis ...

  5. WP8.1学习系列(第二十六章)——控件模板

    在本文中 自定义控件模板示例 指定控件的可视结构. 指定控件的可视行为 使用工具轻松处理主题 控件和辅助功能 了解有关控件默认模板的详细信息 控件模板中的主题资源 相关主题 在 XAML 框架中,如果 ...

  6. WP8.1学习系列(第二十四章)——Json解析

    .net已经集成了json解析,类名叫DataContractJsonSerializer DataContractJsonSerializer 类型公开以下成员. 构造函数     名称 说明 Da ...

  7. WP8.1学习系列(第二十一章)——本地应用数据

    了解如何存储和检索本地应用数据存储中的设置和文件. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visual Basic 的 Windows 运行时应用的路线图 使用 C++ 的 W ...

  8. WP8.1学习系列(第一章)——添加应用栏

    做过android开发的同学们应该都知道有个ActionBar的头部操作栏,而wp也有类似的一个固定在app页面里通常拥有的内部属性,就是应用栏.以前叫做ApplicationBar,现在wp和win ...

  9. WP8.1学习系列(第二十章)——添加控件和处理事件

    先决条件 添加控件 设置控件的名称 设置控件属性 创建事件处理程序 新控件 总结 相关主题 通过使用如按钮.文本框和组合框等控件,你可以创建应用的 UI. 下面将显示如何将控件添加到应用.处理控件时, ...

随机推荐

  1. asp 写文件

    '写文件 Sub WriteToTextFile (FileUrl,byval Str,CharSet) set fso = Server.CreateObject("Scripting.F ...

  2. linux 下 vi 文本编辑如何复制一行粘贴删除一行数据

    在使用vi有时会想直接复制一行数据,然后粘贴一行或者直接删除一行数据 复制一行数据的方法 把光标放到要复制的一行前面,然后按两下yy字母键 然后把光标放到要复制到的地方去,按键盘的p字母键 删除一行是 ...

  3. 【设计和开发一套简单自己主动化UI框架】

    !有兴趣的朋友请直接移步Github,本帖子已经不做更新,框架的详细的实现已经做了优化和代码整理,本文仅仅介绍了详细的设计思路! 目标:编写一个简单通用UI框架用于管理页面和完毕导航跳转 终于的实现效 ...

  4. C# 当前目录你了解多少

    C#中获取程序运行的当前目录的方法有多种,本文为大家提供三种方式,并作简单分析,有需要的朋友,可以参考下. 在C#中,有很多方式可以获取程序运行的当前目录,常见的方式有: .string strPat ...

  5. linux下nginx配置ssl证书(https)

    nginx配置ssl很简单,首先需要两个文件,一个是crt文件,另一个是key文件,如下所示: xxx.crt;  #(证书公钥)xxx.key; #(证书私钥) 把这两个文件放到nginx的conf ...

  6. Genymotion模拟器无法开启的解决方法——Unable to start the virtual device,The virtual device got no IP address

    前言 最近重装了电脑的系统,由win7换成了win8.1.android开发环境也重新配置了一遍.其他的都还好,就是genymotion模拟器一直开启失败. 自己尝试了很多方法,比如卸载重装软件,重新 ...

  7. Python的Beautiful Soup简单使用

    Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能 它是一个工具箱, ...

  8. QT编译错误:member access into incomplete type 'QMouseEvent'

    想在QT程序中使用鼠标事件,添加重载的响应函数,并实现后,一直提示 member access into incomplete type 'QMouseEvent' 既然使用了QMouseEvent类 ...

  9. [OpenCV] Samples 06: logistic regression

    logistic regression,这个算法只能解决简单的线性二分类,在众多的机器学习分类算法中并不出众,但它能被改进为多分类,并换了另外一个名字softmax, 这可是深度学习中响当当的分类算法 ...

  10. Android安装器学习笔记(一)

    Android安装器学习笔记(一) 一.Android应用的四种安装方式: 1.通过系统应用PackageInstaller.apk进行安装,安装过程中会让用户确认 2.系统程序安装:在开机的时候自动 ...