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 通知
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[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非常相像,从表现形式和代码写法都很像。