앱 서비스가 호스트 앱과 동일한 프로세스에서 실행되도록 변환

AppServiceConnection을 사용하면 다른 애플리케이션이 백그라운드에서 앱을 깨우고 해당 앱과의 직접 통신을 시작할 수 있습니다.

In-process App Services가 도입되면 실행 중인 포그라운드 애플리케이션 2개가 앱 서비스 연결을 통해 직접 통신할 수 있습니다. App Services는 이제 포그라운드 애플리케이션과 동일한 프로세스로 실행됩니다. 이로써 앱 간의 통신이 훨씬 쉬워지고, 서비스 코드를 별도의 프로젝트로 분리할 필요가 없게 됩니다.

Out-of-process 모델 App Service를 In-process 모델로 전환하려면 두 가지 변경이 필요합니다. 그 중 첫 번째는 매니페스트 변경입니다.

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

지금은 OnBackgroundActivated()가 앱 서비스를 호출할 때 사용되는 진입점이므로 <Extension> 요소에서 EntryPoint 특성을 제거합니다.

두 번째 변경은 서비스 논리를 별도의 백그라운드 작업 프로젝트에서 OnBackgroundActivated()로 호출할 수 있는 메서드로 이동시키는 것입니다.

이제 애플리케이션에서 App Service를 직접 실행할 수 있습니다. 예를 들어 App.xaml.cs에서:

[!참고] 아래 코드는 예제 1(프로세스 외 서비스)에 제공된 코드와 다릅니다. 아래 코드는 설명 목적으로만 제공되며 예제 2(프로세스 내 서비스)의 일부로 사용하면 안 됩니다. 예제 1(프로세스 외 서비스)에서 예제 2(프로세스 내 서비스)로 문서 전환을 계속하려면 아래 설명 코드 대신 예제 1에 제공된 코드를 계속 사용합니다.

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 메서드는 앱 서비스 활성화를 처리합니다. AppServiceConnection을 통한 통신에 필요한 이벤트가 모두 등록되고 작업 지연 개체가 저장되므로, 애플리케이션 간의 통신이 완료된 것으로 표시될 수 있습니다.

앱이 요청을 수신하고 제공된 ValueSet를 읽어서 Key 문자열과 Value 문자열이 있는지 확인합니다. 해당 문자열이 있는 경우, App Service는 ResponseTrue 문자열 값의 쌍을 AppServiceConnection의 반대쪽에 있는 앱에 도로 반환합니다.

다른 앱과 연결 및 통신하는 방법은 App Service 생성 및 사용에서 자세히 알아보세요.