次の方法で共有


グループ背景タスクの登録

重要な API

BackgroundTaskRegistrationGroup クラス

バックグラウンド タスクをグループに登録できるようになりました。これは、論理名前空間と考えることができます。 この分離により、アプリのさまざまなコンポーネントや異なるライブラリが互いのバックグラウンド タスクの登録に干渉しないようにすることができます。

使用するアプリとフレームワーク (またはライブラリ) が同じ名前のバックグラウンド タスクを登録すると、アプリによってフレームワークのバックグラウンド タスクの登録が誤って削除される可能性があります。 アプリの作成者は、 BackgroundTaskRegistration.AllTasks を使用して登録されているすべてのバックグラウンド タスクの登録を解除できるため、フレームワークとライブラリのバックグラウンド タスクの登録を誤って削除する可能性もあります。 グループを使用すると、バックグラウンド タスクの登録を分離して、これが発生しないようにすることができます。

グループの機能

  • グループは GUID によって一意に識別できます。 また、デバッグ中に読みやすいフレンドリ名文字列を関連付けることもできます。
  • 複数のバックグラウンド タスクを 1 つのグループに登録できます。
  • グループに登録されているバックグラウンド タスクは、BackgroundTaskRegistration.AllTasksに表示されません。 したがって、現在、BackgroundTaskRegistration.AllTasks を使用してタスクの登録を解除しているアプリは、グループに登録されているバックグラウンド タスクの登録を誤って登録解除することはありません。 グループの一部として登録されているすべてのバックグラウンド トリガーの登録を解除する方法については、以下の グループ内のバックグラウンド タスクの登録を解除する を参照してください。
  • 各バックグラウンド タスク登録には、関連付けられているグループを決定する Group プロパティがあります。
  • In-Process バックグラウンド タスクをグループに登録すると、Application.OnBackgroundActivatedではなく、BackgroundTaskRegistrationGroup.BackgroundActivated イベントを通じてアクティブ化されます。

バックグラウンド タスクをグループに登録する

次に、バックグラウンド タスク (この例ではタイム ゾーンの変更によってトリガーされる) をグループの一部として登録する方法を示します。

private const string groupFriendlyName = "myGroup";
private const string groupId = "3F2504E0-4F89-41D3-9A0C-0305E82C3301";
private const string myTaskName = "My Background Trigger";

public static void RegisterBackgroundTaskInGroup()
{
   BackgroundTaskRegistrationGroup group = BackgroundTaskRegistration.GetTaskGroup(groupId);
   bool isTaskRegistered = false;

   // See if this task already belongs to a group
   if (group != null)
   {
       foreach (var taskKeyValue in group.AllTasks)
       {
           if (taskKeyValue.Value.Name == myTaskName)
           {
               isTaskRegistered = true;
               break;
           }
       }
   }

   // If the background task is not in a group, register it
   if (!isTaskRegistered)
   {
       if (group == null)
       {
           group = new BackgroundTaskRegistrationGroup(groupId, groupFriendlyName);
       }

       var builder = new BackgroundTaskBuilder();
       builder.Name = myTaskName;
       builder.TaskGroup = group; // we specify the group, here
       builder.SetTrigger(new SystemTrigger(SystemTriggerType.TimeZoneChange, false));

       // Because builder.TaskEntryPoint is not specified, OnBackgroundActivated() will be raised when the background task is triggered
       BackgroundTaskRegistration task = builder.Register();
   }
}

グループ内のバックグラウンド タスクの登録を解除する

グループの一部として登録されたバックグラウンド タスクの登録を解除する方法を次に示します。 グループに登録されているバックグラウンド タスク BackgroundTaskRegistration.AllTasksには表示されないため、グループを反復処理し、各グループに登録されているバックグラウンド タスクを見つけて、登録を解除する必要があります。

private static void UnRegisterAllTasks()
{
    // Unregister tasks that are part of a group
    foreach (var groupKeyValue in BackgroundTaskRegistration.AllTaskGroups)
    {
        foreach (var groupedTask in groupKeyValue.Value.AllTasks)
        {
            groupedTask.Value.Unregister(true); // passing true to cancel currently running instances of this background task
        }
    }

    // Unregister tasks that aren't part of a group
    foreach(var taskKeyValue in BackgroundTaskRegistration.AllTasks)
    {
        taskKeyValue.Value.Unregister(true); // passing true to cancel currently running instances of this background task
    }
}

永続的なイベントを登録する

バックグラウンド タスク登録グループをインプロセス バックグラウンド タスクと共に使用する場合、バックグラウンドアクティブ化は、Application オブジェクトまたは CoreApplication オブジェクト上のイベントではなく、グループのイベントに向けられます。 これにより、すべてのアクティブ化コード パスを Application オブジェクトに配置するのではなく、アプリ内の複数のコンポーネントでアクティブ化を処理できます。 グループのバックグラウンドでアクティブ化されたイベントに登録する方法を次に示します。 まず、BackgroundTaskRegistration.GetTaskGroup チェックして、グループが既に登録されているかどうかを確認します。 そうでない場合は、ID とフレンドリ名を使用して新しいグループを作成します。 次に、イベント ハンドラーをグループの BackgroundActivated イベントに登録します。

void RegisterPersistentEvent()
{
    var group = BackgroundTaskRegistration.GetTaskGroup(groupId);
    if (group == null)
    {
        group = new BackgroundTaskRegistrationGroup(groupId, groupFriendlyName);
    }

    group.BackgroundActivated += MyEventHandler;
}