Windows 8.1

在 Windows 8.1 中构建闹钟应用程序

Tony Champion

数以百计的 Windows 8.1 中的新功能之一是报警 app 的概念。 总括来说,报警应用程序是一个 Windows 应用商店的应用,可以安排到第二个吐司通知。 由于方式 Windows 进程敬酒,这不是为大多数应用程序提供的准确性。 在本文中,我探讨报警 app 的概念,然后看看怎样才能开发自己的。

报警应用程序是什么?

之前看报警 app 在引擎盖下,它是重要的是考虑哪种类型的应用程序会使好报警的应用程序。 关键是要考虑的通知传递的准确性。 例如,没有必要为一个日历应用程序,以通知用户的确切的第二次在一个朋友的生日。 然而,有几种类型的应用程序确实需要这种精确性。

最明显的选择是一个很好的老式闹钟应用程序。 当用户设置报警时,您的应用程序需要在那一刻通知用户。 您现在可以创建更准确的时间管理应用程序,如风味 app,报警 app。 报警应用程序可能还用于短间隔锻炼,如畑,哪里轮和休息的时间是极为重要的。

所有 Windows 应用商店的应用程序开发人员都应熟悉 Windows 8 概念的锁定屏幕的应用程序。 放在锁定屏幕的应用程序,允许过帐到锁定屏幕更新。 此外,一个锁屏幕应用程序已获得更多能力比一个典型的应用程序。 当您的应用程序需要做事情如更新锁定屏幕或运行许多可用的背景的任务时,这是重要的。

需要锁定屏幕的应用程序中的附加功能是 Windows 8,以改善性能和电池寿命的变化的直接结果。 Windows 设计以防止运行时他们是不正在使用的应用程序,并巩固时可能的任务。 为此,你会发现预定的事件,例如后台任务和通知,始终都会以近似的时间运行。 Windows 批处理这些更新和运行它们时它已准备好要做这项工作的进程。

在 Windows 8 中,您可以定义最多七个应用程序,在任何给定时间被锁在屏幕上。 包含在这些七个插槽是特殊的插槽的详细的状态的应用程序。 设备可能有七个锁屏幕的应用程序可以显示徽章或文本,但只有一个应用程序,能够提供到锁定屏幕的自定义 UI。 Windows 8.1 保持此安装程序,并添加报警 app 作为一种特殊新的锁定屏幕应用程序。 图 1 显示新的"锁定屏幕应用"设置 PC 设置屏幕的一部分。 像详细的状态应用程序,每个设备只能一次有一个单个报警的应用程序。

Lock Screen Part of PC Settings
图 1 锁定屏幕部分的 PC 设置

报警应用程序和其他锁屏幕应用程序之间的唯一区别是预定的交货时间在一秒钟内给用户提供报警吐司通知的能力。 如前面所提到的、 提交或调度举杯,在 Windows 应用程序商店中的并不能保证时将传递那烤面包。 它提供一个大致的时间框架,但确切的时间是到 Windows。 如果应用程序由作为报警 app 用户标识的确切地准时交货计划的敬酒。

报警应用程序设置

应用程序可以选择作为报警应用程序之前,必须正确配置的应用程序清单。 如果该清单不包括所需的特征,然后尝试作为报警 app 在代码中设置该应用程序将生成一个错误和用户不会有要手动设置应用程序的选项。

因为报警 app 的附表敬酒,你首先需要启用敬酒。 你可以在应用程序用户界面选项卡中的清单设计器中。 吐司能够下拉列表框可以在可视化资产项下的通知部分中找到。 图像的所有资产,以及该徽标分组下可以找到通知部分。 若要启用敬酒的应用程序,应该吐司能够下拉列表中设置为 Yes。

通知部分中的其他属性是锁屏幕为启用通知应用程序的能力。 如前所述,报警 app 是一种特殊类型的锁屏幕的应用程序 ; 因此必须配置该应用程序要在锁定屏幕上。 你应设置锁定屏幕通知下拉列表中为徽章或徽章和瓷砖的文本。

