リマインダーとアラームを使うサンプル

2012年6月25日(月)
PROJECT KySS

今回は、指定した時刻にスケジュールを起動させることができるリマインダーサンプルと、カスタムサウンドが使えるアラームサンプルの、2つを紹介します。

リマインダーを使う

はじめに解説するリマインダーでは、指定した時刻にスケジュールやダイアログを起動させることができます。また、週1回、月1回など、定期的なスケジュールでの起動も可能です。サンプルの動作は下記の通りです。

  1. サンプルを起動して、リストボックスに表示されたスケジュールを選択し、リマインダーにセットします。
  2. その後、何か別なアプリを操作していると、1分後に音が鳴ってダイアログが起動し、スケジュールを通知してくれます。
  3. スケジュールの箇所をタップすると、指定されていたページに遷移します(図1)(※リマインダーがバックグラウンドで動いている必要があります)。
  4. リマインダーの設定画面のままで1分経過するとダイアログは起動しますが、タップしても指定されたページには遷移しません(図1)。
  5. リマインダーはメインのページ上にダイアログが起動するだけですので、バックグラウンドで動いてない場合は、ダイアログが消えてメインのページが表示されるだけになります。
 図1:リマインダーを設定すると、指定した時刻にスケジュールを通知してくれる(クリックで拡大)

サンプル一式は、会員限定特典としてダウンロードできます。記事末尾をご確認ください。

実機(IS12T)で動かした動画はこちら

(*)実際には音が鳴ってスケジュールを知らせてくれますが、動画では音は録音されておりません。

プロジェクトの作成

VS 2010のメニューから[ファイル(F)/新規作成(N)/プロジェクト(P)]と選択します。

次に、「Windows Phone アプリケーション」を選択して、「名前(N)」に任意のプロジェクト名を指定します。ここでは「WP71_ Reminder」という名前を付けています。Windows Phoneのバージョンは7.1を選択します。

VS2010メニューの「プロジェクト(P)/参照の追加(R)」と選択してSystem.Xml.Linqを追加しておいてください。また、リスト1のXML文書ファイル(Reminder.xml)も作成しておいてください。ダウンロードされたサンプルファイルには、これらのファイルは追加済みです。

リスト1 XML文書ファイル(Reminder.xml)

<?xml version="1.0" encoding="utf-8" ?>
<plan>
  <info>
    <title>打ち合わせ</title>
    <contents>午後1時よりXML株式会社で打ち合わせ。</contents>
    <comment>資料作成を忘れないこと</comment>
  </info>
 
  <info>
    <title>面接</title>
    <contents>午後3時より募集人員の面接</contents>
    <comment>よく人物を見て選ぶこと</comment>
  </info>
 
  <info>
    <title>送別会</title>
    <contents>午後7時より移動社員の送別会</contents>
    <comment>時間厳守。会費4000円</comment>
  </info>
</plan>

MainPage.xamlの編集とコントロールの追加

LayoutRootという名前を持つ要素のBackground(背景色)プロパティにWhiteを指定して、背景を白にします。

すると、ApplicationTitleやPageTitleという名前を持つTextBlockの文字が見えなくなりますので、Foreground(文字色)にBlackを指定します。PageTitleのTextプロパティには「Reminderを設定する」と指定します。

TextBlockのStyleプロパティに指定されているPhoneTextTitle1Styleでは、文字サイズが大きすぎるので、PhoneTextTitle2Styleを指定して文字サイズを小さくします。これらのスタイルは下記URLの「Theme Resources for Windows Phone」で定義されています。
{StaticResource}を使用して、これらのテーマリソースを参照します。
→参照:Theme Resources for Windows Phone(msdn)

ツールボックスからListBoxコントロールを1個配置します。ListBoxのForeground(文字色)にはNavyを指定します(図2)。

 図2:ListBoxコントロールを配置した(クリックで拡大)

書き出されるXAMLコードは省略します。

