Freigeben über


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

Ein AppServiceConnection ermöglicht es einer anderen Anwendung, Ihre App im Hintergrund zu reaktivieren und eine direkte Kommunikation mit ihr zu starten.

Mit der Einführung von In-Process App Services können zwei ausgeführte Vordergrundanwendungen über eine direkte Kommunikationslinie über eine App-Dienstverbindung verfügen. App Services kann jetzt im gleichen Prozess wie die Vordergrundanwendung ausgeführt werden, wodurch die Kommunikation zwischen Apps wesentlich einfacher wird und die Notwendigkeit entfernt wird, den Dienstcode in ein separates Projekt zu trennen.

Das Umwandeln eines Out-of-Process-Modell-App-Diensts in ein Prozessmodell erfordert zwei Änderungen. Der 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 beim Aufrufen des App-Diensts verwendet wird.

Die zweite Änderung besteht darin, die Dienstlogik aus dem separaten Hintergrundaufgabenprojekt in Methoden zu verschieben, die von OnBackgroundActivated()aufgerufen werden können.

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

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

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 Code oben behandelt die OnBackgroundActivated Methode die App-Dienstaktivierung. Alle Ereignisse, die für die Kommunikation über eine AppServiceConnection erforderlich sind, werden registriert, und das Aufgabenverzögerungsobjekt wird gespeichert, damit es als abgeschlossen gekennzeichnet werden kann, wenn die Kommunikation zwischen den Anwendungen erfolgt.

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

Erfahren Sie mehr über das Verbinden und Kommunizieren mit anderen Apps bei Create and Consume an App Service.