Win10/UWP新特性系列—Launcher实现应用间的通信
UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等。
如今,微软丰富了Launcher的功能,使用新的Launcher我们可以在App中实现调用文件资源管理器、App-To-App Server(应用对应用服务),Background Task Server App(后台任务处理服务App)还有设置页面调用。
一:Launcher.LaunchFolderAsync
该方法可以打开指定的文件夹,有两个方法重载:
public static IAsyncOperation<System.Boolean> LaunchFolderAsync(IStorageFolder folder);
public static IAsyncOperation<System.Boolean> LaunchFolderAsync(IStorageFolder folder, FolderLauncherOptions options);
比如我们可以在App中打开设备的图片文件夹
var picturesLibrary = await Launcher.LaunchFolderAsync(KnownFolders.PicturesLibrary);
KnownFolders给我们提供了很多可访问的文件夹位置

在尝试访问这些文件夹的时候,我们还需要在Package.appxmanifest中声明相应的权限
<uap:CapabilityName="picturesLibrary"/>
二:Launcher.LaunchUriForResultsAsync
我个人习惯称之为:AppToApp 应用于应用之间的通讯
通过新增的LaunchUriForResultsAsync API,Windows应用程序(以及Windows Web App)可以相互启动并交换数据和文件。利用这个新的API,使得以前需要多个App才能完成的复杂任务现在可以无缝的进行处理,使用户根本无法感觉到应用之间的切换。比如我们可以启动社交App来选择联系人,或者应用在支付的场景。
如果要使用AppToApp,首先我们需要在被启动的App中声明Protocol服务:
<Applications>
<Application Id="App" …… <!-- 在能够提供外部调用服务的App中注册处理的协议
在协议中,ReturnResults有三种可能的值 ● optional 应用可以通过使用LaunchUriForResultsAsync针对处理结果进行启动,而不是LaunchUriAsync。
当使用optional时,调用的应用必须明确认定它是可以针对结果而调用的App(确认是AppToApp模式),我们还可以检查
OnActivated()事件参数进行确定。如果事件参数的IactivatedEventArgs.Kind属性值是ProtocolForResults,或
事件参数类型是ProtocolActivatedEventArgs,则可以确定应用是通过LaunchUriForResultsAsync启动的。 ● always 应用只能通过AppToApp模式调用,即它只能通过LaunchUriForResultsAsync调用 ● none 应用不能通过AppToApp进行调用,即它只能通过LaunchUriAsync调用-->
<Extensions>
<uap:Extension Category="windows.protocol">
<uap:Protocol Name="app2app-sample" ReturnResults="optional">
<uap:DisplayName>App2App Sample</uap:DisplayName>
</uap:Protocol>
</uap:Extension>
</Extensions>
</Application>
</Applications>
然后在App.xaml.cs中重写OnActivated方法
protected override void OnActivated(IActivatedEventArgs args)
{
if (args.Kind == ActivationKind.ProtocolForResults)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame == null)
{
rootFrame = new Frame();
Window.Current.Content = rootFrame;
}
var protocolArgs = (ProtocolForResultsActivatedEventArgs)args;
rootFrame.Navigate(typeof(App2AppPage), protocolArgs);
Window.Current.Activate();
}
}
上面代码中我们需要检查下IActivatedEventArgs.Kind的值是否是ProtocolForResults来确定应用是否是使用AppToApp方式被启动起来的。如果是,则跳转到提供服务的页面App2AppPage,并传递数据参数。
在App2AppPage页面中我们重写OnNavigatedTo方法来接收数据,OnNavigationTo方法中NavigationEventArgs包含从调用方应用传来的数据。
Ok,开始重写OnNavigatedTo方法
protected override void OnNavigatedTo(NavigationEventArgs e)
{
var protocolForResultsArgs = e.Parameter as ProtocolForResultsActivatedEventArgs;
_operation = protocolForResultsArgs.ProtocolForResultsOperation;
if (protocolForResultsArgs.Data.ContainsKey("TestData"))
{
var dataFromCaller = protocolForResultsArgs.Data["TestData"] as string;
//页面显示得到的数据
testData.Text = dataFromCaller;
}
}
当应用处理完数据后,可以调用ProtocolForResultsOperation. ReportCompleted方法将一个ValueSet对象返回到调用方App
private void Button_Click(object sender, RoutedEventArgs e)
{
var result = new ValueSet();
result["ReturnData"] = string.Format("他给了你{0}", money.Text);
_operation.ReportCompleted(result);
}
至此,被调用方App逻辑已完成
返回我们的调用方,使用Launcher.LaunchUriForResultsAsync方法调用App2并让App2帮助处理逻辑。
private async Task<string> GetLaunchAppForResults()
{
string resultTxt = string.Empty;
//被调用方的 Protocol Name
var testAppUri = new Uri("app2app-sample:"); var options = new LauncherOptions
{
//这个东东是被调用方的TargetApplicationPackageFamilyName
//可以在被调用方里使用 Windows.ApplicationModel.Package.Current.Id.FamilyName 方法来拿到
//当然被调用方也可以将这个值存储到共享文件夹中 方便其他App获取
//要使用共享文件夹 则可以使用 ShareStorageAccessManager 类来处理
//ShareStorageAccessManager 以后会讲解到
TargetApplicationPackageFamilyName = "0de26e7d-8c3d-4040-8275-93a92570666d_md3s7cn435nw2"
}; //要传递的数据 ValueSet最大不能超过100k
var inputData = new ValueSet();
inputData["TestData"] = "一百块都不给我,打我还要叫人来……一百一百一百块"; //启动App2 要去提供服务
LaunchUriResult result = await Windows.System.Launcher.LaunchUriForResultsAsync(testAppUri, options, inputData); //结果的处理
if (result.Status == LaunchUriStatus.Success &&
result.Result != null &&
result.Result.ContainsKey("ReturnData"))
{
var theValues = result.Result;
resultTxt = theValues["ReturnData"] as string;
}
return resultTxt;
}
我们模仿小红帽(App1)向大叔要钱,QAQ来看效果:

