Convertir un servicio de aplicaciones para que se ejecute en el mismo proceso que su aplicación hostConvert an app service to run in the same process as its host app

Un AppServiceConnection permite que otra aplicación reactive la aplicación en segundo plano e inicie una línea directa de comunicación con él.An AppServiceConnection enables another application to wake up your app in the background and start a direct line of communication with it.

Con la introducción App Services dentro del proceso, dos aplicaciones en ejecución en primer plano pueden tener una línea directa de comunicación a través de una conexión de App Services.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 ahora puede ejecutarse en el mismo proceso que la aplicación en primer plano, lo que hace que la comunicación entre aplicaciones resulte mucho más sencilla y elimina la necesidad de separar el código de servicio en un proyecto independiente.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.

La conversión de un App Service de modelo fuera del proceso a un modelo dentro del proceso requiere dos cambios.Turning an out-of-process model App Service into an in-process model requires two changes. El primero es un cambio de manifiesto.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>

Quite el EntryPoint atributo del <Extension> elemento porque Now OnBackgroundActivated () es el punto de entrada que se usará cuando se invoque App Service.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.

El segundo cambio consiste en mover la lógica de servicio de su proyecto de tarea en segundo plano independiente a métodos que se puedan llamar desde OnBackgroundActivated().The second change is to move the service logic from its separate background task project into methods that can be called from OnBackgroundActivated().

Ahora, tu aplicación puede ejecutar directamente el Servicio de aplicaciones.Now your application can directly run your App Service. Por ejemplo, en App.xaml.cs:For example, in App.xaml.cs:

[!NOTE] El código siguiente es diferente del proporcionado por el ejemplo 1 (servicio fuera de proceso).The code below is different than the one provided for example 1 (out-of-process service). El código siguiente se proporciona solo con fines ilustrativos y no debe usarse como parte del ejemplo 2 (servicio in-Process).The code below is provided for illustration purposes only and should not be used as part of example 2 (in-process service). Para continuar la transición del artículo del ejemplo 1 (servicio fuera de proceso) al ejemplo 2 (servicio en proceso), siga usando el código proporcionado por el ejemplo 1 en lugar del código ilustrativo a continuación.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();
  }
}

En el código anterior, el método OnBackgroundActivated controla la activación del servicio de aplicaciones.In the code above the OnBackgroundActivated method handles the app service activation. Se registran todos los eventos necesarios para la comunicación a través de AppServiceConnection y se almacena el objeto de aplazamiento de la tarea para que se pueda marcar como completado cuando haya finalizado la comunicación entre las aplicaciones.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.

Cuando la aplicación recibe una solicitud y lee la clase ValueSet proporcionada para ver si las cadenas Key y Value están presentes.When the app receives a request and reads the ValueSet provided to see if the Key and Value strings are present. Si están presentes, a continuación, el servicio de aplicaciones devuelve un par de valores de cadena Response y True de nuevo a la aplicación en el otro lado de 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.

Obtén más información sobre la conexión y la comunicación con otras aplicaciones en Crear y consumir un servicio de aplicación.Learn more about connecting and communicating with other apps at Create and Consume an App Service.