次の方法で共有


アプリ内からバックグラウンド タスクをトリガーする

ApplicationTrigger を使用して、アプリ内からバックグラウンド タスクをアクティブ化する方法について説明します。

アプリケーション トリガーを作成する方法の例については、この の例を参照してください。

このトピックでは、アプリケーションからアクティブ化するバックグラウンド タスクがあることを前提としています。 バックグラウンド タスクがまだない場合は、BackgroundActivity.csにサンプルのバックグラウンド タスクがあります。 または、「プロセス外のバックグラウンド タスク を作成して登録する」の手順に従って、作成してください。

アプリケーション トリガーを使用する理由

ApplicationTrigger を使用して、フォアグラウンド アプリとは別のプロセスでコードを実行します。 ApplicationTrigger は、ユーザーがフォアグラウンド アプリを閉じた場合でも、バックグラウンドで実行する必要がある作業がアプリにある場合に適しています。 アプリを閉じたときにバックグラウンド処理を停止する場合、またはフォアグラウンド プロセスの状態に関連付ける必要がある場合は、代わりに拡張実行 使用する必要があります。

アプリケーション トリガーを作成する

新しい ApplicationTriggerを作成します。 次のスニペットのように、フィールドに格納できます。 これは便宜上、トリガーを通知するときに新しいインスタンスを作成する必要がないようにするためです。 ただし、任意の ApplicationTrigger インスタンスを使用してトリガーを通知できます。

// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
_AppTrigger = new ApplicationTrigger();
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
Windows::ApplicationModel::Background::ApplicationTrigger _AppTrigger;
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
ApplicationTrigger ^ _AppTrigger = ref new ApplicationTrigger();

(省略可能)条件を追加する

バックグラウンド タスク条件を作成して、タスクの実行タイミングを制御できます。 条件により、条件が満たされるまでバックグラウンド タスクが実行されなくなります。 詳細については、「バックグラウンド タスクを実行するための条件を設定する」を参照してください。

この例では、条件が InternetAvailable に設定されているため、トリガーされると、タスクはインターネット アクセスが使用可能になった後にのみ実行されます。 使用可能な条件の一覧については、「SystemConditionType参照してください。

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

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

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() メソッドの定義を確認するには、「バックグラウンド タスクを登録する」を参照してください。

アプリケーション トリガーを使用してフォアグラウンド プロセスの有効期間を延長することを検討している場合は、代わりに拡張実行 使用することを検討してください。 アプリケーション トリガーは、作業を行うために個別にホストされるプロセスを作成するために設計されています。 次のコード スニペットは、プロセス外のバックグラウンド トリガーを登録します。

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example application trigger";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example application trigger" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example application trigger";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);

バックグラウンド タスク登録パラメーターは、登録時に検証されます。 登録パラメーターのいずれかが無効な場合は、エラーが返されます。 バックグラウンド タスクの登録が失敗するシナリオをアプリが適切に処理していることを確認します。代わりに、アプリがタスクの登録を試みた後に有効な登録オブジェクトを持つことに依存している場合は、クラッシュする可能性があります。

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

バックグラウンド タスクをトリガーする前に、BackgroundTaskRegistration 使用して、バックグラウンド タスクが登録されていることを確認します。 すべてのバックグラウンド タスクが登録されていることを確認する良いタイミングは、アプリの起動時です。

ApplicationTrigger.RequestAsync呼び出してバックグラウンド タスクをトリガーします。 どの ApplicationTrigger インスタンス でも構いません。

ApplicationTrigger.RequestAsync は、バックグラウンド タスク自体から呼び出すことはできません。また、アプリがバックグラウンド実行状態の場合にもできません (アプリケーションの状態の詳細については、「アプリのライフサイクル」を参照してください)。 アプリがバックグラウンド アクティビティを実行できないようにするエネルギーポリシーまたはプライバシー ポリシーをユーザーが設定している場合は、DisabledByPolicy 返される場合があります。 また、一度に実行できる AppTrigger は 1 つだけです。 別のアプリが既に実行されている間に AppTrigger を実行しようとすると、関数は CurrentlyRunning返します。

var result = await _AppTrigger.RequestAsync();

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

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

  • メモリ: アプリのメモリとエネルギーの使用を調整することは、オペレーティング システムでバックグラウンド タスクを実行できるようにするための鍵となります。 メモリ管理 API を使用して、バックグラウンド タスクで使用されているメモリの量を確認します。 バックグラウンド タスクで使用されるメモリが多いほど、別のアプリがフォアグラウンドにあるときに OS の実行を維持するのが困難になります。 ユーザーは最終的に、アプリが実行できるすべてのバックグラウンド アクティビティを制御し、アプリがバッテリーの使用に与える影響を可視化します。
  • CPU 時間: バックグラウンド タスクは、トリガーの種類に基づいて取得されるウォール クロックの使用時間の量によって制限されます。 アプリケーション トリガーによってトリガーされるバックグラウンド タスクは、約 10 分に制限されます。

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

注釈

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

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