一旦您启用了锁定屏幕通知应用程序,该清单需要有几个其他项目。 例如,徽标必须分配给应用程序。 徽标要求是 24 x 24 像素的图像,并像在 Windows 应用程序商店中的所有标志,您可以指定各种规模大小来处理 Windows 分辨率缩放。 图 2 显示具有敬酒和启用锁定屏幕通知的清单设计器的一个示例。

Notifications Section of the Manifest Designer
清单设计器图 2 通知部分

任何已启用的锁定屏幕通知的应用程序还必须声明一个后台任务的应用程序清单中。 这一要求的有趣的是你不需要其实是锁屏幕的应用程序 ; 在执行后台任务 它只是有要声明。

后台任务是在应用程序清单设计器的声明部分中声明的。 在可用的声明中,选择背景任务,单击添加。 后台任务锁定屏幕应用程序必须支持以下任务类型之一:控制通道,计时器,推式通知或位置。 在后台任务的应用程序设置部分中,您必须设置的入口点或起始页值。 在 XAML 应用程序正在使用的后台任务,入口点是设置为实现 IBackgroundTask 接口的类。 如果应用程序并不实际执行后台任务,值可以设置为任何东西。 图 3 显示正确配置的后台任务,使一个应用程序添加到锁定屏幕。

Configuring a Background Task
图 3 配置后台任务

配置的应用程序清单的最后一步是确定应用程序作为一个报警的应用程序。 你通过在该清单中添加报警扩展。 不幸的是,它不可能要添加此扩展通过清单设计器 ; 它必须用手工完成。 为了做到这一点,你必须先获取基础 XML 的程序包清单。 执行此操作右键单击 package.appxmanifest 在解决方案资源管理器中的,选择查看代码。

Windows 8.1 应用程序清单中的 XML 将使用两个命名空间。 第一个命名空间 (这是默认值) 包含在 Windows 8 中定义的元素。 第二个命名空间必须添加,并且由 m2 前缀标识。 它包括添加和更改 Windows 8.1 中添加。 因为报警 app 功能是新的 Windows 8.1,您需要将"8.1"扩展名添加到扩展集合内的应用程序元素。 新扩展的类属性应设置为 windows.alarm。 这里是一个扩展集合应该是什么样子与新的扩展和以前声明的后台任务的示例:

<Extensions>
  <Extension Category="windows.backgroundTasks" 
      EntryPoint="App">
    <BackgroundTasks>
      <Task Type="timer" />
    </BackgroundTasks>
  </Extension>
  <m2:Extension Category="windows.alarm" />
</Extensions>

请求报警访问

一旦已经作出了适当的设置和声明,您的应用程序然后可以请求要设置为报警的设备应用程序的访问。 用户可以从 PC 设置 ; 手动执行此 但是,您的应用程序可以请求通过 Windows 运行库 (WinRT) 的访问。

Windows 运行时在 Windows.ApplicationModel.Background 命名空间中包含静态的 AlarmApplicationManager 类。 此类具有一个 RequestAccessAsync 方法,如中所示,将提示用户的权限,将应用程序设置为设备报警 app, 图 4。 如果报警 app 目前确认是一个不同的应用程序,它将被替换由当前一个如果用户是选择提示时。

An Alarm App Permission Prompt
图 4 报警的应用程序的权限提示

RequestAccessAsync 方法返回一个 AlarmAccessStatus 枚举来有三个有效的值:被拒绝,AllowedWithWakeup­能力和 AllowedWithoutWakeupCapability。 这是进口­腾达如果您正在创建警报应用程序为早晨唤醒等报警。 如果该设备是在睡眠模式下,它没有配置为允许吐司通知来唤醒它,然后你报警不会火。

它是重要的是要记住 Windows 8 使用户在一个设备的控制权。 如中所示图 1,用户可以轻松地更改报警 app。 您的挑战是每个应用程序才可以请求访问 AlarmApplicationManager 从一次。 如果在应用程序进行访问的第二个请求 — — 为此用户和设备 — — 它不会提示用户并将仅返回应用程序的当前报警状态。 一旦您的应用程序被拒绝,取而代之的是一个不同的应用程序或用户手动删除,你唯一的选择是通知应用程序需要将手动添加回作为报警的设备应用程序的用户。

