2020年的UWP(4)——UWP和等待Request的Desktop Extension
上一篇我们讨论了UWP和Desktop Extension交互中,Desktop Extension执行后立即退出的场景。下图是提到的四种场景分类:
- 执行后立即退出
- 等待request,处理完后退出
- 一或多个request/response周期
- 和UWP程序相同生命周期

本篇我们讨论第二种,Desktop Extension等待request后,根据传参完成操作后退出的,短生命周期场景。该类型有以下特征:
- 可能存在多次的单向调用
- 通过request接收参数
- 不关心返回结果
- Desktop Extension等待request,完成操作后退出
该场景的示意图如下:

我们依然以Desktop Extension启动mspaint.exe和control.exe来举例。和上一篇不同的是,这次我们会通过UWP端发起的request来传递参数。
本篇Sample Code中的AppServiceHandler,以及App.xaml.cs中的OnBackgroundActivated方法。请参考《2020年的UWP(2)——In Process App Service》,相同部分不再介绍。
本篇新增的AppServiceConnectionConnectedEventArgs对象及Connected事件,是当AppServiceConnection通过OpenAsync方法成功连接时,传递当前活动的AppServiceConnection对象,以便调用SendMessageAsync等方法。
public class AppServiceConnectionConnectedEventArgs : EventArgs
{
public AppServiceConnection Connection { get; } public AppServiceConnectionConnectedEventArgs(AppServiceConnection connection)
{
Connection = connection;
}
} public event EventHandler<AppServiceConnectionConnectedEventArgs> Connected;
在AppServiceHandler中的OnBackgroundActivated方法中,我们首要做的,既是通知订阅对象,有AppServiceConnection被成功Open了,请及时响应。
public void OnBackgroundActivated(AppServiceTriggerDetails details)
{
Connected?.Invoke(this, new AppServiceConnectionConnectedEventArgs(details.AppServiceConnection));
Connection = details.AppServiceConnection;
Connection.RequestReceived += Connection_RequestReceived;
}
订阅这个Connected事件的,一般都是Desktop Extension的发起方。比如说UWP端的某个Button。
private async void ButtonLaunchApp_Click(object sender, RoutedEventArgs e)
{
if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))
{
AppServiceHandler.Instance.Connected += Instance_Connected;
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
}
} private async void Instance_Connected(object sender, AppServiceConnectionConnectedEventArgs e)
{
AppServiceHandler.Instance.Connected -= Instance_Connected;
var valueSet = new ValueSet();
valueSet.Add("FileName", ComboBoxFileName.SelectionBoxItem);
var response = await e.Connection.SendMessageAsync(valueSet);
}
之所以需要这个Connect事件,是因为通过SendMessageAsync传参,需要依赖当前活动的AppServiceConnection对象。我们正是通过Connected事件,将AppServiceConnection对象传递给订阅者,使其能够访问SendMessageAsync等方法进行数据交互。
在Instance_Connected方法中,在每次点击按钮时,均启动一个新的Desktop Extension进程。在Desktop Extension进程中,会通过OpenAsync方法来连接AppServiceConnection。之后便是由OnBackgroundActivated方法触发Connected事件,接下来就是发起request。
该场景中,Desktop Extension仅需维持一个较短的生命周期,在等到request后,根据传参完成相应操作,就可以释放资源安全退出了。对整个APP而言,既不会长期占用过多资源,也不会导致UWP端无法Suspend。
下图中的绿色叶子图标,在Desktop Extension运行时,是不会出现的。

同时我们要知道AppService的生命周期是不可控的,在UWP端程序最小化以后,Windows会在一段时间后停止AppService,AppServiceConnection也会被dispose。所以存储一个AppServiceConnection长期对象,用来和永不退出Desktop Extension通讯并不是个好主意。
以下是Desktop Extension端的部分代码,为了方便观察应用程序的行为,我在Sample中将Enrivonment.Exit给注释掉了。
public async Task InitializeAsync()
{
Connection = new AppServiceConnection();
Connection.PackageFamilyName = Package.Current.Id.FamilyName;
Connection.AppServiceName = "ParameterAppService";
AppServiceConnectionStatus status = await Connection.OpenAsync();
if (status != AppServiceConnectionStatus.Success)
{
Console.WriteLine(status);
}
else
{
Console.WriteLine(status);
Connection.RequestReceived += Connection_RequestReceived;
}
} private void Connection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
var content = args.Request.Message["FileName"].ToString();
Process.Start(content);
Console.WriteLine("Will exit after received.");
//Environment.Exit(0);
}
本篇简单介绍了“等待request,处理完后退出”,这一UWP和Desktop Extension数据交互的场景。感谢看到这里的同学,单纯的文字其实很难讲清楚AppService的使用,还请参考Github上的实例代码,欢迎评论及提问。

