共用方式為


本文章是由機器翻譯。

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 設置螢幕的一部分。像詳細的狀態應用程式,每個設備只能一次有一個單個報警的應用程式。


圖 1 鎖定螢幕部分的 PC 設置

報警應用程式和其他鎖螢幕應用程式之間的唯一區別是預定的交貨時間在一秒鐘內給使用者提供報警吐司通知的能力。如前面所提到的、 提交或調度舉杯,在 Windows 應用程式商店中的並不能保證時將傳遞那烤麵包。它提供一個大致的時間框架,但確切的時間是到 Windows。如果應用程式由作為報警 app 使用者標識的確切地準時交貨計畫的敬酒。

報警應用程式設定

應用程式可以選擇作為報警應用程式之前,必須正確配置的應用程式清單。如果該清單不包括所需的特徵,然後嘗試作為報警 app 在代碼中設置該應用程式將生成一個錯誤和使用者不會有要手動設置應用程式的選項。

因為報警 app 的附表敬酒,你首先需要啟用敬酒。你可以在應用程式使用者介面選項卡中的清單設計器中。吐司能夠下拉式清單方塊可以在視覺化資產項下的通知部分中找到。圖像的所有資產,以及該徽標分組下可以找到通知部分。若要啟用敬酒的應用程式,應該吐司能夠下拉清單中設置為 Yes。

通知部分中的其他屬性是鎖螢幕為啟用通知應用程式的能力。如前所述,報警 app 是一種特殊類型的鎖螢幕的應用程式 ; 因此必須配置該應用程式要在鎖定螢幕上。你應設置鎖定螢幕通知下拉清單中為徽章或徽章和瓷磚的文本。

一旦您啟用了鎖定螢幕通知應用程式,該清單需要有幾個其他專案。例如,徽標必須分配給應用程式。徽標要求是 24 x 24 圖元的圖像,並像在 Windows 應用程式商店中的所有標誌,您可以指定各種規模大小來處理 Windows 解析度縮放。圖 2 顯示具有敬酒和啟用鎖定螢幕通知的清單設計器的一個示例。


清單設計器圖 2 通知部分

任何已啟用的鎖定螢幕通知的應用程式還必須聲明一個背景工作的應用程式清單中。這一要求的有趣的是你不需要其實是鎖螢幕的應用程式 ; 在執行背景工作 它只是有要聲明。

背景工作是在應用程式清單設計器的宣告區段中聲明的。在可用的聲明中,選擇背景任務,按一下添加。背景工作鎖定螢幕應用程式必須支援以下任務類型之一:控制通道,計時器,推式通知或位置。在背景工作的應用程式設定部分中,您必須設置的進入點或起始頁值。在 XAML 應用程式正在使用的背景工作,進入點是設置為實現 IBackgroundTask 介面的類。如果應用程式並不實際執行背景工作,值可以設置為任何東西。圖 3 顯示正確配置的背景工作,使一個應用程式添加到鎖定螢幕。


圖 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 目前確認是一個不同的應用程式,它將被替換由當前一個如果使用者是選擇提示時。


圖 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 中的大多數敬酒。


圖 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>


圖 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

衷心感谢以下技术专家对本文的审阅:Pete Brown(Microsoft)
Pete Brown是程式管理器,在用戶端和設備福音事工團隊中,所有 Windows 設備中側重于 XAML 和現代的應用程式。 他的重點是説明開發人員構建使創造力的美麗、 高品質、 應用程式。 他是在 twitter 上 @pete_brown 和在 web 上 10rem.net