Преобразование службы приложений для запуска в одном процессе с ведущим приложением
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.
Дополнительные сведения о подключении и взаимодействии с другими приложениями см. в разделе "Создание и использование Служба приложений".