AlarmApplicationManager 还包括一个 GetAccessStatus 方法,返回当前报警的状态机。 如在 RequestAccessAsync 方法,它返回一个 AlarmAccessStatus 枚举并是伟大的方式来确定到底与设备。 例如,您的应用程序能通知用户,如果通知不会醒的设备。

调度报警

警报是实际上只是预定吐司通知与更大的功力。 进程的调度报警调度一个吐司通知,唯一的区别是通知 XML 的一模一样。 用来定义一个通知的 XML 将包含有关它的外观,以及任何包含的功能的信息。

干一杯可以只是文本和图像的组合定义的 Windows 运行库所提供的模板之一。 有目前八个不同的 XML 模板,您可从中选择。 写作时,Windows 8.1 不支持自定义土司的布局,因此您必须选择从所提供的模板之一。

在的 XML 块中定义的类型和布局的干一杯。 XML 标识要使用,在文本和图像来填充该模板中和其他几个选项,我稍后将讨论的土司模板。 这里是一个基本的吐司通知的示例:

<toast duration="long">
  <visual>
    <binding template="ToastText02">
      <text id="1">Sample Toast App</text>
      <text id="2">The is a sample message.</text>
    </binding>
  </visual>
</toast>

有几种方法来生成的祝酒词模板。 Windows 运行库将从 ToastNotificationManager,可以发现在 Windows.UI.Notification 命名空间中创建每个模板的 XmlDocument。 ToastNotificationManager 具有一个静态的 GetTemplateContent 方法,需要为每个可用的模板都有一个值 ToastTemplateType 枚举。 这里是示例的如何获得 XmlDocument 前面中的示例:

XmlDocument content =
  ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
content.DocumentElement.SetAttribute("duration", "long");
var textLines = content.GetElementsByTagName("text");
textLines[0].InnerText = "Sample Toast App";
textLines[1].InnerText = "The is a sample message.";

这是一个伟大的起点 ; 然而,根据您的使用情况,可能会有点麻烦。 这就是为什么通常做任何添加或修改的模板使用 XmlDocument API。 这可以导致很多行代码为几个简单的加法。 铭记这一点,它不是不寻常的找 XML 建立起作为一个字符串,然后加载到 XmlDocument 模板一旦完成。 图 5 演示如何实现相当于前面的示例所生成的 XML 字符串的形式。

图 5 生成 XML 的字符串作为

string textLine1 = "Sample Toast App";
string textLine2 = "This is a sample message.";
string contentString =
  "<toast duration=\"long\">\n" +
    "<visual>\n" +
      "<binding template=\"ToastText02\">\n" +
        "<text id=\"1\">" + textLine1 + "</text>\n" +
        "<text id=\"2\">" + textLine2 + "</text>\n" +
      "</binding>\n" +
    "</visual>\n" +
  "</toast>\n";
XmlDocument content = new Windows.Data.Xml.Dom.XmlDocument();
content.LoadXml(contentString);

如果你要去的这条路线你应注意的两件事。 首先,你必须确保你创造格式正确的 XML — — 照顾可能在字符串中包含任何特殊字符转义。 第二,请确保遵循的吐司通知架构。 Windows 开发中心提供完整的技术规格上的架构为 bit.ly/172oYCO

所有的前面的示例有一个元素不是默认模板的一部分。 你可能已经注意到的土司元素的持续时间属性已设置为长。 因为您正在创建报警吐司通知,你不想报警出现,然后消失而无需用户交互。 设置持续时间要长时间将达 25 秒在屏幕上敬酒。

一旦您有您的 XML 配置和加载到 XmlDocument,你可以安排你的祝酒词。 第一步是创建一个 ScheduledToastNotification 的实例。 你想要创建 ScheduledToastNotification 的两个事情:XmlDocument 包含土司定义和烤面包的时间安排。

ScheduledToastNotification 与 ToastNotifier 预定。 ToastNotifier 的实例创建的 ToastNotification­管理器类使用的静态的 CreateToastNotifier 方法。 然后,对 ToastNotifier AddToSchedule 方法的调用将安排祝酒词将交付。 通常作为一些用户操作,例如,按下一个按钮或在应用程序内引发的事件的结果创建的敬酒。 这里是创建和调度干杯 1 分钟从当前时间的一个示例:

