将应用服务转换为与其主机应用在同一个进程中运行
AppServiceConnection 允许另一个应用程序在后台唤醒应用,并启动与应用的直接通信线。
随着进程内App 服务的引入,两个正在运行的前景应用程序可以通过应用服务连接进行直接通信。 App 服务现在可以在前台应用程序所在的同一进程中运行,这使得应用之间的通信变得更容易,并且无需将服务代码分离到单独的项目中。
将进程外模型App 服务转换为进程内模型需要两个更改。 第一个是清单更改。
<Package ... <Applications> <Application Id=... ... EntryPoint="..."> <Extensions> <uap:Extension Category="windows.appService"> <uap:AppService Name="InProcessAppService" /> </uap:Extension> </Extensions> ... </Application> </Applications>
从 <Extension>
元素中删除 EntryPoint
属性,因为现在 OnBackgroundActivated() 是调用应用服务时将使用的入口点。
第二个更改是将服务逻辑从其单独的后台任务项目移动到可从 OnBackgroundActivated()调用的方法。
现在,应用程序可以直接运行App 服务。 例如,在 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 另一端的应用。
在“创建和使用App 服务中详细了解如何连接和通信其他应用。