kazuakix の日記

Windows Phone とか好きです

Windows Phone 8.1 でバックグラウンド タスクを作る

やっぱり Windows Phone アプリならライブ タイルを使わないとね。

という事で自動的にタイルを更新すべく以下を参考にしてバックグラウンド タスクを作っていきます。

バックグラウンド タスク用のクラスを作る

新しいプロジェクトを追加してバックグラウンド タスク用のクラスを作ります。
Phone 7 の頃は「スケジュールされたタスク エージェント」みたいなプロジェクトテンプレートがあったのですが、ユニバーサル アプリの場合は普通の (PCL) クラスライブラリのプロジェクトを選択します。 Windows ランタイム コンポーネントを選択します。

f:id:kazuakix:20141005160237j:plain,w500
 
新しいプロジェクトには IBackgroundTask インターフェイスを実装したクラスを追加します。また、IBackgroundTask に必要な Run メソッドも実装しておきます。

Run メソッドの中身は taskInstance.GetDeferral() で遅延を要求して、何らかの処理をした後 deferral.Complete() で完了を通知するような形になります。

namespace BackgroundTasks
{
    public sealed class TileUpdateTask : IBackgroundTask
    {
        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            // 遅延を要求
            var deferral = taskInstance.GetDeferral();
            // なんやかんや の処理
            deferral.Complete(); // 遅延の完了
        }
    }
}

 

バックグラウンド タスクを登録する

作成したバックグラウンド タスクはタスク名とエントリポイント、更新間隔を指定して登録します。
タスク名はタスクを識別するための適当な名前、エントリポイントはタスクが実行するためのクラス名 ("名前空間.クラス名" の形式で) になります。

また、既にタスクが登録済みの場合は事前に削除してやる必要があります。

public async void RegisterBackgroundTask(string taskName, string taskEntryPoint)
{
    // タスク登録前に必要
    await BackgroundExecutionManager.RequestAccessAsync();

    // 既存のタスクを削除
    foreach (var task in BackgroundTaskRegistration.AllTasks)
    {
        if (task.Value.Name == taskName)
        {
            task.Value.Unregister(true);
        }
    }

    // 新しいタスクを登録
    var taskBuilder            = new BackgroundTaskBuilder();
    taskBuilder.Name           = taskName;              // タスクの識別名
    taskBuilder.TaskEntryPoint = taskEntryPoint;        // タスクのエントリポイント
    taskBuilder.SetTrigger(new TimeTrigger(15, false));  // 15 分間隔
    var registration           = taskBuilder.Register();
}

※追記
@biac さんから追加するプロジェクトの種類の件、登録前に RequestAccessAsync が必要な件 指摘頂きました。ありがとうございました。
  

バックグラウンド タスクが登録されているか確認する

こうして登録されたタスクですが、本当に登録されているのか確認する必要があります。

Phone 7 の頃は設定の中に バックグラウンドタスク という項目があったのですが、Phone 8.1 には見当たりませんね。

実は Phone 8.1 の場合はバッテリーセーバー アプリで登録状況を確認することができます。(いや、これ気づかないだろ...)

f:id:kazuakix:20141004234906j:plain,w240

ともあれ、無事に登録されている事がわかりました。これでようやく中身を作り始めることができますね。