次に、MainPage.xamlを展開して表示されるMainPage.xaml.vbをダブルクリックして、リスト2のコードを記述します。

ロジックコードを記述する

リスト2 (MainPage.xaml.vb)

Option Strict On
Imports System.Xml.Linq

Windows Phoneのスケジューラ機能へのアクセスを提供し、アラーム、通知、およびバックグラウンドエージェントが含まれるMicrosoft.Phone.Scheduler名前空間をインポートします。

Imports Microsoft.Phone.Scheduler
Partial Public Class MainPage
  Inherits PhoneApplicationPage

  ' コンストラクター
  Public Sub New()
    InitializeComponent()
  End Sub

XML要素を表すメンバ変数xmldocを宣言しておきます。

  Dim xmldoc As XElement

ページがアクティブになった時に呼び出されるメソッド

XElement.LoadメソッドでXML文書ファイル(Reminder.xml)を読み込みます。

次に、文字列型の新しいインスタンスであるリストオブジェクトtitleListを作成します。

Descendantsメソッドで、子孫要素であるすべての 要素のコレクションに対して、各要素を変数resultに格納しながら、要素の値を、titleListオブジェクトにAddメソッドで追加していきます。

ListBoxのItemsSourceプロパティにtitleListオブジェクトを指定します。これで、Reminder.xmlの