ToastNotifier toastNotifier =
  ToastNotificationManager.CreateToastNotifier();
var scheduledToast = new ScheduledToastNotification(
  content, DateTime.Now.AddMinutes(1));
toastNotifier.AddToSchedule(scheduledToast);

生成的结果面包可以看出图 6。 请注意它应该看起来像你见过在 Windows 中的大多数敬酒。

A Basic Toast Notification
图 6 基本吐司通知

吐司的通知可能会失败为几个不同的原因。 最常见的原因是 XML 格式不正确。 这可能引起具有不正确模板 id 或未定义所有必需的属性,所以很重要,以确保你得到正确的 XML。

如果您尝试为已经过去的时间安排祝酒,将引发异常在 AddToSchedule 调用过程。 如果你在将来几秒钟调度举杯,请确保时间计算是你做最后一件事之一。 时间为 2 秒设置从现在然后考虑 4 秒其实调度那干杯之前执行的代码将引发异常。

最后,您的应用程序只能有一次预定的 4,096 敬酒。 我知道你首先想到的是,"没有办法,将会发生,"但报警应用程序它是比你想象的要容易一些。 假设您有一个报警应用程序,允许用户来安排每日的警报。 如果您的代码在下一年的每一天安排多个每日警告,12 每日警报将麦克斯你出去。 这就意味着你需要确保你的算法来调度报警想出了和您一次管理警报创建它们。

管理和删除警报

要成功地构建报警应用程序,您需要有能力审查并删除任何预定的报警。 ToastNotifier 可以完成两项任务。 调用 GetScheduledToastNotifications 方法将返回一个只读的列表的 ScheduledToastNotifications。 该集合将只包含当前应用程序的计划的通知。

若要删除已调度的通知,要被删除的通知应传递给 RemoveFromSchedule 方法。 这两个方法之间,可以保持您计划的通知。 一旦一个通知被张贴,然后驳回由用户,它将不再出现在应用程序的集合中的通知,并计数允许计划通知的最大数目也不会。 这里是如何清除所有已调度的通知:

var toastNotifier = ToastNotificationManager.CreateToastNotifier();
var notifications = toastNotifier.GetScheduledToastNotifications();
// Remove each notification from the schedule
foreach (var notification in notifications)
{
  toastNotifier.RemoveFromSchedule(notification);
}

你可以将此代码放在例如绑全部清除按钮的命令或事件处理程序。

添加命令

如果您的应用程序当前的设备报警 app,然后前面的示例中,生成中所示的面包图 6 将显示的时间,但图 6看上去很像报警,不是吗? 主要是你错过了的两个共同特点发出警报:暂停和撤销。 默认情况下,点击在烤面包或刷它将解雇 ; 然而,报警需要有点更直观。

除了在 < 烤面包 > 元素支持 < 视觉 > 子元素,它还支持 < 命令 > 元素。 此元素允许您将预定义的命令添加到在烤面包。 元素本身支持单个可选方案属性。 该方案属性可以设置为报警或 incomingCall。 为我在这里的目的,它将始终设置为报警。

< 命令 > 元素包含一个集合个人 < 命令 > 元素。 每个命令必须确定它什么类型的命令 id 属性。 发出警报,这必须要么打盹或解雇。 通过将命令部分添加到你以前的祝酒词,你的祝酒词现在看起来有一点像报警和有能力的不只是被解雇但要打盹,以及。 这里是新生成的土司的代码 (您可以看到此代码的结果图 7):

<toast duration="long">
  <visual>
    <binding template="ToastText02">
      <text id="1">Sample Toast App</text>
      <text id="2">The is a sample message.</text>
    </binding>
  </visual>
  <commands scenario="alarm">
    <command id="snooze"/>
    <command id="dismiss"/>
  </commands>
</toast>

An Alarm Toast Notification
图 7 报警吐司通知

设置打盹

默认情况下,Windows 设置报警的打盹时间 9 分钟一班。 然而,你可以在 ScheduledToastNotification 类中定义打盹的持续时间。 此类有两个附加参数的第二个构造函数。 第一是的打盹时间长度。 打盹时间间隔被定义为 TimeSpan 并且可以范围任意位置从 1 到 60 分钟。

