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

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 に設定されているため、トリガー後、インターネット アクセスが利用可能になった場合にタスクが 1 回だけ実行されます。 指定できる条件の一覧については、「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 の実行中に別の AppTrigger を実行しようとした場合、関数によって CurrentlyRunning が返されます。

var result = await _AppTrigger.RequestAsync();

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

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

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

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

注釈

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

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