PR

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

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>
Think IT会員限定特典
  • リマインダーアプリのサンプル

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

四国の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のWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

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