インプロセス バックグラウンド タスクの作成と登録

重要な API

このトピックでは、アプリと同じプロセスで実行されるバックグラウンド タスクを作成して登録する方法について説明します。

インプロセスのバック グラウンド タスクはアウトプロセスのバック グラウンド タスクよりも実装が簡単です。 ただし、インプロセスのバックグラウンド タスクでは回復力が低下します。 インプロセスのバックグラウンド タスクで実行中のコードがクラッシュすると、アプリがダウンします。 また、DeviceUseTriggerDeviceServicingTriggerIoTStartupTask はインプロセス モデルで使用できないことに注意してください。 アプリケーション内で VoIP バックグラウンド タスクをアクティブ化することもできません。 これらのトリガーとタスクは、アウトプロセスのバックグラウンド タスク モデルを使用してサポートされています。

バックグラウンド アクティビティは、実行時間制限を超えて実行された場合に、アプリのフォアグラウンド プロセス内で実行されているときでも終了できます。 特定の目的では、別のプロセスで実行するバックグラウンド タスクに作業を分離した場合の回復性が有用です。 バックグラウンドの作業をフォアグラウンド アプリケーションとは別のタスクとして保持することは、フォアグラウンド アプリケーションとの通信を必要としない作業にとって最適なオプションである可能性があります。

Fundamentals

インプロセス モデルでは、アプリがフォアグラウンドまたはバックグラウンドで実行されるときの改善された通知によってアプリケーションのライフサイクルが強化されます。 これらの切り替え用に、Application オブジェクトから EnteredBackgroundLeavingBackground という 2 つの新しいイベントを使用できます。 これらのイベントは、アプリケーションの表示状態に基づくアプリケーションのライフサイクルに適合します。これらのイベントの詳細とアプリケーションのライフサイクルに与える影響については、アプリのライフサイクルをご覧ください。

大まかに言うと、EnteredBackground イベントは、アプリがバックグラウンドで実行されている間に実行されるコードを実行します。また、LeavingBackground イベントは、アプリがフォアグラウンドに移動したことを知るために処理します。

バックグラウンド タスク トリガーを登録する

インプロセスのバックグラウンド アクティビティの登録は、アウトプロセスのバックグラウンド アクティビティを登録する方法とほぼ同じです。 すべてのバックグラウンド トリガーは、BackgroundTaskBuilder を使用した登録から始まります。 ビルダーを使用すると、必要なすべての値を 1 か所で設定できるため、簡単にバックグラウンド タスクを登録できます。

var builder = new BackgroundTaskBuilder();
builder.Name = "My Background Trigger";
builder.SetTrigger(new TimeTrigger(15, true));
// Do not set builder.TaskEntryPoint for in-process background tasks
// Here we register the task and work will start based on the time trigger.
BackgroundTaskRegistration task = builder.Register();

注意

ユニバーサル Windows アプリは、どの種類のバックグラウンド トリガーを登録する場合でも、先に RequestAccessAsync を呼び出す必要があります。 更新プログラムのリリース後にユニバーサル Windows アプリが引き続き適切に実行されるようにするには、更新後にアプリが起動する際に、RemoveAccessRequestAccessAsync の順に呼び出す必要があります。 詳しくは、「バックグラウンド タスクのガイドライン」をご覧ください。

インプロセス バックグラウンド アクティビティの場合は、[空白のままにする] を設定 TaskEntryPoint. しないと、 OnBackgroundActivated() という Application オブジェクトの新しい保護されたメソッドである既定のエントリ ポイントが有効になります。

登録したトリガーは、SetTrigger メソッドで設定されたトリガーの種類に基づいて発生します。 上記の例では、TimeTrigger が使用されています。これは、登録された時点から 15 分後に発生します。

どのようなときにタスクを実行するかという条件を追加する (省略可能)

トリガー イベントの発生後、どのようなときにタスクを実行するかという条件を追加することもできます。 たとえば、ユーザーが存在するときにだけタスクを実行する場合、UserPresent という条件を使います。 指定できる条件の一覧については、「SystemConditionType」をご覧ください。

次のサンプル コードでは、"ユーザーの存在" を条件として割り当てています。

builder.AddCondition(new SystemCondition(SystemConditionType.UserPresent));

バックグラウンド アクティビティのコードを OnBackgroundActivated() に配置する

バックグラウンド アクティビティのコードを OnBackgroundActivated に配置して、発生したバックグラウンド トリガーに応答します。 OnBackgroundActivated は、IBackgroundTask.Run と同様に処理することができます。 このメソッドには、Run メソッドで提供されるすべての情報が含まれる BackgroundActivatedEventArgs パラメーターがあります。 たとえば、App.xaml.cs では次のようになります。

using Windows.ApplicationModel.Background;

...

sealed partial class App : Application
{
  ...

  protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
  {
      base.OnBackgroundActivated(args);
      IBackgroundTaskInstance taskInstance = args.TaskInstance;
      DoYourBackgroundWork(taskInstance);  
  }
}

より豊富な OnBackgroundActivated の例については、「ホスト アプリと同じプロセスで実行するようにアプリ サービスを変換する」を参照してください。

バックグラウンド タスクの進捗状況と完了を処理する

タスクの進捗状況と完了は、マルチプロセスのバックグラウンド タスクの場合と同じ方法で監視できます (「バックグラウンド タスクの進捗状況と完了の監視」をご覧ください)。ただし、変数を使うと、より簡単にアプリで進捗状況または完了状態を追跡できます。 これは、アプリと同じプロセスでバックグラウンド アクティビティのコードを実行する利点の 1 つです。

バックグラウンド タスクの取り消しを処理する

インプロセスのバックグラウンド タスクは、アウトプロセスのバックグラウンド タスクの場合と同じ方法で取り消すことができます (「取り消されたバックグラウンド タスクの処理」をご覧ください)。 取り消しが発生する前に BackgroundActivated イベント ハンドラーを終了する必要があります。そうでないと、プロセス全体が終了します。 バックグラウンド タスクを取り消したときにフォアグラウンド アプリが予期せずに終了する場合は、取り消しが発生する前にハンドラーが終了していることを確認してください。

マニフェスト

アウトプロセスのバックグラウンド タスクとは異なり、インプロセスのバックグラウンド タスクを実行するためにパッケージ マニフェストにバックグラウンド タスクの情報を追加する必要はありません。

まとめと次のステップ

インプロセスのバックグラウンド タスクを作成する方法の基本を説明しました。

API リファレンス、バックグラウンド タスクの概念的ガイダンス、バックグラウンド タスクを使ったアプリの作成に関する詳しい説明については、次の関連するトピックをご覧ください。

バックグラウンド タスクに関する手順を詳しく説明するトピック

バックグラウンド タスクのガイダンス

バックグラウンド タスクの API リファレンス