新的第二个参数是用户可以打闹钟打盹的最大次数。 将此值设置为零,将允许用户打打盹无限量的倍。 这里是设置打盹频率的示例:

DateTime scheduledTime = DateTime.Now.AddMinutes(1);
TimeSpan snoozeInterval = TimeSpan.FromMinutes(5);
var scheduledToast = new ScheduledToastNotification(
  content, scheduledTime, snoozeInterval, 0);

更改闹钟的声音

如果用户已启用通知的声音,然后每个面包将使同一"叮"声显示土司消息时。 当它来到创建一个警报应用程序时,这会导致的几个问题。 第一,用户获取习惯听同样的声音的所有通知。 这意味着报警可以淡入其他通知的噪音并不显眼。 第二个问题是通常报警继续使声音,直到用户承认了这一点。 因此,您需要有某种类型的循环声音报警。

幸运的是,烤面包的定义也支持 < 音频 > 允许您自定义的响声,当在烤面包出现时的元素。 < 音频 > 元素具有两个属性:src 和循环。 你太过兴奋之前,src 属性的值必须是由 Windows 提供的预定义值之一。 这意味着您不能为您的吐司通知,提供自定义音频,但你确实有体面的声音要从中选择的集合。

Src 的值必须是 25 预定义的值之一。 声音分为循环和非循环的类别。 循环声音正在兴建,无缝地循环,并创建一个循环的音频通知时应使用。 那里 10 报警循环声音和 10 传入调用提供的循环声音。 预定义的值的完整列表可以在发现 bit.ly/16HV2xm

如果你想要播放循环声音,循环属性必须设置为 true。 此外,在 < 烤面包 > 的持续时间属性 必须设置元素为长为了让声音有时间来玩。 图 8 显示设置自定义的音频循环声音,为你的祝酒词的示例。

图 8 设置自定义祝酒时循环音频声音

<toast duration="long">
  <visual>
    <binding template="ToastText02">
      <text id="1">Sample Toast App</text>
      <text id="2">The is a sample message.</text>
    </binding>
  </visual>
  <commands scenario="alarm">
    <command id="snooze"/>
    <command id="dismiss"/>
  </commands>
  <audio src="ms-winsoundevent:Notification.Looping.Alarm2"
     loop="true" />
</toast>

如果您不希望您敬酒以播放任何声音,你可以保持沉默的属性设置为 true。 这将重写上显示敬酒的任何默认设置。 图 9 显示了如何使用它。

图 9 设置无声的属性,因此干一杯不会播放任何声音

<toast duration="long">
  <visual>
    <binding template="ToastText02">
      <text id="1">Sample Toast App</text>
      <text id="2">The is a sample message.</text>
    </binding>
  </visual>
  <commands scenario="alarm">
    <command id="snooze"/>
    <command id="dismiss"/>
  </commands>
  <audio silent="true" />
</toast>

您的应用程序之外的思考

您可以在许多不同的方向采取报警的应用程序。 因为每台设备只能有一个单一报警软件,它是重要的是要想超越您的应用程序。 如果您的应用程序的范围是太有限,然后用户可能会用替换它不同的应用程序。 当然,这取决于您的应用程序和其目标受众的目的。 考虑事情如使用共享目标合同允许其他应用程序来安排您的应用程序通过报警。

加上 Windows 8.1 中报警的应用程序功能,现在可以创建广泛的基于时间的应用程序与用户所期望的准确性。 我已经显示了怎样才能让你与报警应用程序启动和运行。 现在,不许再打暂停按钮。 走出去,创建下一个令人惊异报警 app !

Tony Champion  是主席的冠军 DS,是微软最有价值球员。他是活跃在社会的扬声器、 博客作者和作者。他坚持在博客 tonychampion.net ,可以通过电子邮件在到达tony@tonychampion.net

衷心感谢以下技术专家对本文的审阅:皮特 ・ 布朗 (Microsoft)
皮特 · 布朗是程序管理器,在客户端和设备福音事工团队中,所有 Windows 设备中侧重于 XAML 和现代的应用程序。 他的重点是帮助开发人员构建使创造力的美丽、 高质量、 应用程序。 他是在 twitter 上 @pete_brown 和在 web 上 10rem.net