Compartir a través de


Convertir un servicio de aplicaciones para que se ejecute en el mismo proceso que su aplicación host

Una appServiceConnection permite a otra aplicación reactivar la aplicación en segundo plano e iniciar una línea directa de comunicación con ella.

Con la introducción de App Services en proceso, dos aplicaciones en primer plano en ejecución pueden tener una línea directa de comunicación a través de una conexión de App Service. App Services ahora se puede ejecutar en el mismo proceso que la aplicación en primer plano, lo que facilita mucho la comunicación entre aplicaciones y elimina la necesidad de separar el código de servicio en un proyecto independiente.

Convertir un modelo fuera de proceso de App Service en un modelo en proceso requiere dos cambios. La primera es un cambio de manifiesto.

<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 ahora OnBackgroundActivated() es el punto de entrada que se usará cuando se invoque el servicio de aplicaciones.

El segundo cambio consiste en mover la lógica del servicio de su proyecto de tarea en segundo plano independiente a métodos a los que se puede llamar desde OnBackgroundActivated().

Ahora la aplicación puede ejecutar directamente app Service. Por ejemplo, en App.xaml.cs:

[! NOTA] El código siguiente es diferente del proporcionado por ejemplo 1 (servicio fuera de proceso). El código siguiente se proporciona solo con fines ilustrativos y no debe usarse como parte del ejemplo 2 (servicio en proceso). Para continuar con la transición del artículo del ejemplo 1 (servicio fuera del proceso) al ejemplo 2 (servicio en proceso), siga usando el código proporcionado por ejemplo 1 en lugar del código ilustrativo siguiente.

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 OnBackgroundActivated método controla la activación de App Service. Todos los eventos necesarios para la comunicación a través de AppServiceConnection se registran y el objeto de aplazamiento de tareas se almacena para que se pueda marcar como completo cuando se realice la comunicación entre las aplicaciones.

Cuando la aplicación recibe una solicitud y lee el ValorSet proporcionado para ver si las Key cadenas y Value están presentes. Si están presentes, app service devuelve un par de valores de Response cadena y True a la aplicación en el otro lado de AppServiceConnection.

Obtenga más información sobre cómo conectarse y comunicarse con otras aplicaciones en Creación y consumo de una instancia de App Service.