2. 追加したプロジェクトを元プロジェクトの参照に追加する
バックグラウンドタスクの処理を記述する前に、処理を行うプロジェクト(追加したプロジェクト)を元のプロジェクトの参照に追加します。
元のプロジェクトの「参照設定」を右クリック→「参照の追加」をクリックします。
新しく追加したプロジェクトをチェックして参照に追加します。
3. 追加したプロジェクトのコードを修正する
追加したプロジェクトのClass1.csを、以下のように修正します。
public sealed class Class1 : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
// タイムゾーンの変更を保存する
var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
localSettings.Values["text"] = String.Format("タイムゾーンが{0}に変更されました", TimeZoneInfo.Local.DisplayName);
deferral.Complete();
}
}
バックグランドでタイムゾーンを取得して保存しています。
今回はタイムゾーンの変更をトリガーとしたTimeZoneChangeを利用するつもりなので、これで変更されたタイムゾーンをバックグラウンドで取得して保存できます。
4. マニフェストファイルを修正する
元のプロジェクト(ストアアプリ側)のマニフェストファイル(Package.appxmanifest)の宣言タブに、バックグラウンドタスクを追加します。
左側の「使用可能な宣言」からバックグラウンドタスクを選択し、「追加」をクリックします。
「サポートされる宣言」に追加されたバックグラウンドタスクをクリックした状態で、プロパティを変更します。
サポートされるタスクの種類の「システムイベント」にチェックを入れて、エントリポイントにプロジェクト名.Class1と入力します。今回は新しく追加したプロジェクト名を「BackgroundTask」としましたので、エントリポイントには「BackgroundTask.Class1」と入力しました。
5.バックグラウンドタスクの呼び出し処理を追加する
最後にバックグラウンドタスクを呼び出す処理を、元のプロジェクト(ストアアプリのプロジェクト)に追加します。
MainPage.xaml.csを以下のように書き換えます。
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
/// <summary>
/// このページがフレームに表示されるときに呼び出されます。
/// </summary>
/// <param name="e">このページにどのように到達したかを説明するイベント データ。Parameter
/// プロパティは、通常、ページを構成するために使用します。</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// 現在のタイムゾーンを表示する
this.TimeZoneText.Text = TimeZoneInfo.Local.DisplayName;
// バックグラウンドタスクでタイムゾーンが変更されていたら取得する
var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
string str = localSettings.Values["text"] as string;
this.bgTimeZoneChangeText.Text = str;
// すでに登録してあるバックグラウンドタスクをいったん削除
if (BackgroundTaskRegistration.AllTasks.Count > 0)
{
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
task.Value.Unregister(true);
}
}
// トリガーを設定する
var trigger = new SystemTrigger(SystemTriggerType.TimeZoneChange, false);
var builder = new BackgroundTaskBuilder();
builder.Name = "SampleTask";
builder.TaskEntryPoint = "BackgroundTask.Class1";
builder.SetTrigger(trigger);
builder.Register();
}
}


