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 通知
说明
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="{"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[].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通知的更多相关文章
- WP8.1学习系列(第二十二章)——在页面之间导航
在本文中 先决条件 创建导航应用 Frame 和 Page 类 页面模板中的导航支持 在页面之间传递信息 缓存页面 摘要 后续步骤 相关主题 重要的 API Page Frame Navigation ...
- WP8.1学习系列(第二十五章)——控件样式
XAML 框架提供许多自定义应用外观的方法.通过样式可以设置控件属性,并重复使用这些设置,以便保持多个控件具有一致的外观. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visua ...
- WP8.1学习系列(第二十七章)——ListView和GridView入门
快速入门:添加 ListView 和 GridView 控件 (XAML) 在本文中 先决条件 选择 ListView 或 GridView 将项添加到项集合 设置项目源 指定项目的外观 指定视图 ...
- WP8.1学习系列(第二十三章)——到控件的数据绑定
在本文中 先决条件 将控件绑定到单个项目 将控件绑定到对象的集合 通过使用数据模板显示控件中的项目 添加详细信息视图 转换数据以在控件中显示 相关主题 本主题介绍了如何在使用 C++.C# 或 Vis ...
- WP8.1学习系列(第二十六章)——控件模板
在本文中 自定义控件模板示例 指定控件的可视结构. 指定控件的可视行为 使用工具轻松处理主题 控件和辅助功能 了解有关控件默认模板的详细信息 控件模板中的主题资源 相关主题 在 XAML 框架中,如果 ...
- WP8.1学习系列(第二十四章)——Json解析
.net已经集成了json解析,类名叫DataContractJsonSerializer DataContractJsonSerializer 类型公开以下成员. 构造函数 名称 说明 Da ...
- WP8.1学习系列(第二十一章)——本地应用数据
了解如何存储和检索本地应用数据存储中的设置和文件. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visual Basic 的 Windows 运行时应用的路线图 使用 C++ 的 W ...
- WP8.1学习系列(第一章)——添加应用栏
做过android开发的同学们应该都知道有个ActionBar的头部操作栏,而wp也有类似的一个固定在app页面里通常拥有的内部属性,就是应用栏.以前叫做ApplicationBar,现在wp和win ...
- WP8.1学习系列(第二十章)——添加控件和处理事件
先决条件 添加控件 设置控件的名称 设置控件属性 创建事件处理程序 新控件 总结 相关主题 通过使用如按钮.文本框和组合框等控件,你可以创建应用的 UI. 下面将显示如何将控件添加到应用.处理控件时, ...
随机推荐
- UI型Bug定义的处理方法
[UI型Bug定义] 这里指的UI型指以下两种Bug: 第一种是文字型Bug,即和给定的字符资源不一致的Bug,比如文字/字符/提示语/引导语/用户协议等文字方面的不一致. 第二种是UI效果不一致的B ...
- Xianfeng轻量级Java中间件平台:一期开发计划
关于Xianfeng轻量级Java中间件平台,考虑到需要控制开发周期,通过分期开发的方式来实现一些基础的.常用的功能,这样有利于跟踪开发计划.一期的开发计划,主要实现的目标如下: 系统架构: 1.确定 ...
- Eclipse文件首部自动加 作者时间
Window -> Preferences -> Java -> Code Style -> Code templates -> (in right-hand pane) ...
- C# 反射(GetType) 获取动态Json对象属性值的方法
之前在开发一个程序,希望能够通过属性名称读取出属性值,但是由于那时候不熟悉反射,所以并没有找到合适的方法,做了不少的重复性工作啊! 然后今天我再上网找了找,被我找到了,跟大家分享一下. 其实原理并不复 ...
- 前端图片压缩(纯js)
html代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- Linux学习笔记(二):实战-根据微服务端口号关闭进程
前言 现在项目组基本都用Springboot,每个服务占用一个端口号,有时需要选择性的关闭,但在任务管理器上他们的名称都是java.exe,无法区分,这才学以致用. killPort.sh 作用:根据 ...
- Android立刻终止一个线程
/** * Created by JuTao on 2017/2/4. * 如何中止一个线程 */ public class ThreadDone { public static void main( ...
- Android四大组件之——ContentProvider(一)
Android四大组件之--ContentProvider(一) 本人邮箱:JohnTsai.Work@gmail.com,欢迎交流讨论. 欢迎转载,转载请注明网址:http://www.cnblog ...
- ML基础 : 训练集,验证集,测试集关系及划分 Relation and Devision among training set, validation set and testing set
首先三个概念存在于 有监督学习的范畴 Training set: A set of examples used for learning, which is to fit the parameters ...
- EF跨库查询,DataBaseFirst下的解决方案
出于各种原因,有时需要跨数据库访问某些数据表,有同学已经给出了解决方案,比如 http://blog.csdn.net/hanjun0612/article/details/50475800 已经解 ...