次の方法で共有


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

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

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

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

タイム トリガーを作成する

新しい TimeTrigger を作成します。 2 番目のパラメーター OneShot は、バックグラウンド タスクを 1 回だけ実行するか、定期的に実行し続けるかを指定します。 OneShot が true に設定されている場合、最初のパラメーター (FreshnessTime) は、バックグラウンド タスクをスケジュールする前に待機する分数を指定します。 OneShot false に設定されている場合、FreshnessTime バックグラウンド タスクを実行する頻度を指定します。

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

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

  • FreshnessTime が 15 分に設定され、OneShot が false の場合、タスクは登録されてから 15 分から 30 分の間に 15 分ごとに実行されるようにスケジュールされます。 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 に設定されているため、トリガーされると、タスクはユーザーがアクティブになった後にのみ実行されます。 使用可能な条件の一覧については、「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() メソッドの定義を確認するには、「バックグラウンド タスクを登録する」を参照してください。

Von Bedeutung

アプリと同じプロセスで実行されるバックグラウンド タスクの場合は、 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 以降では、バックグラウンド タスクを利用するために、ユーザーがロック画面にアプリを追加する必要がなくなりました。

バックグラウンド タスクは、最初に RequestAccessAsync を呼び出した場合にのみ TimeTrigger を使用して実行されます。