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 图像和文本元素提供了一个框架。
Toast 模板目录。
尽管磁贴和 Toast 通知在定义上具有很多相似性,但 Toast 通知还具有可在显示通知时播放的声音。
Toast 通知的元素在 Toast 架构 中定义。
有关可用 Toast 通知模板的完整列表及每个模板的说明,请参阅选择 Toast 模板。
using Windows.UI.Notifications; using Windows.Data.Xml.Dom;
2. 为 Toast 选取一个模板并检索其 XML 内容
从系统提供的模板目录中,选择一个适合你的内容的需求的模板。有关完整的模板列表,请参阅ToastTemplateType 枚举。请注意,你发送的每个单独的通知都可以使用一个不同的模板。
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[0].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="{"type":"toast":"param1":"12345":"param2":"67890"}"> <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[0].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[0].AppendChild(toastXml.CreateTextNode("ToastText02示例")); elements[1].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[0].AppendChild(toastXml.CreateTextNode("ToastText03示例")); elements[1].AppendChild(toastXml.CreateTextNode("延时通知")); IXmlNode toastNode = toastXml.SelectSingleNode("/toast"); ((XmlElement)toastNode).SetAttribute("launch", "启动的参数"); ScheduledToastNotification toastNotification = new ScheduledToastNotification(toastXml, DateTimeOffset.UtcNow.AddMinutes(1)); 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非常相像,从表现形式和代码写法都很像。