バックグラウンド タスクを実行するための条件の設定

重要な API

バックグラウンド タスクをいつ実行するかを制御する条件の設定方法について説明します。

場合によっては、バックグラウンド タスクを正しく実行するために、特定の条件を満たす必要があります。 バックグラウンド タスクを登録するときに、SystemConditionType で指定される条件を 1 つ以上指定することができます。 条件がチェックされるのは、トリガーが発生した後です。 バックグラウンド タスクは、キューに入れられますが、必要な条件がすべて満たされるまでは実行されません。

バックグラウンド タスクに条件を設定すると、タスクが不必要に実行されなくなるため、バッテリー残量と CPU 実行時間が節約できます。 たとえば、バックグラウンド タスクがタイマーで実行され、インターネット接続が必要な場合は、タスクを登録する前に、InternetAvailable 条件を TaskBuilder に追加します。 これにより、タイマーの設定時間が経過し、かつインターネットが利用可能な場合にのみバックグラウンド タスクが実行されるため、タスクがシステム リソースやバッテリー残量を無駄に消費することはなくなります。

同じ TaskBuilderAddCondition を複数回呼び出すことで、複数の条件を組み合わせることもできます。 UserPresentUserNotPresent など競合する条件を追加しないように注意してください。

SystemCondition オブジェクトを作る

ここでは、既にバックグラウンド タスクがアプリと関連付けられており、アプリでは、taskBuilder という BackgroundTaskBuilder オブジェクトを作るためのコードが記述済みであることを前提とします。 最初にバックグラウンド タスクを作成する必要がある場合は、「インプロセス バックグラウンド タスクの作成と登録」または「アウトプロセス バックグラウンド タスクの作成と登録」をご覧ください。

このトピックの内容は、アウトプロセスで実行されるバックグラウンド タスク、およびフォアグラウンド アプリと同じプロセスで実行されるバックグラウンド タスクに適用されます。

条件を追加する前に、バックグラウンド タスクを実行するために有効にする必要のある条件を表す SystemCondition オブジェクトを作ります。 コンストラクターで、SystemConditionType 列挙値を渡して、必要な条件を指定します。

次のコードでは、InternetAvailable 条件を指定する SystemCondition オブジェクトを作成します。

SystemCondition internetCondition = new SystemCondition(SystemConditionType.InternetAvailable);
Windows::ApplicationModel::Background::SystemCondition internetCondition{
    Windows::ApplicationModel::Background::SystemConditionType::InternetAvailable };
SystemCondition ^ internetCondition = ref new SystemCondition(SystemConditionType::InternetAvailable);

SystemCondition オブジェクトをバックグラウンド タスクに追加する

条件を追加するには、BackgroundTaskBuilder オブジェクトで AddCondition メソッドを呼び出して、SystemCondition オブジェクトに渡します。

次のコードは、taskBuilder を使用して InternetAvailable 条件を追加します。

taskBuilder.AddCondition(internetCondition);
taskBuilder.AddCondition(internetCondition);
taskBuilder->AddCondition(internetCondition);

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

これで、バックグラウンド タスクを Register メソッドに登録できます。このバックグラウンド タスクは、指定した条件が満たされるまで、開始されません。

次のコードでは、タスクを登録し、生成される BackgroundTaskRegistration オブジェクトを保存します。

BackgroundTaskRegistration task = taskBuilder.Register();
Windows::ApplicationModel::Background::BackgroundTaskRegistration task{ recurringTaskBuilder.Register() };
BackgroundTaskRegistration ^ task = taskBuilder->Register();

注意

バックグラウンド タスクの登録パラメーターは登録時に検証されます。 いずれかの登録パラメーターが有効でない場合は、エラーが返されます。 バックグラウンド タスクの登録が失敗するシナリオをアプリが適切に処理するようにします。タスクを登録しようとした後で、有効な登録オブジェクトを持っていることを前提として動作するアプリは、クラッシュする場合があります。

バックグラウンド タスクに複数の条件を設定する

複数の条件を追加するには、アプリから メソッドを複数回呼び出します。 呼び出しは、タスクの登録が有効になる前に行う必要があります。

注意

1 つのバックグラウンド タスクに対して競合する条件を追加しないように注意してください。

次のスニペットは、バックグラウンド タスクを作り、登録するコンテキストでの複数の条件を示しています。

// Set up the background task.
TimeTrigger hourlyTrigger = new TimeTrigger(60, false);

var recurringTaskBuilder = new BackgroundTaskBuilder();

recurringTaskBuilder.Name           = "Hourly background task";
recurringTaskBuilder.TaskEntryPoint = "Tasks.ExampleBackgroundTaskClass";
recurringTaskBuilder.SetTrigger(hourlyTrigger);

// Begin adding conditions.
SystemCondition userCondition     = new SystemCondition(SystemConditionType.UserPresent);
SystemCondition internetCondition = new SystemCondition(SystemConditionType.InternetAvailable);

recurringTaskBuilder.AddCondition(userCondition);
recurringTaskBuilder.AddCondition(internetCondition);

// Done adding conditions, now register the background task.

BackgroundTaskRegistration task = recurringTaskBuilder.Register();
// Set up the background task.
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };

Windows::ApplicationModel::Background::BackgroundTaskBuilder recurringTaskBuilder;

recurringTaskBuilder.Name(L"Hourly background task");
recurringTaskBuilder.TaskEntryPoint(L"Tasks.ExampleBackgroundTaskClass");
recurringTaskBuilder.SetTrigger(hourlyTrigger);

// Begin adding conditions.
Windows::ApplicationModel::Background::SystemCondition userCondition{
    Windows::ApplicationModel::Background::SystemConditionType::UserPresent };
Windows::ApplicationModel::Background::SystemCondition internetCondition{
    Windows::ApplicationModel::Background::SystemConditionType::InternetAvailable };

recurringTaskBuilder.AddCondition(userCondition);
recurringTaskBuilder.AddCondition(internetCondition);

// Done adding conditions, now register the background task.
Windows::ApplicationModel::Background::BackgroundTaskRegistration task{ recurringTaskBuilder.Register() };
// Set up the background task.
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

auto recurringTaskBuilder = ref new BackgroundTaskBuilder();

recurringTaskBuilder->Name           = "Hourly background task";
recurringTaskBuilder->TaskEntryPoint = "Tasks.ExampleBackgroundTaskClass";
recurringTaskBuilder->SetTrigger(hourlyTrigger);

// Begin adding conditions.
SystemCondition ^ userCondition     = ref new SystemCondition(SystemConditionType::UserPresent);
SystemCondition ^ internetCondition = ref new SystemCondition(SystemConditionType::InternetAvailable);

recurringTaskBuilder->AddCondition(userCondition);
recurringTaskBuilder->AddCondition(internetCondition);

// Done adding conditions, now register the background task.
BackgroundTaskRegistration ^ task = recurringTaskBuilder->Register();

注釈

注意

バックグラウンド タスクが必要なときにのみ実行され、そうでない場合には実行されないようにするために、バックグラウンド タスクの条件を選んでください。 バックグラウンド タスクの各条件については、「SystemConditionType」をご覧ください。