ホスト アプリと同じプロセスで実行するようにアプリ サービスを変換するConvert an app service to run in the same process as its host app

AppServiceConnection を使うと、別のアプリケーションがバック グラウンドでアプリをスリープ解除し、直接通信することができます。An AppServiceConnection enables another application to wake up your app in the background and start a direct line of communication with it.

インプロセスのアプリ サービスを導入することで、実行中の 2 つのフォアグラウンド アプリケーションはアプリ サービス接続経由で直接通信することができます。With the introduction of in-process App Services, two running foreground applications can have a direct line of communication via an app service connection. アプリ サービスをフォアグラウンド アプリケーションとして同じプロセスで実行できるようになったため、アプリ間の通信がかなり簡単になっただけでなく、サービス コードを別個のプロジェクトに分離する必要がなくなりました。App Services can now run in the same process as the foreground application which makes communication between apps much easier and removes the need to separate the service code into a separate project.

アウトプロセス モデルのアプリ サービスをインプロセス モデルに変換するには、2 つの変更が必要です。Turning an out-of-process model App Service into an in-process model requires two changes. 1 つ目は、マニフェストの変更です。The first is a manifest change.

<Package
   ...
  <Applications>
      <Application Id=...
          ...
          EntryPoint="...">
          <Extensions>
              <uap:Extension Category="windows.appService">
                  <uap:AppService Name="InProcessAppService" />
              </uap:Extension>
          </Extensions>
          ...
      </Application>
  </Applications>

削除、EntryPointから属性、<Extension>要素OnBackgroundActivated()は、エントリ ポイント、アプリ サービスが呼び出されたときに使用されるためです。Remove the EntryPoint attribute from the <Extension> element because now OnBackgroundActivated() is the entry point that will be used when the app service is invoked.

2 つ目の変更として、サービス ロジックを別個のバックグラウンド タスク プロジェクトから、OnBackgroundActivated() によって呼び出すことができるメソッドに移動します。The second change is to move the service logic from its separate background task project into methods that can be called from OnBackgroundActivated().

これで、アプリケーションがアプリ サービスを直接実行できるようになります。Now your application can directly run your App Service. たとえば、App.xaml.cs: でFor example, in App.xaml.cs:

[!NOTE] 次のコードでは、例 1 (アウト プロセス サービス) に使用したものよりも異なります。The code below is different than the one provided for example 1 (out-of-process service). 次のコードは提供のみを目的と、例 2 の一部であり、(インプロセス サービス) としては使用する必要があります。The code below is provided for illustration purposes only and should not be used as part of example 2 (in-process service). 例からの資料の移行を続行するには、は、例 2 (インプロセス サービス) に 1 (アウト プロセス サービス) 引き続き、次の例のコードではなく例 1 の提供されているコードを使用します。To continue the article’s transition from example 1 (out-of-process service) into example 2 (in-process service) continue to use the code provided for example 1 instead of the illustrative code below.

using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
...

sealed partial class App : Application
{
  private AppServiceConnection _appServiceConnection;
  private BackgroundTaskDeferral _appServiceDeferral;

  ...

  protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
  {
      base.OnBackgroundActivated(args);
      IBackgroundTaskInstance taskInstance = args.TaskInstance;
      AppServiceTriggerDetails appService = taskInstance.TriggerDetails as AppServiceTriggerDetails;
      _appServiceDeferral = taskInstance.GetDeferral();
      taskInstance.Canceled += OnAppServicesCanceled;
      _appServiceConnection = appService.AppServiceConnection;
      _appServiceConnection.RequestReceived += OnAppServiceRequestReceived;
      _appServiceConnection.ServiceClosed += AppServiceConnection_ServiceClosed;
  }

  private async void OnAppServiceRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
  {
      AppServiceDeferral messageDeferral = args.GetDeferral();
      ValueSet message = args.Request.Message;
      string text = message["Request"] as string;

      if ("Value" == text)
      {
          ValueSet returnMessage = new ValueSet();
          returnMessage.Add("Response", "True");
          await args.Request.SendResponseAsync(returnMessage);
      }
      messageDeferral.Complete();
  }

  private void OnAppServicesCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
  {
      _appServiceDeferral.Complete();
  }

  private void AppServiceConnection_ServiceClosed(AppServiceConnection sender, AppServiceClosedEventArgs args)
  {
      _appServiceDeferral.Complete();
  }
}

上記のコードでは、OnBackgroundActivated メソッドがアプリ サービスのアクティブ化を処理します。In the code above the OnBackgroundActivated method handles the app service activation. AppServiceConnection を通じた通信に必要なすべてのイベントが登録され、タスク保留オブジェクトが格納されて、アプリケーション間の通信が完了したときに完了とマークできるようになります。All of the events required for communication through an AppServiceConnection are registered, and the task deferral object is stored so that it can be marked as complete when the communication between the applications is done.

アプリが要求を読み取り、Key 文字列と Value 文字列が存在するかどうかを確認する ValueSet を読み取ります。When the app receives a request and reads the ValueSet provided to see if the Key and Value strings are present. 存在する場合、アプリ サービスは Response 文字列値と True 文字列値のペアを、AppServiceConnection のもう一方の側にあるアプリに戻します。If they are present then the app service returns a pair of Response and True string values back to the app on the other side of the AppServiceConnection.

他のアプリとの接続と通信について詳しくは、「アプリ サービスの作成と利用」をご覧ください。Learn more about connecting and communicating with other apps at Create and Consume an App Service.