推荐一个UWP开发群:53078485 大家可以进来一起学习~~
Win10/UWP新特性系列—Launcher实现应用间的通信的更多相关文章
- 【转】Win10/UWP新特性系列—Web
Internet Explorer Internet Explorer 在Windows 10 升级为Edge模式,是一种交互性和兼容性都很强的新型浏览器,该浏览器相比以前的版本更新了超过2000个操 ...
- Win10/UWP新特性系列—使用打印机
微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来 ...
- Win10/UWP新特性系列-GetPublisherCacheFolder
微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的 ...
- Win10/UWP新特性系列—电池报告
UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的 ...
- Win10/UWP新特性—Drag&Drop 拖出元素到其他App
在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...
- Win10/UWP新特性—SharedStorageAccessManager 共享文件
首先先给大家推荐一个UWP/Win10开发者群:53078485 里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发! 在UWP开发中,微软提供了一个新的特性叫做SharedStor ...
- atitit。win7 win8 win9 win10 win11 新特性总结与战略规划
atitit.win7 win8 win9 win10 win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 ...
- Java8新特性系列-默认方法
Java8 Interface Default and Static Methods 原文连接:Java8新特性系列-默认方法 – 微爱博客 在 Java 8 之前,接口只能有公共抽象方法. 如果不强 ...
- Java8新特性系列-Lambda
转载自:Java8新特性系列-Lambda – 微爱博客 Lambda Expressions in Java 8 Lambda 表达式是 Java 8 最流行的特性.它们将函数式编程概念引入 Jav ...
随机推荐
- ajax完整结构
$.ajax({ url:"服务器", data:{"key":所传数据}, type:"post", dataType:"jso ...
- src url href uri的区别和联系
- 程序源系统与当前系统不一致:Carry out repairs in non-original systems only if urgent
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Hibernate <查询缓存>
查询缓存: 定义:查询缓存它是基于二级缓存的,可以保存普通属性查询的结果,查询对象实体时,他会保存id作为键,查询结果作为值,下个对象访问时,可以直接查到 查询缓存查询实体对象时,显著的特点是,会执行 ...
- Oracle_下载地址
1.http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html 1.1.现在(20161 ...
- python yield的初识
---------2016-5-18 10:49:45-- source:
- Asp.Net_单点登录
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- selenium eclipse环境搭建
1.python 3.5下载及安装 2.setuptools 与pip 下载地址是:http://pypi.Python.org/pypi/setuptools http://pypi.Python. ...
- git: No refs in common and none specified; doing no
用gitolite新建项目,clone后首次push,可能会出现: $ git push No refs in common and none specified; doing nothing ...
- 如何根据不同的浏览器写不同的css样式达到兼容
做前端静态页面的时候总是发现,ie的兼容性很差,总会出点问题.然后就去改代码 ,改完以后 又发现 火狐 谷歌又挂了,这可咋整. 后来发现做个判断吧 哪里有问题哪里就做个判断呗 ,咋判断呢,这么 ...