Convertire un servizio app per l'esecuzione nello stesso processo della relativa app host

AppServiceConnection consente a un'altra applicazione di riattivare l'app in background e avviare una linea di comunicazione diretta con essa.

Con l'introduzione di Servizi app in-process, due applicazioni in primo piano in esecuzione possono avere una linea di comunicazione diretta tramite una connessione al servizio app. Servizi app ora possono essere eseguiti nello stesso processo dell'applicazione in primo piano che semplifica notevolmente la comunicazione tra app e rimuove la necessità di separare il codice del servizio in un progetto separato.

La trasformazione di un servizio app modello out-of-process in un modello in-process richiede due modifiche. Il primo è una modifica del manifesto.

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

Rimuovere l'attributo EntryPoint dall'elemento <Extension> perché ora OnBackgroundActivated() è il punto di ingresso che verrà usato quando viene richiamato il servizio app.

La seconda modifica consiste nello spostare la logica del servizio dal relativo progetto di attività in background separato in metodi che possono essere chiamati da OnBackgroundActivated().

Ora l'applicazione può eseguire direttamente il servizio app. Ad esempio, in App.xaml.cs:

[! NOTA] Il codice seguente è diverso da quello fornito, ad esempio 1 (servizio out-of-process). Il codice seguente viene fornito solo a scopo illustrativo e non deve essere usato come parte dell'esempio 2 (servizio in-process). Per continuare la transizione dell'articolo dall'esempio 1 (servizio out-of-process) all'esempio 2 (servizio in-process) continuare a usare il codice fornito ad esempio 1 anziché il codice illustrativo riportato di seguito.

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();
  }
}

Nel codice precedente il metodo OnBackgroundActivated gestisce l'attivazione del servizio app. Tutti gli eventi necessari per la comunicazione tramite un AppServiceConnection vengono registrati e l'oggetto differimento dell'attività viene archiviato in modo che possa essere contrassegnato come completo al termine della comunicazione tra le applicazioni.

Quando l'app riceve una richiesta e legge l'oggetto ValueSet fornito per verificare se le stringhe Key e Value sono presenti. Se sono presenti, il servizio app restituisce una coppia di valori stringa Response e True all'app dall'altra parte di AppServiceConnection.

Altre informazioni sulla connessione e la comunicazione con altre app sono disponibili in Creare e utilizzare un servizio app.