2020年的UWP(4)——UWP和等待Request的Desktop Extension的更多相关文章
- 2021年的UWP(6)——长生命周期Desktop Extension向UWP的反向通知
上一篇我们讨论了UWP和Desktop Extension间的双向通讯,适用于Desktop Extension中存在用户交互的场景.本篇我们讨论最后一种情况,与前者不同的是,Desktop Exte ...
- 2020年的UWP(3)——UWP和desktop extension的简单交互
上一篇<2020年的UWP(2)--In Process App Service>中我们了解了UWP和Desktop Extension可以通过AppService进行数据交互.本篇我们就 ...
- 2020年的UWP(5)——UWP和Desktop Extension的双向交互
上一篇我们提到了怎么在Desktop Extension中等待并处理UWP端发出的request.在本篇中将描述UWP和Desktop Extension双向交互的场景,即存在从两端各自发出reque ...
- [UWP]在UWP平台中使用Lottie动画
最近QQ影音久违的更新了,因为记得QQ影音之前体验还算不错(FFmepg的事另说),我也第一时间去官网下载体验了一下,结果发现一些有趣的事情. 是的,你没看错,QQ影音主界面上这个动画效果是使用Lot ...
- [UWP]涨姿势UWP源码——Unit Test
之前我们讨论了涨姿势UWP的RSS数据源获取,以及作为文件存储到本地,再将数据转化成Model对象.这部分非UI的内容非常适合添加Unit Test.不涉及UI的话,UT写起来简单高效,很是值得投入一 ...
- [UWP]涨姿势UWP源码——IsolatedStorage
前一篇涨姿势UWP源码分析从数据源着手,解释了RSS feed的获取和解析,本篇则会就数据源的保存和读取进行举例. 和之前的Windows Runtime一样,UWP采用IsolatedStorage ...
- [UWP]涨姿势UWP源码——RSS feed的获取和解析
本篇开始具体分析涨姿势UWP这个APP的代码,首先从数据的源头着手,即RSS feed的获取和解析,相关的类为RssReader,所有和数据相关的操作均放在里面. 涨姿势网站提供的RSS feed地址 ...
- [UWP]涨姿势UWP源码——极简的RSS阅读器
涨姿势UWP,一个开源的RSS阅读器,一个纯粹的项目,一个有道德的APP,一个脱离了低级趣味的作者,一些有益于人民的代码.骚年,还等什么,来涨点姿势吧! 该项目代码可能会引起部分人群的不适,敏感人群请 ...
- [UWP]涨姿势UWP源码——UI布局
懒癌晚期兼正月里都是过年,一直拖到今天才继续更新.之前的几篇介绍了数据的来源,属于准备工作.本篇我们正式开始构建涨姿势UWP程序的UI界面. 我们这个Hello World程序比较简单,总共只有一个页 ...
随机推荐
- NOIP 2012 P1081 开车旅行
倍增 这道题最难的应该是预处理... 首先用$set$从后往前预处理出每一个点海拔差绝对值得最大值和次大值 因为当前城市的下标只能变大,对于点$i$,在$set$中二分找出与其值最接近的下标 然后再$ ...
- 6、Python语法之垃圾回收机制
一 .引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉, ...
- 部署Dotnet Core应用到Kubernetes(一)
最近闲了点,写个大活:部署Dotnet应用到K8s. 写在前边的话 一直想完成这个主题.但这个主题实在太大了,各种拖延症的小宇宙不时爆发一下,结果就拖到了现在. 这个主题,会是一个系列.在这个 ...
- 【java】校验当前时间是否在规定的时间内
废话不多说直接贴代码. 我的日期格式是 8:00-22:00 要用的自己换下格式哈. public class CheckClosingTimeUtil { /** * 校验当前时间是否在规定时间内 ...
- Vuex原理详解
一.Vuex是什么 Vuex是专门为Vuejs应用程序设计的状态管理工具.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生改变.它集中于MVC模式中的Model层 ...
- gcc入门(下)
一 头文件与库文件(模块化,可重用,好维护)在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统以及库函数调用的声明库文件是一些预先编译好的函数的集合,那些函数都是按照可 ...
- putty连接Linux(NAT)
1.系统装好后第一次连的时候需要打开ssh服务 sudo apt-get install openssh-server 当在机器不能通过ping ip相通的话那么就要解决ip不同的问题,当ip相通还是 ...
- Java POI导入word, 带图片
1.导入文件示例,word中简历表格模板 2.代码示例分两部分,一部分读取图片 /** * 导入word(基本信息,word格式) * @param staffId * @param baseInfo ...
- Python_自动化测试_项目
<论坛自动化测试项目> 1.自行选择合适的社区 2.功能要求 5个以上,不包含登录页 3.多手动测试 多用selenium IDE 4.生成测试报告,发送邮件 5.计划任务定时完成 6 ...
- C#高级编程之特性
特性定义 MSDN的描述:使用特性,可以有效地将元数据或声明性信息与代码(程序集.类型.方法.属性等)相关联. 将特性与程序实体相关联后,可以在运行时使用反射这项技术查询特性. 参考此处作者的解释 h ...