Partilhar via


Converter um serviço de app para ser executado no mesmo processo de seu app host

Um AppServiceConnection permite que outro aplicativo acorde seu aplicativo em segundo plano e inicie uma linha direta de comunicação com ele.

Com a introdução dos Serviços de Aplicativos em processo, dois aplicativos em primeiro plano em execução podem ter uma linha direta de comunicação por meio de uma conexão do serviço de aplicativo. Os Serviços de Aplicativos agora podem ser executados no mesmo processo que o aplicativo em primeiro plano, o que facilita muito a comunicação entre aplicativos e elimina a necessidade de separar o código de serviço em um projeto separado.

Transformar um modelo fora do processo Serviço de Aplicativo em um modelo em processo requer duas alterações. A primeira é uma mudança manifesta.

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

Remova o EntryPoint atributo do elemento porque agora OnBackgroundActivated() é o ponto de entrada que será usado quando o serviço de <Extension> aplicativo for invocado.

A segunda alteração é mover a lógica de serviço de seu projeto de tarefa em segundo plano separado para métodos que podem ser chamados de OnBackgroundActivated().

Agora, seu aplicativo pode executar diretamente o Serviço de Aplicativo. Por exemplo, em App.xaml.cs:

[! NOTE] O código abaixo é diferente do fornecido para o exemplo 1 (serviço fora do processo). O código abaixo é fornecido apenas para fins ilustrativos e não deve ser usado como parte do exemplo 2 (serviço em processo). Para continuar a transição do artigo do exemplo 1 (serviço fora do processo) para o exemplo 2 (serviço em processo), continue a usar o código fornecido para o exemplo 1 em vez do código ilustrativo abaixo.

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

No código acima, o método manipula OnBackgroundActivated a ativação do serviço de aplicativo. Todos os eventos necessários para a comunicação por meio de um AppServiceConnection são registrados e o objeto de adiamento de tarefa é armazenado para que possa ser marcado como concluído quando a comunicação entre os aplicativos for concluída.

Quando o aplicativo recebe uma solicitação e lê o ValueSet fornecido para ver se as Key cadeias de caracteres e Value estão presentes. Se eles estiverem presentes, o serviço de aplicativo retornará um par de valores de cadeia de Response caracteres e True de volta para o aplicativo do outro lado do AppServiceConnection.

Saiba mais sobre como se conectar e se comunicar com outros aplicativos em Criar e consumir um Serviço de Aplicativo.