Umwandeln eines App-Diensts für die Ausführung im gleichen Prozess wie die Host-App

Eine AppServiceConnection ermöglicht einer anderen Anwendung, Ihre App im Hintergrund zu aktivieren und einen direkten Kommunikationsweg mit ihr zu starten.

Mit der Einführung von In-Process-App-Diensten können zwei ausgeführte Vordergrundanwendungen einen direkten Kommunikationsweg über eine App-Dienst-Verbindung aufweisen. App-Dienste können jetzt im gleichen Prozess wie die Vordergrundanwendung ausgeführt werden. Die Kommunikation zwischen Apps wird dadurch sehr viel einfacher, während gleichzeitig die Notwendigkeit entfällt, den Dienstcode in ein separates Projekt zu trennen.

Um einen Out-of-Process-App-Dienst in ein In-Process-Modell zu konvertieren, sind zwei Änderungen erforderlich. Die erste ist eine Manifest-Änderung.

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

Entfernen Sie das EntryPoint Attribut aus dem <Extension> Element, da jetzt OnBackgroundActivated() der Einstiegspunkt ist, der verwendet wird, wenn der App-Dienst aufgerufen wird.

Die zweite Änderung besteht darin, die Dienstlogik aus ihrem eigenen Hintergrundaufgabenprojekt in Methoden zu verschieben, die über OnBackgroundActivated() aufgerufen werden können.

Jetzt kann Ihre Anwendung den App-Dienst direkt ausführen. Beispiel: In App.xaml.cs:

[! HINWEIS] Der folgende Code unterscheidet sich von dem code, der z. B. 1 (Out-of-Process-Dienst) bereitgestellt wird. Der folgende Code wird nur zu Veranschaulichungszwecken bereitgestellt und sollte nicht als Teil von Beispiel 2 (prozessinterner Dienst) verwendet werden. Um den Übergang des Artikels von Beispiel 1 (Out-of-Process-Dienst) in Beispiel 2 (prozessinterner Dienst) fortzusetzen, verwenden Sie weiterhin den code, der für Beispiel 1 bereitgestellt wird, anstelle des unten gezeigten Codes.

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

Im obigen Code steuert die OnBackgroundActivated-Methode die App-Dienst-Aktivierung. Alle Ereignisse, die für die Kommunikation über eine AppServiceConnection erforderlich sind, werden registriert, und das Aufgaben-Verzögerungsobjekt wird gespeichert, damit es nach Abschluss der Kommunikation zwischen den Anwendungen als abgeschlossen gekennzeichnet werden kann.

Wenn die App eine Anforderung empfängt, liest sie das zur Verfügung gestellte ValueSet, um festzustellen, ob die Zeichenfolgen Key und Value vorhanden sind. Wenn sie vorhanden sind, gibt der App-Dienst ein Wertepaar von Zeichenfolgen Response und True an die App auf der anderen Seite der AppServiceConnection zurück.

Weitere Informationen zum Herstellen einer Verbindung und Kommunizieren mit anderen Apps finden Sie unter Erstellen und Verwenden eines App-Diensts.