読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows PhoneでAlarmを使って指定された時間にアラームを鳴らす/現在設定されているアラーム情報を取得する

Windows Phone SDK 7.1から追加されました「リマインダー」と「アラーム」についてご紹介します。

リマインダーについての説明は、「Windows PhoneでReminderを使って指定された時間にリマインダーを表示する」をご覧ください。

アラームは、カスタムサウンドを指定して、任意の時刻に通知するスケジューラーのひとつです。Alarmクラスは、Microsoft.Phone.Scheduler名前空間に実装されています。

名前空間:Microsoft.Phone.Scheduler

System.Object
 +–Microsoft.Phone.Scheduler.ScheduledAction
  +–Microsoft.Phone.Scheduler.ScheduledNotification
   +–Microsoft.Phone.Scheduler.Alarm

アラームの場合は、Titleプロパティがサポートされておらず、常に「アラーム」というタイトルになります。テキストコンテンツに情報を設定しておくと表示されるのはリマインダーの挙動と同様です。

アラームは、リマインダーのような特定のページでアプリケーションを起動させるようなことはできません。指定した時刻が来るとダイアログが表示されますがこの時鳴らすアラーム音を指定することができます。


アラームの設定

アラーム情報を作成してScheduledActionServiceクラスのAddメソッドを使用して、システムに新しいアラームを登録します。

    // 既にalarmという名前のアラーム情報が存在しているかチェック
    if (ScheduledActionService.Find("alarm") != null) {
        // 既存のアラーム情報を削除する
        ScheduledActionService.Remove("alarm");
    }

    var alarm = new Alarm("alarm");
    alarm.Content = "アラームの通知コンテンツ";
    // 「アラームを通知を開始する時間」を今から1分後に設定する
    alarm.BeginTime = DateTime.Now.AddMinutes(1);
    // 「アラームが期限切れになる時間」を今から2分後に設定する
    alarm.ExpirationTime = DateTime.Now.AddMinutes(2);
    // 通知を繰り返すか、繰り返しの間隔を設定
    alarm.RecurrenceType = RecurrenceInterval.Daily;
    // アラーム時の鳴動するサウンド
    //alarm.Sound = new Uri("/Ring01.wma", UriKind.Relative);

    ScheduledActionService.Add(alarm);

ScheduledActionServiceにアラーム情報を登録後、1分後にアラーム通知がされます。

f:id:ch3cooh393:20140704173048p:plain

現在設定されているスケジュールを取得する

リマインダーとアラームの一覧は、ScheduledActionServiceクラスのGetActionsメソッドで取得する事ができます。

protected override void OnNavigatedTo(NavigationEventArgs e) {

    // ScheduledActionServiceに登録されている
    // リマインダーやアラーム情報を一括で取得する
    var notifications = ScheduledActionService.GetActions<ScheduledNotification>();
    listBox1.ItemsSource = notifications;
}

コレクションを設定する側のListBoxでは、以下の様にXAML側でItemTemplateを定義して、スケジュールの名前を表示させます。

<ListBox Height="411" x:Name="listBox1">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>