要素の内容テキストが、ListBox内に一覧で表示されます。 <pre class="brush: plain" type="syntaxhighlighter"> Protected Overrides Sub OnNavigatedTo(e As System.Windows.Navigation.NavigationEventArgs) xmldoc = XElement.Load("reminder.xml") Dim titleList As New List(Of String) For Each result In From c In xmldoc.Descendants("info") Select c titleList.Add(result.Element("title").Value) Next ListBox1.ItemsSource = titleList MyBase.OnNavigatedTo(e) End Sub </pre> <h4>ListBoxから任意の項目が選択された時の処理</h4> <p>Reminderを設定した旨のメッセージを表示します。</p> <p>ListBoxから、選択された項目のインデックスをmyIndex変数に格納しておきます。</p> <p>読み込んだXML文書のmyIndexに該当する、<info>要素の子要素<comment>の値を取得し、変数commentに格納します。この場合、Uri.EscapeDataStringを使って取得した<comment>要素の内容をエスケープしておく必要があります。</comment></comment></info></p> <p>ScheduledActionService.Findメソッドで、指定した名前のScheduledAction(この場合reminderSample)が見つかった場合は、RemoverメソッドでScheduledActionを削除します。</p> <p>reminderSampleというScheduledActionで初期化された、新しいReminderのインスタンス、myReminderオブジェクトを作成します。</p> <p>myReminderオブジェクトのプロパティを設定していきます。</p> <p>Titleプロパティに現在の「何年何月何日の予定」と指定します。Contentプロパティには、読み込んだXML文書ファイル(Reminder.xml)のmyIndexに該当する、<info>要素の子要素<contents>の、内容テキストを指定します。</contents></info></p> <p>BeginTimeには、アクションのスケジュールが開始する時刻を設定します。サンプルでは、1分を指定しているため、アプリが起動して1分後に通知が表示されます。</p> <p>ExpirationTimeには、アクションのスケジュールが期限切れになる時刻を設定します。サンプルでは2分後を指定しています。</p> <p>NavigationUriには、通知から起動された場合に、アプリケーションに渡されるナビゲーション URI を設定します。このサンプルでは、これから作成するMessagePage.xamlに遷移します。その際、引数naiyouにcomment変数の値を渡します。</p> <p>RecurrenceTypeには、通知の繰り返しの種類を設定します。このサンプルでは、RecurrenceInterval.Noneと指定して、通知の繰り返しを「なし」としています。<br /> None以外に、「毎日繰り返す」Daily、「毎週繰り返す」Weekly、「毎月繰り返す」Monthly、「各月末に繰り返す」EndOfMonth、「毎年繰り返す」Yearlyなどがあります。</p> <p>ScheduledActionService.Addメソッドで、スケジュールされたアクション(myReminder)をオペレーティング システムに登録します。</p> <pre class="brush: plain" type="syntaxhighlighter"> Private Sub ListBox1_SelectionChanged(sender As Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox1.SelectionChanged MessageBox.Show("Reminderを設定しました。") Dim myIndex As Integer = ListBox1.SelectedIndex Dim comment As String = Uri.EscapeDataString(xmldoc.Descendants("info")(myIndex).Element("comment").Value) If ScheduledActionService.Find("reminderSample") Is Nothing = False Then ScheduledActionService.Remove("reminderSample") End If Dim myReminder As New Reminder("reminderSample") With myReminder .Title = DateTime.Now.ToString("yyyy年MM月dd日") & "の予定" .Content = xmldoc.Descendants("info")(myIndex).Element("contents").Value .BeginTime = DateTime.Now.AddMinutes(1) .ExpirationTime = DateTime.Now.AddMinutes(2) .NavigationUri = New Uri("/MessagePage.xaml?naiyou=" & comment, UriKind.Relative) .RecurrenceType = RecurrenceInterval.None End With ScheduledActionService.Add(myReminder) End Sub End Class </pre> <h3>「Windows Phone 縦向きのページ」(MessagePage.xaml)の作成</h3> <p>VS2010メニューから「プロジェクト(P)/新しい項目の追加(W)」と選択し、「Windows Phone 縦向きのページ」を選択します。「名前(N)」にはMessagePage.xamlと入力します。</p> <h3>MessagePage.xamlの編集とコントロールの追加</h3> <p>ツールボックスからTextBlockコントロールを1個配置します。プロパティの[ブラシ]パネルにあるForegroundにRedを指定し、文字色を赤にします。[テキスト]パネルにある文字サイズを40、文字の回り込みを指定するTextWrappingにWrapと指定します(図3)。</p> <table cellspacing="10" style="width: 636px;"> <tbody> <tr> <td width="204"><a href="/sites/default/files/articles/359703.png" target="_blank"><img alt=" " src="/sites/default/files/articles/359703.png" style="width:200px;" /></a></td> <td><strong><span style="font-size: 12px;color: rgb(255, 140, 0);">図3:TextBlockコントロールを配置し、プロパティを設定した(クリックで拡大)</span></strong></td> </tr> </tbody> </table> <p>書き出されるXAMLコードは省略します。</p> <p>次に、MessagePage.xamlを展開して表示される、MessagePage.xaml.vbをダブルクリックして、リスト3のコードを記述します。</p> <h3>ロジックコードを記述する</h3> <h4>リスト3 (MessagePage.xaml.vb)</h4> <pre class="brush: plain" type="syntaxhighlighter">Option Strict On Partial Public Class MessagePage Inherits PhoneApplicationPage Public Sub New() InitializeComponent() End Sub </pre> <h4>ページがアクティブになった時に呼び出されるメソッド</h4> <p>MainPage.xamlから渡された文字データを受け取ります。文字データはNavigationContextのQueryStringにDictionary として提供されます。</p> <p>ContainsKeyメソッドで、指定したキー(この場合naiyou)が Dictionary に格納されているかどうかを判断します。格納されている場合は、送信時のキーワード(この場合naiyou)を基に渡された文字列情報の値(myParam(“naiyou”))を取得し、TextBlockにその値を表示します。</p> <pre class="brush: plain" type="syntaxhighlighter"> Protected Overrides Sub OnNavigatedTo(e As System.Windows.Navigation.NavigationEventArgs) Dim myParam As IDictionary(Of String, String) = NavigationContext.QueryString If myParam.ContainsKey("naiyou") = True Then TextBlock1.Text = myParam("naiyou") End If MyBase.OnNavigatedTo(e) End Sub End Class </pre>
  • リマインダーアプリのサンプル

  • アラームアプリのサンプル

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています