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运行时组件项目,创建一个类集成后台任务:
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的更多相关文章
- UWP/Win10新特性系列—Drag&Drop 拖动打开文件
在Win10 App开发中,微软新增了系统PC文件与UWP 之间的文件拖拽行为,它支持将系统磁盘上的文件以拖拽的形式拖入App中并处理,在前不久的微软build 2015开发者大会上微软展示的UWP版 ...
- UWP/Win10新特性系列—UserConsentVerifier
在UWP开发中,微软提供了新的用户许可验证方式-指纹(生物识别).Pin.密码验证.在爆料的新型Win10 Mobile移动设备中,会增加虹膜识别等先进的用户身份识别技术,微软现在统一了身份验证的AP ...
- Java8新特性系列-默认方法
Java8 Interface Default and Static Methods 原文连接:Java8新特性系列-默认方法 – 微爱博客 在 Java 8 之前,接口只能有公共抽象方法. 如果不强 ...
- Java8新特性系列-Lambda
转载自:Java8新特性系列-Lambda – 微爱博客 Lambda Expressions in Java 8 Lambda 表达式是 Java 8 最流行的特性.它们将函数式编程概念引入 Jav ...
- ArcGIS Server 10.1新特性系列---动态图层
ArcGIS Server 10.1新特性里面有几个新功能是非常棒的,其中有一个就是动态图层.动态图层不是一种新发明的图层,而是说在arcgis server的web应用中可以动态的配置其渲染和内容功 ...
- Win10/UWP新特性系列—Launcher实现应用间的通信
UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等. 如 ...
- Win10/UWP新特性系列—使用打印机
微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来 ...
- Win10/UWP新特性系列-GetPublisherCacheFolder
微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的 ...
- 【转】Win10/UWP新特性系列—Web
Internet Explorer Internet Explorer 在Windows 10 升级为Edge模式,是一种交互性和兼容性都很强的新型浏览器,该浏览器相比以前的版本更新了超过2000个操 ...
随机推荐
- iOS开发中的内存分配(堆和栈)
进程的内存分区 所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内存是事先 ...
- MAC地址泛洪攻击测试
测试环境:kali系统(2个kali分别作攻击人和目标用户) win7系统(主机) 1.步配置FTP设置用户名密码 2.在攻击kali端测试网络的连通性 3.测试tpf是否正常 开始泛洪 4.开始抓包 ...
- 【转】对硬盘进行分区时,GPT和MBR区别。
在Windows 8或8.1中设置新磁盘时,系统会询问你是想要使用MBR还是GPT分区.GPT是一种新的标准,并在逐渐取代MBR. GPT带来了很多新特性,但MBR仍然拥有最好的兼容性.GPT并不是W ...
- 。【自学总结 2】------3ds Max 菜单
一.File〈文件菜单:主要用于打开.存储和打印文件,可以将文件导入和导出为不同的其他三维存档格式.〉 New〈新建〉 Reset〈重置〉 Open〈打开〉 Save〈保存〉 Save As〈保存为〉 ...
- python高性能代码之多线程优化
以常见的端口扫描器为实例 端口扫描器的原理很简单,操作socket来判断连接状态确定主机端口的开放情况. import socket def scan(port): s = socket.socket ...
- 无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer、Windows服务器管理工具或NET START命令启动它
无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer.Windows服务器管理工具或NET START命令启动它 1. ...
- Spring事务管理只对出现运行期异常进行回滚
原文:http://blog.csdn.net/abc19900828/article/details/39497631 使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择 ...
- android 破解工具
来记录一下本人在平时工作中使用的android上的破解工具 静态破解: apktool: apk包 -> dex dex2jar和enjarify(google官方出品): dex->ja ...
- Python--关于连接符+
连接符 + 连接符 + 实则是创建了新的对象并占用新的内存(dict.set不能使用) String 由于Python必须为每一个使用连接符+的字符串分配新的内存,并产生新的字符串.下面两种方式会更有 ...
- VMWARE + CENTOS在windows下配置cocos2d-x android开发环境
VMWARE + CENTOS在windows配置cocos2d-x android开发环境 之前使用cygwin在windows开发android,后来使用了c++11特性,在cygwin中更新工具 ...