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运行时组件项目,创建一个类集成后台任务:

 public sealed class AppServiceTask : IBackgroundTask
{
private static BackgroundTaskDeferral _serviceDeferral;
public void Run(IBackgroundTaskInstance taskInstance)
{
//订阅关闭事件
taskInstance.Canceled += TaskInstance_Canceled; _serviceDeferral = taskInstance.GetDeferral(); var appService = taskInstance.TriggerDetails as AppServiceTriggerDetails;
//验证调用者
if (appService.Name == "appServiceUWP-calculate" && appService.Name != null)
{
//订阅调用者请求
appService.AppServiceConnection.RequestReceived += AppServiceConnection_RequestReceived;
}
}
}

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

 private async void AppServiceConnection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
var message = args.Request.Message;
string command = message["Command"] as string;
switch (command)
{
case "CalcSum":
var messageDeferral = args.GetDeferral();
int value1 = (int)message["Value1"];
int value2 = (int)message["Value2"];
var returnMessage = new ValueSet();
returnMessage.Add("Rusult", value1 + value2);
//回应调用者
var responseStatus = await args.Request.SendResponseAsync(returnMessage);
messageDeferral.Complete();
break;
case "Quit":
_serviceDeferral.Complete();
break;
}
}

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。首先我们在界面上放置两个文本框和一个按钮如下图:

后台代码如下:

 public sealed partial class MainPage : Page
{
//声明一个AppService连接对象
private readonly AppServiceConnection connection = new AppServiceConnection
{
AppServiceName = "appServiceUWP-calculate",
PackageFamilyName = "b8df40a7-e5b3-46a2-a65a-28f502255fc5_md3s7cn435nw2"
}; public MainPage()
{
this.InitializeComponent();
this.Loaded += MainPage_Loaded;
} private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{ var connectionStatus = await connection.OpenAsync();
if (connectionStatus == AppServiceConnectionStatus.Success)
{
//订阅双向通信
connection.RequestReceived += Connection_RequestReceived;
}
else
{
//可以提示并导航到商店 让用户下载该服务
await new MessageDialog("服务连接不成功").ShowAsync();
}
} private void Connection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
// To do something
} private async void Button_Click(object sender, RoutedEventArgs e)
{
var message = new ValueSet();
message.Add("Command", "CalcSum");
message.Add("Value1", int.Parse(tbNum1.Text));
message.Add("Value2", int.Parse(tbNum2.Text)); AppServiceResponse response = await connection.SendMessageAsync(message);
if (response.Status == AppServiceResponseStatus.Success)
{
string sum = response.Message["Rusult"].ToString();
await new MessageDialog(sum).ShowAsync();
}
else
{ }
}
}

首先我们声明一个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 大家可以进来一起学习

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

  1. UWP/Win10新特性系列—Drag&Drop 拖动打开文件

    在Win10 App开发中,微软新增了系统PC文件与UWP 之间的文件拖拽行为,它支持将系统磁盘上的文件以拖拽的形式拖入App中并处理,在前不久的微软build 2015开发者大会上微软展示的UWP版 ...

  2. UWP/Win10新特性系列—UserConsentVerifier

    在UWP开发中,微软提供了新的用户许可验证方式-指纹(生物识别).Pin.密码验证.在爆料的新型Win10 Mobile移动设备中,会增加虹膜识别等先进的用户身份识别技术,微软现在统一了身份验证的AP ...

  3. Java8新特性系列-默认方法

    Java8 Interface Default and Static Methods 原文连接:Java8新特性系列-默认方法 – 微爱博客 在 Java 8 之前,接口只能有公共抽象方法. 如果不强 ...

  4. Java8新特性系列-Lambda

    转载自:Java8新特性系列-Lambda – 微爱博客 Lambda Expressions in Java 8 Lambda 表达式是 Java 8 最流行的特性.它们将函数式编程概念引入 Jav ...

  5. ArcGIS Server 10.1新特性系列---动态图层

    ArcGIS Server 10.1新特性里面有几个新功能是非常棒的,其中有一个就是动态图层.动态图层不是一种新发明的图层,而是说在arcgis server的web应用中可以动态的配置其渲染和内容功 ...

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

    UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等. 如 ...

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

    微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来 ...

  8. Win10/UWP新特性系列-GetPublisherCacheFolder

    微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的 ...

  9. 【转】Win10/UWP新特性系列—Web

    Internet Explorer Internet Explorer 在Windows 10 升级为Edge模式,是一种交互性和兼容性都很强的新型浏览器,该浏览器相比以前的版本更新了超过2000个操 ...

随机推荐

  1. RCP:如何保存TaskList及如何获取TaskList

    如果我们在Eclipse RCP程序中添加TaskList View,用来管理Task或者TODO项,如下代码: PlatformUI.getWorkbench().getActiveWorkbenc ...

  2. [问题2014A02] 解答一(两次升阶法,由张钧瑞同学、董麒麟同学提供)

    [问题2014A02] 解答一(两次升阶法,由张钧瑞同学.董麒麟同学提供) 将原行列式 \(|A|\) 升阶,考虑如下 \(n+1\) 阶行列式: \[|B|=\begin{vmatrix} 1 &a ...

  3. JavaScript的引擎机制

    var x=1; var y=0; var z=0; function add(n){n=n+1;return n;} y=add(x); function add(n){n=n+3;return n ...

  4. 一个webpack,react,less,es6的DEMO

    1.package.json如下 { "name": "demo", "version": "1.0.0", " ...

  5. SVM学习(续)

    SVM的文章可以看:http://www.cnblogs.com/charlesblc/p/6193867.html 有写的最好的文章来自:http://www.blogjava.net/zhenan ...

  6. MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)

    前面讲了模态对话框和非模态对话框,本节来将一种特殊的对话框--属性页对话框. 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面 ...

  7. QQ授权登录

    这两天在做网站第三方登录,总结一下QQ登录吧,支付宝就不用了(下载dome把ID什么的换一换就基本可以了.),本文主要说的是代码的实现方式,逻辑部分主要还是根据帮助文档来的.不懂的同学可以先看看文档. ...

  8. java中获取ServletContext常见方法

    http://blog.sina.com.cn/s/blog_3fe961ae0100wjnf.html 1.在javax.servlet.Filter中直接获取 ServletContext con ...

  9. features block

    很轻松就能把一个新建的block导出到一个module包里.

  10. C++学习之:括号匹配与栈的使用

    #include <stack> using std::stack ; 变量定义: stack<T>  stackName ; 成员函数: 成员函数 功能 bool  empt ...