(本記事はVisualStudio2012RC+Windows8RP環境で確認しております。製品版では動作が異なる可能性があるのでご注意ください。)
バックグラウンドタスク2回目。
1回目はMetroStyleApp入門 vol42.BackgroundTaskを実行する(1)でTimeZoneの変更に合わせてタスクを実行する方法を紹介しました。
今回はタイマーイベントで一定時間後にバッググラウンドタスクを実行する方法を紹介します。
TimerTriggerはロック画面対応アプリを対象とするバックグラウンド タスクなので、利用する場合はマニフェストファイルに設定が必要になります。
宣言タブからバックグラウンドタスクを追加するところまではTimeZoneをトリガーとするケースと同じですが、プロパティはタイマーを指定します。
このままだとアプリケーションUIでエラーが出ますので、アプリケーションタブでロック画面の設定をしてあげます。
ロック画面通知にバッジを指定して、バッジロゴに24×24ピクセルの画像を指定します。
トースト対応はバックグラウンドでトースト通知を利用するため「はい」にしてありますが、利用しない場合はいいえのままで構いません。
続いてタスクの登録処理を記述します。
TimeTrigger trigger = new TimeTrigger(15, true);
var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = "SampleTask";
taskBuilder.TaskEntryPoint = "SampleTask.Class1";
taskBuilder.SetTrigger(trigger);
regist = taskBuilder.Register();
// ロック画面に表示する許可を求めるダイアログを表示する
await BackgroundExecutionManager.RequestAccessAsync();
regist.Completed += regist_Completed;
regist.Progress += regist_Progress;
実行するとバックグラウンドで実行するための許可が求められます。
ロック画面の表示については
などを参考にしてみてください。
エントリーポイントの”SampleTask.Class1″はMetroStyleApp入門 vol42.BackgroundTaskを実行する(1)で利用したものと同じで構いません。
タイマー処理は最短で15分後に実行されるように設定できます。
デバッグするにはセットして15分待つ必要があります。
タスクを設定する側から、バックグラウンド処理に値を渡したい場合があります。
その場合はローカルストレージにデータを渡します。
ローカルストレージの利用方法はMetroStyleApp入門 vol27.ローカルにデータを保存するを参考にしてみてください。
ローカルストレージを持ちた処理全文を記載します。
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
// 先に登録されたタスクをいったん削除する
if (BackgroundTaskRegistration.AllTasks.Count > 1)
{
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
task.Value.Unregister(true);
}
}
TimeTrigger trigger = new TimeTrigger(15, true);
var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = "SampleTask";
taskBuilder.TaskEntryPoint = "SampleTask.Class1";
taskBuilder.SetTrigger(trigger);
regist = taskBuilder.Register();
// ロック画面に表示する許可を求めるダイアログを表示する
await BackgroundExecutionManager.RequestAccessAsync();
regist.Completed += regist_Completed;
regist.Progress += regist_Progress;
var storage = Windows.Storage.ApplicationData.Current.LocalSettings;
if (!storage.Containers.ContainsKey("key"))
{
storage.CreateContainer("key", Windows.Storage.ApplicationDataCreateDisposition.Always);
}
storage.Values["key"] = "hoge";
}
呼び出される側、IBackgroundTaskをインプリメントしたClass1では以下のようにデータを取得します。
public void Run(IBackgroundTaskInstance taskInstance)
{
var storage = Windows.Storage.ApplicationData.Current.LocalSettings;
if (!storage.Containers.ContainsKey("key"))
{
storage.CreateContainer("key", Windows.Storage.ApplicationDataCreateDisposition.Always);
}
string str = storage.Values["key"] as string;
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
ToastTemplateType toastTemplate = ToastTemplateType.ToastText02;
XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
toastTextElements[0].AppendChild(toastXml.CreateTextNode(str));
toastTextElements[1].AppendChild(toastXml.CreateTextNode("Toast Description"));
ToastNotification toast = new ToastNotification(toastXml);
toast.ExpirationTime = DateTimeOffset.UtcNow.AddSeconds(30);
toast.Failed += toast_Failed;
ToastNotificationManager.CreateToastNotifier().Show(toast);
deferral.Complete();
return;
}
これで値を取得することができました。
Please give us your valuable comment