インプロセス バックグラウンド タスクの作成と登録
重要な API
このトピックでは、アプリと同じプロセスで実行されるバックグラウンド タスクを作成して登録する方法について説明します。
インプロセス バックグラウンド タスクは、アウトプロセス バックグラウンド タスクよりも簡単に実装できます。 ただし、回復性は低くなります。 インプロセス バックグラウンド タスクで実行されているコードがクラッシュすると、アプリが停止します。 また、 DeviceUseTrigger、 DeviceServicingTrigger および IoTStartupTask はインプロセス モデルでは使用できないことに注意してください。 アプリケーション内で VoIP バックグラウンド タスクをアクティブ化することもできません。 これらのトリガーとタスクは、アウトプロセス バックグラウンド タスク モデルを使用して引き続きサポートされます。
バックグラウンド アクティビティは、アプリのフォアグラウンド プロセス内で実行されている場合でも、実行時間の制限を超えて実行すると終了する可能性があることに注意してください。 一部の目的では、別のプロセスで実行されるバックグラウンド タスクに作業を分離する回復性が引き続き役立ちます。 フォアグラウンド アプリケーションとは別のタスクとしてバックグラウンド作業を維持することが、フォアグラウンド アプリケーションとの通信を必要としない作業に最適なオプションである場合があります。
基礎
インプロセス モデルでは、アプリがフォアグラウンドまたはバックグラウンドにある場合の通知が改善され、アプリケーションのライフサイクルが強化されます。 これらの遷移のために Application オブジェクトから、 EnteredBackground と LeavingBackground の 2 つの新しいイベントを使用できます。 これらのイベントは、アプリケーションの可視性の状態に基づいてアプリケーションのライフサイクルに適合します。これらのイベントの詳細と、 App ライフサイクルでのアプリケーション ライフサイクルへの影響について説明します。
大まかに言うと、 EnteredBackground イベントを処理して、アプリがバックグラウンドで実行されている間に実行されるコードを実行し、 LeavingBackground を処理して、アプリがフォアグラウンドに移動したことを確認します。
バックグラウンド タスク トリガーを登録する
インプロセス バックグラウンド アクティビティは、アウトプロセス バックグラウンド アクティビティとほとんど同じように登録されます。 すべてのバックグラウンド トリガーは、 BackgroundTaskBuilder を使用した登録から始まります。 ビルダーを使用すると、必要なすべての値を 1 か所に設定することで、バックグラウンド タスクを簡単に登録できます。
var builder = new BackgroundTaskBuilder();
builder.Name = "My Background Trigger";
builder.SetTrigger(new TimeTrigger(15, true));
// Do not set builder.TaskEntryPoint for in-process background tasks
// Here we register the task and work will start based on the time trigger.
BackgroundTaskRegistration task = builder.Register();
Note
ユニバーサル Windows アプリは、どの種類のバックグラウンド トリガーを登録する場合でも、先に RequestAccessAsync を呼び出す必要があります。 更新プログラムのリリース後にユニバーサル Windows アプリが引き続き適切に実行されるようにするには、更新後にアプリが起動する際に、RemoveAccess、RequestAccessAsync の順に呼び出す必要があります。 詳しくは、「バックグラウンド タスクのガイドライン」をご覧ください。
インプロセス バックグラウンド アクティビティの場合、 TaskEntryPoint.
空白のままにしない場合、既定のエントリ ポイントが有効になります。Application オブジェクトの新しい保護メソッドは、 OnBackgroundActivated()。
トリガーが登録されると、 SetTrigger メソッドで設定されたトリガーの種類に基づいてトリガーが起動します。 上記の例では、 TimeTrigger が使用されています。これは、登録時から 15 分後に発生します。
タスクを実行するタイミングを制御する条件を追加する (省略可能)
トリガー イベントが発生した後にタスクを実行するタイミングを制御する条件を追加できます。 たとえば、ユーザーが存在するまでタスクを実行しない場合は、条件 UserPresentを使用します。 指定できる条件の一覧については、「SystemConditionType」をご覧ください。
次のサンプル コードでは、ユーザーが存在することを要求する条件を割り当てます。
builder.AddCondition(new SystemCondition(SystemConditionType.UserPresent));
バックグラウンド アクティビティ コードを OnBackgroundActivated() に配置する
バックグラウンド アクティビティのコードを OnBackgroundActivated に配置して、発生したバックグラウンド トリガーに応答します。 OnBackgroundActivated は、 IBackgroundTask.Run と同様に扱うことができます。 このメソッドには、Run メソッドで提供されるすべての情報が含まれる BackgroundActivatedEventArgs パラメーターがあります。 たとえば、App.xaml.cs では次のようになります。
using Windows.ApplicationModel.Background;
...
sealed partial class App : Application
{
...
protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
base.OnBackgroundActivated(args);
IBackgroundTaskInstance taskInstance = args.TaskInstance;
DoYourBackgroundWork(taskInstance);
}
}
より豊富な OnBackgroundActivated の例については、「ホスト アプリと同じプロセスで実行するようにアプリ サービスを変換する」を参照してください。
バックグラウンド タスクの進行状況と完了を処理する
タスクの進行状況と完了は、複数プロセスのバックグラウンド タスク ( バックグラウンド タスクの進行状況と完了の監視を参照) の場合と同じ方法で監視できますが、変数を使用してアプリの進行状況または完了状態を追跡することで、より簡単に追跡できる可能性があります。 これは、バックグラウンド アクティビティ コードをアプリと同じプロセスで実行する利点の 1 つです。
バックグラウンド タスクの取り消しを処理する
インプロセス バックグラウンド タスクは、プロセス外のバックグラウンド タスクと同じ方法で取り消されます ( 取り消されたバックグラウンド タスクを処理するを参照)。 BackgroundActivatedイベント ハンドラーは、キャンセルが発生する前に終了する必要があります。または、プロセス全体が終了されることに注意してください。 バックグラウンド タスクを取り消したときにフォアグラウンド アプリが予期せず終了した場合は、キャンセルが発生する前にハンドラーが終了したことを確認します。
マニフェスト
アウトプロセスバックグラウンドタスクとは異なり、インプロセスバックグラウンドタスクを実行するためにバックグラウンドタスク情報をパッケージマニフェストに追加する必要はありません。
まとめと次のステップ
インプロセス バックグラウンド タスクを記述する方法の基本を理解する必要があります。
API リファレンス、バックグラウンド タスクの概念ガイダンス、およびバックグラウンド タスクを使用するアプリを記述するための詳細な手順については、次の関連トピックを参照してください。
関連トピック
バックグラウンド タスクの詳細な説明トピック
- アウトプロセスのバックグラウンド タスクをインプロセスのバックグラウンド タスクへ変換
- アウトプロセス バックグラウンド タスクの作成と登録
- バックグラウンドでのメディアの再生
- バックグラウンド タスクによるシステム イベントへの応答
- バックグラウンド タスクの登録
- バックグラウンド タスクを実行するための条件の設定
- メンテナンス トリガーの使用
- 取り消されたバックグラウンド タスクの処理
- バックグラウンド タスクの進捗状況と完了の監視
- タイマーでのバックグラウンド タスクの実行
バックグラウンド タスクのガイダンス
バックグラウンド タスク API リファレンス