アプリ内からのバックグラウンド タスクのトリガーTrigger a background task from within your app

ApplicationTrigger を使ってアプリ内からバックグラウンド タスクをアクティブ化する方法について説明します。Learn how to use the ApplicationTrigger to activate a background task from within your app.

アプリケーション、トリガーを作成する方法の例は、この参照してくださいします。For an example of how to create an Application trigger, see this example.

このトピックでは、アプリケーションからアクティブ化する必要のあるバックグラウンド タスクがあることを前提としています。This topic assumes that you have a background task that you want to activate from your application. まだバックグラウンド タスクがない場合は、BackgroundActivity.cs にサンプルのバックグラウンド タスクがあります。If you don't already have a background task, there is a sample background task at BackgroundActivity.cs. または、「アウトプロセス バックグラウンド タスクの作成と登録」の手順に従って、バックグラウンド タスクを作成してください。Or, follow the steps in Create and register an out-of-process background task to create one.

アプリケーション トリガーを使う理由Why use an application trigger

ApplicationTrigger は、フォアグラウンド アプリから別のプロセスのコードを実行するために使用します。Use an ApplicationTrigger to run code in a separate process from the foreground app. ApplicationTrigger は、ユーザーがフォアグラウンド アプリを閉じた場合でも、バックグラウンドで実行が必要な作業がある場合に適しています。An ApplicationTrigger is appropriate if your app has work that needs to be done in the background--even if the user closes the foreground app. アプリが閉じられたらバックグラウンド作業を停止する場合や、バックグラウンド作業がフォアグラウンド プロセスの状態に関連付けられている場合には、代わりに延長実行を使います。If background work should halt when the app is closed, or should be tied to the state of the foreground process, then Extended Execution should be used, instead.

アプリケーション トリガーの作成Create an application trigger

新しい ApplicationTrigger を作成します。Create a new ApplicationTrigger. これは、以下のスニペットで行われるように、フィールドに格納されます。You could store it in a field as is done in the snippet below. これは、トリガーに通知する場合に、後で新しいインスタンスを作成する必要がないようにするための利便性を考慮したものです。This is for convenience so that we don't have to create a new instance later when we want to signal the trigger. ただし、トリガーへの通知には、任意の ApplicationTrigger インスタンスを使用できます。But you can use any ApplicationTrigger instance to signal the trigger.

// _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();

(省略可能) 条件の追加(Optional) Add a condition

いつタスクを実行するかを制御するバックグラウンド タスクの条件を作成できます。You can create a background task condition to control when the task runs. 条件を指定すると、条件が満たされるまではバックグラウンド タスクが実行されないようにすることができます。A condition prevents the background task from running until the condition is met. 詳しくは、「バックグラウンド タスクを実行するための条件の設定」をご覧ください。For more information, see Set conditions for running a background task.

この例では、条件に設定されてInternetAvailableタスクはインターネット アクセスが使用可能なのみが実行されるため、1 回トリガーされると、します。In this example the condition is set to InternetAvailable so that, once triggered, the task only runs once internet access is available. 指定できる条件の一覧については、「SystemConditionType」をご覧ください。For a list of possible conditions, see SystemConditionType.

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

バックグラウンド トリガーの条件と種類について詳しくは、「バックグラウンド タスクによるアプリのサポート」をご覧ください。For more in-depth information on conditions and types of background triggers, see Support your app with background tasks.

RequestAccessAsync() の呼び出しCall RequestAccessAsync()

ApplicationTrigger バックグラウンド タスクを登録する前に、RequestAccessAsync を呼び出して、ユーザーが許可しているバックグラウンド アクティビティのレベルを判断します。これは、ユーザーがアプリのバックグラウンド アクティビティを無効にしている可能性があるためです。Before registering the ApplicationTrigger background task, call RequestAccessAsync to determine the level of background activity the user allows because the user may have disabled background activity for your app. ユーザーがバックグラウンド アクティビティの設定を制御する方法について詳しくは、「バックグラウンド アクティビティの最適化」を参照してください。See Optimize background activity for more information about the ways users can control the settings for background activity.

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
}

バックグラウンド タスクの登録Register the background task

バックグラウンド タスクの登録関数を呼び出してバックグラウンド タスクを登録します。Register the background task by calling your background task registration function. バックグラウンド タスクの登録と、以下のコード サンプルの RegisterBackgroundTask() メソッドの定義について詳しくは、「バックグラウンド タスクの登録」を参照してください。For more information on registering background tasks, and to see the definition of the RegisterBackgroundTask() method in the sample code below, see Register a background task.

アプリケーション トリガーを使用してフォアグラウンド プロセスの有効期間を延長することを検討している場合は、代わりに延長実行の使用を検討してください。If you are considering using an Application Trigger to extend the lifetime of your foreground process, consider using Extended Execution instead. アプリケーション トリガーは、作業を行うための個別にホストされたプロセスを作成することを目的としています。The Application Trigger is designed for creating a separately hosted process to do work in. 次のコード スニペットは、アウトプロセス バックグラウンド トリガーを登録します。The following code snippet registers an out-of-process background trigger.

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);

