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个操 ...
随机推荐
- mac攻略(二) -- 简单配置php开发环境
最简单直接的方式还是使用 Mac 上自带的 Apache 和 PHP. 1.启动 Apache 1>启动apache $sudo apachectl start; 2>启动后,在浏览器 ...
- python学习之while语句
while循环 1.简单的while循环while True: ")#这是一个简单的while循环,当等于True时会一直打印1 2.while执行多少次后退出 coun=0while Tr ...
- mysql之常用操作
1. 数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数 ...
- 十五、JDBC操作数据库
1.数据库特点 实现数据共享.减少数据的冗余度.数据的独立性.数据集中控制.数据的一致性和可维护性. 2.数据库种类和功能 (1)层次型数据库:类似于树结构,是一组通过链接而互相联系在一起的记录. ( ...
- C++11在时空性能方面的改进
C++11在时空性能方面的改进 这篇我们聊聊C++11在时间和空间上的改进点: 主要包括以下方面: 新增的高效容器:array.forward_list以及unordered containers: ...
- python_way ,day25 wmi
pip install wmi 如果不能安装,就使用 安装 python3 -m pip install wmi 再安装pywin32这个包 使用: import platform import w ...
- 小白菜初探nodejs
记得大四那年实习的时候出去找工作,就常常听见大家说node.从那以后,悄然埋下了一颗学习nodejs的心.不过由于基础太薄弱,一直没有学习.加之工作上没有相关应用,就一直搁置到现在. 年会的时候,老大 ...
- ruby 资源收集
http://huacnlee.com/blog/archives/ 一个牛人李华顺的个人网站 http://api.rubyonrails.org/ 不错的ruby on rails学习网站 htt ...
- 协程 & 用户级(内核级)线程 & 切换开销 & 协程与异步回调的差异
今天先是看到多线程级别的内容,然后又看到协程的内容. 基本的领会是,协程是对异步回调方式的一种变换,同样是在一个线程内,协程通过主动放弃时间片交由其他协程执行来协作,故名协程. 而协程很早就有了,那时 ...
- json对象,数组,字符串总结
关于json对象,数组,字符串的总结 什么是json? JSON(JavaScript Object Notation) 一种轻量级的数据交换格式,JSON采用完全独立于语言的文本格式...(来自百 ...