Поделиться через


Преобразование службы приложений для запуска в одном процессе с ведущим приложением

AppServiceConnection позволяет другому приложению проснуться в фоновом режиме и начать прямую линию взаимодействия с ним.

При внедрении внутрипроцессных Служба приложений два запущенных приложения переднего плана могут иметь прямую линию связи через подключение службы приложений. Служба приложений теперь могут выполняться в том же процессе, что и приложение переднего плана, что упрощает взаимодействие между приложениями и удаляет необходимость разделения кода службы на отдельный проект.

Преобразование внепроцессной модели Служба приложений в модель в процессе требует двух изменений. Первое — это изменение манифеста.

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

EntryPoint Удалите атрибут из <Extension> элемента, так как теперь OnBackgroundActivated() является точкой входа, которая будет использоваться при вызове службы приложений.

Второе изменение — переместить логику службы из отдельного проекта фоновой задачи в методы, которые можно вызвать из OnBackgroundActivated().

Теперь приложение может напрямую запускать Служба приложений. Например, в App.xaml.cs:

[! ПРИМЕЧАНИЕ] Приведенный ниже код отличается от приведенного ниже кода, например 1 (внепроцессная служба). Приведенный ниже код предоставляется только для иллюстраций и не должен использоваться в качестве части примера 2 (внутрипроцессная служба). Чтобы продолжить переход статьи из примера 1 (внепроцессной службы) в пример 2 (внутрипроцессная служба), продолжайте использовать код, указанный например 1 вместо иллюстрированного кода ниже.

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

В приведенном выше коде OnBackgroundActivated метод обрабатывает активацию службы приложений. Все события, необходимые для обмена данными через AppServiceConnection , регистрируются, а объект отсрочки задачи хранится таким образом, чтобы он был помечен как полный при завершении обмена данными между приложениями.

Когда приложение получает запрос и считывает предоставленный ValueSet , чтобы узнать, присутствуют ли Key строки и Value строки. Если они присутствуют, служба приложений возвращает пару строковых Response True значений обратно в приложение с другой стороны AppServiceConnection.

Дополнительные сведения о подключении и взаимодействии с другими приложениями см. в разделе "Создание и использование Служба приложений".