バックグラウンド タスクの登録パラメーターは登録時に検証されます。Background task registration parameters are validated at the time of registration. いずれかの登録パラメーターが有効でない場合は、エラーが返されます。An error is returned if any of the registration parameters are invalid. バックグラウンド タスクの登録が失敗するシナリオをアプリが適切に処理するようにします。タスクを登録しようとした後で、有効な登録オブジェクトを持っていることを前提として動作するアプリは、クラッシュする場合があります。Ensure that your app gracefully handles scenarios where background task registration fails - if instead your app depends on having a valid registration object after attempting to register a task, it may crash.

バックグラウンド タスクのトリガーTrigger the background task

バックグラウンド タスクをトリガーする前に、BackgroundTaskRegistration を使って、そのバックグラウンド タスクが登録されていることを確認します。Before you trigger the background task, use BackgroundTaskRegistration to verify that the background task is registered. すべてのバックグラウンド タスクが登録されていることを確認するのに適したタイミングは、アプリの起動中です。A good time to verify that all of your background tasks are registered is during app launch.

ApplicationTrigger.RequestAsync を呼び出してバックグラウンド タスクをトリガーします。Trigger the background task by calling ApplicationTrigger.RequestAsync. どの ApplicationTrigger インスタンスでも機能します。Any ApplicationTrigger instance will do.

ApplicationTrigger.RequestAsync は、バックグラウンド タスク自体からは呼び出すことができません。また、アプリがバックグラウンド実行状態にある場合も呼び出すことはできません (アプリケーションの状態について詳しくは「アプリのライフサイクル」を参照してください)。Note that ApplicationTrigger.RequestAsync can't be called from the background task itself, or when the app is in the background running state (see App lifecycle for more information about application states). アプリでバックグラウンド アクティビティが実行されないように電源ポリシーやプライバシー ポリシーが設定されている場合は、DisabledByPolicy が返される可能性があります。It may return DisabledByPolicy if the user has set energy or privacy policies that prevent the app from performing background activity. また、一度に実行できる AppTrigger は 1 つだけです。Also, only one AppTrigger can run at a time. AppTrigger の実行中に別の AppTrigger を実行しようとした場合、関数によって CurrentlyRunning が返されます。If you attempt to run an AppTrigger while another is already running, the function will return CurrentlyRunning.

var result = await _AppTrigger.RequestAsync();

バックグラウンド タスクのリソースの管理Manage resources for your background task

BackgroundExecutionManager.RequestAccessAsync を使用して、アプリのバックグラウンド アクティビティを制限するようにユーザーが設定しているかどうかを確認します。Use BackgroundExecutionManager.RequestAccessAsync to determine if the user has decided that your app’s background activity should be limited. バッテリー使用量を注意し、ユーザーが望む操作を完了するために必要な場合にのみ、バックグラウンドで実行するようにしてください。Be aware of your battery usage and only run in the background when it is necessary to complete an action that the user wants. ユーザーがバックグラウンド アクティビティの設定を制御する方法について詳しくは、「バックグラウンド アクティビティの最適化」を参照してください。See Optimize background activity for more information about the ways users can control the settings for background activity.

  • メモリ:チューニングにアプリのメモリとエネルギーの使用は、オペレーティング システムで、バック グラウンド タスクを実行を許可することを保証するキーです。Memory: Tuning your app's memory and energy use is key to ensuring that the operating system will allow your background task to run. メモリ管理 API を使用して、バックグラウンド タスクが使用しているメモリ量を確認します。Use the Memory Management APIs to see how much memory your background task is using. バックグラウンド タスクが使用するメモリ量が多くなるほど、別のアプリがフォアグラウンドのときに、バックグラウンド タスクの実行を OS が維持することは難しくなります。The more memory your background task uses, the harder it is for the OS to keep it running when another app is in the foreground. アプリが実行できるすべてのバックグラウンド アクティビティについて、最終的に管理できるのはユーザーです。また、ユーザーは、アプリがどの程度バッテリー消費に影響しているかを確認できます。The user is ultimately in control of all background activity that your app can perform and has visibility on the impact your app has on battery use.
  • CPU 時間:バック グラウンド タスクは、トリガーの種類に基づいて、取得、ウォール クロック使用時間の量によって制限されます。CPU time: Background tasks are limited by the amount of wall-clock usage time they get based on trigger type. アプリケーション トリガーによってトリガーされるバックグラウンド タスクは、約 10 分間に制限されます。Background tasks triggered by the Application trigger are limited to about 10 minutes.

バックグラウンド タスクに適用されるリソースの制約については、「バックグラウンド タスクによるアプリのサポート」をご覧ください。See Support your app with background tasks for the resource constraints applied to background tasks.

注釈Remarks

Windows 10 以降の場合は、バック グラウンド タスクを利用するには、ロック画面にアプリを追加するユーザーのために必要な不要になった。Starting with Windows 10, it is no longer necessary for the user to add your app to the lock screen in order to utilize background tasks.

バックグラウンド タスクが ApplicationTrigger を使って実行されるのは、先に RequestAccessAsync を呼び出した場合のみです。A background task will only run using an ApplicationTrigger if you have called RequestAccessAsync first.