UWP/Win10新特性系列—App Service

Win10中,新增了一个很实用的新特性叫做App Service,App Service允许App不在前台运行的情况下提供出一个或多个对外服务供其他App使用,这看起来就好像Web开发中的Web Api。

通过对外提供服务的形式,可以使App更好的完成一些其他App所拥有的专业性操作,而不必自己再去实现服务所做的操作。一些企业用户可以提供复杂的服务,比如云识别和云存储来供开发者使用。这样使开发成本大大降低,也可以为服务提供商带来更多的用户。比如我们可以调用二维码识别服务(如下图,假设其他App提供二维码服务,虽然自己实现也很简单,这里仅仅举个例子),将图片转送到二维码识别服务中,然后服务返回我们需要的数据展示给用户,然后用户的一些云数据也可以使用云数据服务方便的进行云数据操作等……

下面我们将要创建一个具备App Service的App,简单的实现来帮助我们计算两数之和的服务(如果想要深入了解App Services 请参阅:https://msdn.microsoft.com/library/windows/apps/xaml/windows.applicationmodel.appservice.aspx),了解下App Service是怎么运行的。

首先我们先创建一个App Service,App Service是运行在后台任务中的,所以我们需要在后台任务中创建。新建一个Windows运行时组件项目,创建一个类集成后台任务:

 1 public sealed class AppServiceTask : IBackgroundTask
 2     {
 3         private static BackgroundTaskDeferral _serviceDeferral;
 4         public void Run(IBackgroundTaskInstance taskInstance)
 5         {
 6             //订阅关闭事件
 7             taskInstance.Canceled += TaskInstance_Canceled;
 8
 9             _serviceDeferral = taskInstance.GetDeferral();
10
11             var appService = taskInstance.TriggerDetails as AppServiceTriggerDetails;
12             //验证调用者
13             if (appService.Name == "appServiceUWP-calculate" && appService.Name != null)
14             {
15                 //订阅调用者请求
16                 appService.AppServiceConnection.RequestReceived += AppServiceConnection_RequestReceived;
17             }
18         }
19     }

通过获取后台任务参数的TriggerDetails 属性来转换为AppServiceTriggerDetails对象,然后验证下调用者的身份,可以使用加密验证也可以使用秘钥验证,这里使用字符串简单验证下,如果通过验证则订阅调用者对服务的请求事件,事件中处理调用者的请求逻辑如下:

 1 private async void AppServiceConnection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
 2         {
 3             var message = args.Request.Message;
 4             string command = message["Command"] as string;
 5             switch (command)
 6             {
 7                 case "CalcSum":
 8                     var messageDeferral = args.GetDeferral();
 9                     int value1 = (int)message["Value1"];
10                     int value2 = (int)message["Value2"];
11                     var returnMessage = new ValueSet();
12                     returnMessage.Add("Rusult", value1 + value2);
13                     //回应调用者
14                     var responseStatus = await args.Request.SendResponseAsync(returnMessage);
15                     messageDeferral.Complete();
16                     break;
17                 case "Quit":
18                     _serviceDeferral.Complete();
19                     break;
20             }
21         }

App To App 服务一样,App Service中传递的数据也是ValueSet类型,我们获取到操作指令Command的值,然后选择怎么处理该任务,处理结果通过SendResponseAsync()方法将包含数据的ValueSet发送到调用方。

至此,逻辑代码已完成,然后我们需要在App Services的提供方App中声明该App Service,打开Package.appxmanifest文件,声明App Service如下:

在这里我们可以声明很多个AppService,格式类似上面。

Extension.Category设置为appService类型,EntryPoint设置为App Service类的NameSpace.ClassName,AppService.Name设置你的服务的名字,要保证这个名字是唯一的,调用者需要知道这个名字,正式环境下,可以把这个名字存储到UWP的公共存储空间中,使所有App都能访问到。

至此,服务端code已经完成,下面我们创建一个新项目作为调用方Client。首先我们在界面上放置两个文本框和一个按钮如下图:

后台代码如下:

 1 public sealed partial class MainPage : Page
 2     {
 3         //声明一个AppService连接对象
 4         private readonly AppServiceConnection connection = new AppServiceConnection
 5         {
 6             AppServiceName = "appServiceUWP-calculate",
 7             PackageFamilyName = "b8df40a7-e5b3-46a2-a65a-28f502255fc5_md3s7cn435nw2"
 8         };
 9
10         public MainPage()
11         {
12             this.InitializeComponent();
13             this.Loaded += MainPage_Loaded;
14         }
15
16         private async void MainPage_Loaded(object sender, RoutedEventArgs e)
17         {
18
19             var connectionStatus = await connection.OpenAsync();
20             if (connectionStatus == AppServiceConnectionStatus.Success)
21             {
22                 //订阅双向通信
23                 connection.RequestReceived += Connection_RequestReceived;
24             }
25             else
26             {
27                 //可以提示并导航到商店 让用户下载该服务
28                 await new MessageDialog("服务连接不成功").ShowAsync();
29             }
30         }
31
32         private void Connection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
33         {
34             // To do something
35         }
36
37         private async void Button_Click(object sender, RoutedEventArgs e)
38         {
39             var message = new ValueSet();
40             message.Add("Command", "CalcSum");
41             message.Add("Value1", int.Parse(tbNum1.Text));
42             message.Add("Value2", int.Parse(tbNum2.Text));
43
44             AppServiceResponse response = await connection.SendMessageAsync(message);
45             if (response.Status == AppServiceResponseStatus.Success)
46             {
47                 string sum = response.Message["Rusult"].ToString();
48                 await new MessageDialog(sum).ShowAsync();
49             }
50             else
51             { }
52         }
53     }

首先我们声明一个App Service连接对象,为App Service的Name赋值为我们设置的AppService.Name,PackageFamilyName我们可以在提供App Service 的App中使用如下code获取。

Debug.WriteLine(Package.Current.Id.FamilyName);

这个FamilyName在实际开发中是要让其他App知晓的。

Ok,我们连接指定Name和FamilyName的App Service,然后开启连接管道,如果连接不成功,可以根据连接状态返回值来提示用户相关信息,如果App Service 未找到,也可以引导用户下载该服务App。

然后我们在点击事件中创建一个ValueSet对象,添加字典数据进去后发送到服务端,然后等待服务端响应。

让我们看下效果:

推荐一个UWP开发群:53078485 大家可以进来一起学习

时间: 2024-10-01 03:19:03

UWP/Win10新特性系列—App Service的相关文章

UWP/Win10新特性系列—UserConsentVerifier

在UWP开发中,微软提供了新的用户许可验证方式-指纹(生物识别).Pin.密码验证.在爆料的新型Win10 Mobile移动设备中,会增加虹膜识别等先进的用户身份识别技术,微软现在统一了身份验证的API,将生物识别认证和传统的密码识别封装为系统API供开发者调用,调用者只需关心认证的结果,而无需担心用户使用的是虹膜识别还是指纹还是密码等其他的识别技术. 通过UserConsentVerifier类可以提高应用程序的安全性,例如,你可以授权应用程序的购买,或者访问受限制的资源之前需要指纹验证.下面

Win10/UWP新特性系列—Launcher实现应用间的通信

UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等. 如今,微软丰富了Launcher的功能,使用新的Launcher我们可以在App中实现调用文件资源管理器.App-To-App Server(应用对应用服务),Background Task Server App(后台任务处理服务App)还有设置页面调用. 一:Launcher.LaunchFolde

Win10/UWP新特性系列-GetPublisherCacheFolder

微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的数据是不会被别的App获取到的. 在UWP中,微软新增了GetPublisherCacheFolder —— 共享存储文件夹的机制,这个获取的共享存储文件夹并不是说打破了原有的"沙盒机制",而是指,同一个软件开发商发布的App之间,是允许访问一个共享的文件夹以及里面的内容.例如,多个应用程

Win10/UWP新特性系列—使用打印机

微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来为设备(包括移动设备)添加基于XAML的App打印功能.使用Windows.Graphics.Printing和Windows.UI.Xaml.Printing命名空间,就可以很方便的将打印功能添加到我们的应用中. 下面是个例子,我们需要打印一个购物清单,前台代码如下: 1 <Page.Resource

Win10/UWP新特性系列—电池报告

UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的电池API,你可以了解到正在运行的设备所有的电池详细信息. 通过创建Battery对象来表示单个电池控制器或聚合的所有电池控制器,然后使用GetReport方法返回BatteryReport对象,该对象可指示响应电池的充电.容量和状态. 需要用到的资源: Battery:提供该设备的电池控制器信息类

Android M新特性之APP Link

The Android M Developer Preview introduces support for App Links, which improves upon existing link handling by allowing app developers to associate an app with a web domain they own. Declare a Website Association This JSON file indicates the Android

Win10/UWP新特性—Drag&amp;Drop 拖出元素到其他App

在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop App & UWP App中.昨天重新研究了Win10 拖拽这一块,发现以前没能实现的功能,在正式版的环境下都可以实现了,做个笔记以防日后忘记. 在UWP中,想要拖动元素到Desktop或者另一个UWP App中,除了设置元素的CanDrag="True"我们要使用元素的DragSt

atitit。win7 win8 win9 win10 win11 新特性总结与战略规划

atitit.win7 win8 win9 win10  win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 1 1.3. 很少损坏不能启动(只有一次,2年,多机) 1 1.4. PC也可以触摸 1 2. win8 新特性 2 2.1. 2012年2月29日 2 2.2. Metro界面跨平台(移动平台,) 2 2.3. 本文导航 2 2.4. U盘上也可运行 2 3. win9 新特性 3 3.1. wi

5.7新特性

1. 背景 MySQL 5.7在2015-10-21发布了GA版本,即5.7.9,目前小版本已经到了5.7.12.5.7新增了许多新的feature和优化,接下来一个系列,我们就一起来尝尝鲜.首先这次主要是预览feature的变化以及兼容性问题.后面的系列,会针对重要的feature展开来学习. 2 安全相关的特性 2.1 认证插件 mysql.user表中的plugin更改成not null,5.7开始不再支持mysql_old_password的认证插件,推荐全部使用mysql_native