WP8.1学习系列(第二章)——Toast通知

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

时间: 2024-10-24 09:55:18

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

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

在本文中 先决条件 创建导航应用 Frame 和 Page 类 页面模板中的导航支持 在页面之间传递信息 缓存页面 摘要 后续步骤 相关主题 重要的 API Page Frame NavigationCacheMode 本主题将讨论基本的导航概念,并演示如何创建一个在两个页面之间进行导航的应用. 有关为你的应用选择最佳导航模式的帮助,请参阅导航模式. 在操作时请参阅平面导航和分层导航模式,它们是应用功能大全系列的一部分. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visual

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

XAML 框架提供许多自定义应用外观的方法.通过样式可以设置控件属性,并重复使用这些设置,以便保持多个控件具有一致的外观. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visual Basic 的 Windows 运行时应用的路线图 使用 C++ 的 Windows 运行时应用的路线图 应用功能大全系列中突出显示的 Windows 应用商店应用 UI 详细信息 本主题包含下列部分: 先决条件 样式基础知识 应用隐式或显式样式 使用基于样式 使用工具轻松处理样式 修改 Windo

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

在本文中 先决条件 将控件绑定到单个项目 将控件绑定到对象的集合 通过使用数据模板显示控件中的项目 添加详细信息视图 转换数据以在控件中显示 相关主题 本主题介绍了如何在使用 C++.C# 或 Visual Basic 的 Windows 应用商店应用中将控件绑定到单个项或将列表控件绑定到项目集合.此外,本主题向你介绍了如何自定义控件项目的显示.如何基于所选内容实现详细信息视图,以及如何转换数据以进行显示.有关更多详细信息,请参阅使用 XAML 进行数据绑定. 路线图: 本主题与其他主题有何关联

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

快速入门:添加 ListView 和 GridView 控件 (XAML) 在本文中 先决条件 选择 ListView 或 GridView 将项添加到项集合 设置项目源 指定项目的外观 指定视图布局 向视图中添加标题 设置视图的交互模式 摘要和后续步骤 相关主题 重要的 API ListView GridView 你可以在 XAML 中使用 ListView 或 GridView 控件来显示数据集合,如联系信息列表.库中的图像或电子邮件收件箱中的内容. 目标: 了解如何将 ListView 和

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

了解如何存储和检索本地应用数据存储中的设置和文件. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visual Basic 的 Windows 运行时应用的路线图 使用 C++ 的 Windows 运行时应用的路线图 获取应用的设置和文件容器 使用 ApplicationData.LocalSettings 属性可以获取 ApplicationDataContainer 对象中的设置.使用ApplicationData.LocalFolder 属性可以获取 StorageFold

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

.net已经集成了json解析,类名叫DataContractJsonSerializer DataContractJsonSerializer 类型公开以下成员. 构造函数   名称 说明 DataContractJsonSerializer(Type) 初始化 DataContractJsonSerializer 类的新实例,以便序列化或反序列化指定类型的对象. DataContractJsonSerializer(Type, IEnumerable<Type>) 初始化 DataCont

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

在本文中 自定义控件模板示例 指定控件的可视结构. 指定控件的可视行为 使用工具轻松处理主题 控件和辅助功能 了解有关控件默认模板的详细信息 控件模板中的主题资源 相关主题 在 XAML 框架中,如果要自定义控件的可视结构和可视行为,请创建控件模板.控件有多个属性,如 Background.Foreground 以及FontFamily,可以设置这些属性以指定控件外观的多个方面.但是可以通过设置这些属性所做的更改有限.可以使用 ControlTemplate 类创建提供其他自定义的模板.在此处,

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

做过android开发的同学们应该都知道有个ActionBar的头部操作栏,而wp也有类似的一个固定在app页面里通常拥有的内部属性,就是应用栏.以前叫做ApplicationBar,现在wp和win统一称AppBar,以后Win10一统手机和桌面相信Api将会高度统一. 废话不多说了,从wp8.1开始,系统提供了AppBar和CommandBar两种控件,CommandBar集成了很多功能,但是是系统指定的模板,如果要高度自定义(如显示进度条,搜索框等等)应用栏就需要使用AppBar了.其中A

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

先决条件 添加控件 设置控件的名称 设置控件属性 创建事件处理程序 新控件 总结 相关主题 通过使用如按钮.文本框和组合框等控件,你可以创建应用的 UI. 下面将显示如何将控件添加到应用.处理控件时,你通常会使用此模式: 将控件添加到应用 UI. 设置控件的属性,如宽度.高度或前景色. 将代码连接到控件,从而使控制执行任务. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visual Basic 的 Windows 运行时应用的路线图 使用 C++ 的 Windows 运行时应用