リマインダーとアラームを使うサンプル
今回は、指定した時刻にスケジュールを起動させることができるリマインダーサンプルと、カスタムサウンドが使えるアラームサンプルの、2つを紹介します。
リマインダーを使う
はじめに解説するリマインダーでは、指定した時刻にスケジュールやダイアログを起動させることができます。また、週1回、月1回など、定期的なスケジュールでの起動も可能です。サンプルの動作は下記の通りです。
- サンプルを起動して、リストボックスに表示されたスケジュールを選択し、リマインダーにセットします。
- その後、何か別なアプリを操作していると、1分後に音が鳴ってダイアログが起動し、スケジュールを通知してくれます。
- スケジュールの箇所をタップすると、指定されていたページに遷移します(図1)(※リマインダーがバックグラウンドで動いている必要があります)。
- リマインダーの設定画面のままで1分経過するとダイアログは起動しますが、タップしても指定されたページには遷移しません(図1)。
- リマインダーはメインのページ上にダイアログが起動するだけですので、バックグラウンドで動いてない場合は、ダイアログが消えてメインのページが表示されるだけになります。
図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という名前を持つ
すると、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メソッドで、子孫要素であるすべての
ListBoxのItemsSourceプロパティにtitleListオブジェクトを指定します。これで、Reminder.xmlの
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
ListBoxから任意の項目が選択された時の処理
Reminderを設定した旨のメッセージを表示します。
ListBoxから、選択された項目のインデックスをmyIndex変数に格納しておきます。
読み込んだXML文書のmyIndexに該当する、
ScheduledActionService.Findメソッドで、指定した名前のScheduledAction(この場合reminderSample)が見つかった場合は、RemoverメソッドでScheduledActionを削除します。
reminderSampleというScheduledActionで初期化された、新しいReminderのインスタンス、myReminderオブジェクトを作成します。
myReminderオブジェクトのプロパティを設定していきます。
Titleプロパティに現在の「何年何月何日の予定」と指定します。Contentプロパティには、読み込んだXML文書ファイル(Reminder.xml)のmyIndexに該当する、
BeginTimeには、アクションのスケジュールが開始する時刻を設定します。サンプルでは、1分を指定しているため、アプリが起動して1分後に通知が表示されます。
ExpirationTimeには、アクションのスケジュールが期限切れになる時刻を設定します。サンプルでは2分後を指定しています。
NavigationUriには、通知から起動された場合に、アプリケーションに渡されるナビゲーション URI を設定します。このサンプルでは、これから作成するMessagePage.xamlに遷移します。その際、引数naiyouにcomment変数の値を渡します。
RecurrenceTypeには、通知の繰り返しの種類を設定します。このサンプルでは、RecurrenceInterval.Noneと指定して、通知の繰り返しを「なし」としています。
None以外に、「毎日繰り返す」Daily、「毎週繰り返す」Weekly、「毎月繰り返す」Monthly、「各月末に繰り返す」EndOfMonth、「毎年繰り返す」Yearlyなどがあります。
ScheduledActionService.Addメソッドで、スケジュールされたアクション(myReminder)をオペレーティング システムに登録します。
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
「Windows Phone 縦向きのページ」(MessagePage.xaml)の作成
VS2010メニューから「プロジェクト(P)/新しい項目の追加(W)」と選択し、「Windows Phone 縦向きのページ」を選択します。「名前(N)」にはMessagePage.xamlと入力します。
MessagePage.xamlの編集とコントロールの追加
ツールボックスからTextBlockコントロールを1個配置します。プロパティの[ブラシ]パネルにあるForegroundにRedを指定し、文字色を赤にします。[テキスト]パネルにある文字サイズを40、文字の回り込みを指定するTextWrappingにWrapと指定します(図3)。
図3:TextBlockコントロールを配置し、プロパティを設定した(クリックで拡大) |
書き出されるXAMLコードは省略します。
次に、MessagePage.xamlを展開して表示される、MessagePage.xaml.vbをダブルクリックして、リスト3のコードを記述します。
ロジックコードを記述する
リスト3 (MessagePage.xaml.vb)
Option Strict On Partial Public Class MessagePage Inherits PhoneApplicationPage Public Sub New() InitializeComponent() End Sub
ページがアクティブになった時に呼び出されるメソッド
MainPage.xamlから渡された文字データを受け取ります。文字データはNavigationContextのQueryStringにDictionary として提供されます。
ContainsKeyメソッドで、指定したキー(この場合naiyou)が Dictionary に格納されているかどうかを判断します。格納されている場合は、送信時のキーワード(この場合naiyou)を基に渡された文字列情報の値(myParam(“naiyou”))を取得し、TextBlockにその値を表示します。
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
リマインダーアプリのサンプル
アラームアプリのサンプル