タイマーでのバックグラウンド タスクの実行

TimeTrigger を使用して 1 回限りのバックグラウンド タスクをスケジュールする方法、または定期的なバックグラウンド タスクを実行する方法について説明します。

このトピックで説明する、時間でトリガーされるバックグラウンド タスクを実装する方法の例については、バックグラウンドのアクティブ化のサンプルScenario4 を参照してください。

このトピックは、定期的に、または特定の時刻に実行する必要があるバックグラウンド タスクがあることを前提にしています。 まだバックグラウンド タスクがない場合は、BackgroundActivity.cs にサンプルのバックグラウンド タスクがあります。 または、「インプロセス バックグラウンド タスクの作成と登録」または「アウトプロセス バックグラウンド タスクの作成と登録」の手順に従って作成してください。

時刻のトリガーを作る

新しい TimeTrigger を作ります。 2 つ目のパラメーター (OneShot) では、バックグラウンド タスクを一度だけ実行するか、または定期的に実行を続けるかを指定します。 OneShot を true に設定する場合は、1 つ目のパラメーター (FreshnessTime) に、バックグラウンド タスクをスケジュールするまで待機する時間 (分単位) を指定します。 OneShot を false に設定する場合は、FreshnessTime に、バックグラウンド タスクを実行する間隔を指定します。

デスクトップかモバイル デバイス ファミリを対象とするユニバーサル Windows プラットフォーム (UWP) アプリの組み込みタイマーは、15 分間隔でバックグラウンド タスクを実行します。 (要求された TimerTrigger を持つアプリを起動するためにシステムが 15 分に 1 回だけ起動すればよいように、タイマーは 15 分間隔で実行されます。これにより、電力が節約されます)。

  • FreshnessTime が 15 分に設定され、OneShot が true の場合、タスクは登録された時点から 15 ~ 30 分の間に一度実行されるようにスケジュールされます。 これが 25 分に設定され、OneShot が true の場合、タスクは登録された時点から 25 ~ 40 分の間に一度実行されるようにスケジュールされます。

  • FreshnessTime が 15 分に設定され、OneShot が false の場合、タスクは登録された時点から 15 ~ 15 分の間に実行され、その後 30 分ごとに実行されるようにスケジュールされます。 これが n 分に設定され、OneShot が false の場合、タスクは登録された時点から n ~ n + 15 分の間に実行され、その後 n 分ごとに実行されるようにスケジュールされます。

注意

FreshnessTime が 15 分未満に設定された場合、バックグラウンド タスクの登録が試行されたときに例外がスローされます。

たとえば、次のトリガーではバックグラウンド タスクは 1 時間に 1 回実行されます。

TimeTrigger hourlyTrigger = new TimeTrigger(60, false);
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

(省略可能) 条件の追加

いつタスクを実行するかを制御するバックグラウンド タスクの条件を作成できます。 条件を指定すると、条件が満たされるまではバックグラウンド タスクが実行されないようにすることができます。 詳しくは、「バックグラウンド タスクを実行するための条件の設定」をご覧ください。

この例では、条件が UserPresent に設定されているため、トリガー後、ユーザーがアクティブになった場合にタスクが 1 回だけ実行されます。 指定できる条件の一覧については、「SystemConditionType」をご覧ください。

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

バックグラウンド トリガーの条件と種類について詳しくは、「バックグラウンド タスクによるアプリのサポート」をご覧ください。

RequestAccessAsync() の呼び出し

ApplicationTrigger バックグラウンド タスクを登録する前に、RequestAccessAsync を呼び出して、ユーザーが許可しているバックグラウンド アクティビティのレベルを判断します。これは、ユーザーがアプリのバックグラウンド アクティビティを無効にしている可能性があるためです。 ユーザーがバックグラウンド アクティビティの設定を制御する方法について詳しくは、「バックグラウンド アクティビティの最適化」を参照してください。

var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
    // Depending on the value of requestStatus, provide an appropriate response
    // such as notifying the user which functionality won't work as expected
}

バックグラウンド タスクの登録

バックグラウンド タスクの登録関数を呼び出してバックグラウンド タスクを登録します。 バックグラウンド タスクの登録と、以下のコード サンプルの RegisterBackgroundTask() メソッドの定義について詳しくは、「バックグラウンド タスクの登録」を参照してください。

重要

アプリと同じプロセスで実行されるバックグラウンド タスクの場合は、entryPoint を設定しないでください。 アプリとは別のプロセスで実行されるバックグラウンド タスクの場合、entryPoint には、名前空間、'.'、バックグラウンド タスクの実装を含むクラスの名前を設定します。

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example hourly background task";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example hourly background task" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example hourly background task";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

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

バックグラウンド タスクのリソースの管理

BackgroundExecutionManager.RequestAccessAsync を使用して、アプリのバックグラウンド アクティビティを制限するようにユーザーが設定しているかどうかを確認します。 バッテリー使用量を注意し、ユーザーが望む操作を完了するために必要な場合にのみ、バックグラウンドで実行するようにしてください。 ユーザーがバックグラウンド アクティビティの設定を制御する方法について詳しくは、「バックグラウンド アクティビティの最適化」を参照してください。

  • メモリ: オペレーティング システムからバックグラウンド タスクの実行を許可されるうえで重要なのが、アプリのメモリと電力使用の調整です。 メモリ管理 API を使用して、バックグラウンド タスクが使用しているメモリ量を確認します。 バックグラウンド タスクが使用するメモリ量が多くなるほど、別のアプリがフォアグラウンドのときに、バックグラウンド タスクの実行を OS が維持することは難しくなります。 アプリが実行できるすべてのバックグラウンド アクティビティについて、最終的に管理できるのはユーザーです。また、ユーザーは、アプリがどの程度バッテリー消費に影響しているかを確認できます。
  • CPU 時間: バックグラウンド タスクは、トリガーの種類に基づいて取得するウォールクロック時間の長さによって使用が制限されます。

バックグラウンド タスクに適用されるリソースの制約については、「バックグラウンド タスクによるアプリのサポート」をご覧ください。

注釈

Windows 10 以降、ユーザーはバック グラウンド タスクを利用するために、アプリをロック画面に追加する必要はなくなりました。

バックグラウンド タスクが TimeTrigger を使って実行されるのは、先にRequestAccessAsync を呼び出した場合のみです。