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实现应用间的通信的更多相关文章

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

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

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

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

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

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

  4. Win10/UWP新特性系列—电池报告

    UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的 ...

  5. Win10/UWP新特性—Drag&Drop 拖出元素到其他App

    在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...

  6. Win10/UWP新特性—SharedStorageAccessManager 共享文件

    首先先给大家推荐一个UWP/Win10开发者群:53078485  里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发! 在UWP开发中,微软提供了一个新的特性叫做SharedStor ...

  7. atitit。win7 win8 win9 win10 win11 新特性总结与战略规划

    atitit.win7 win8 win9 win10  win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 ...

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

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

  9. Java8新特性系列-Lambda

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

随机推荐

  1. 制作圆角:《CSS3 Border-radius》

    今天我们在一起来看看CSS3中制作圆角的属性border-radius的具体用法.如今CSS3中的border-radius出现后,让我们没有那么多的烦恼了,首先制作圆角图片的时间是省了,而且其还有多 ...

  2. logging模块转载博客

     转载自:http://blog.csdn.net/zyz511919766/article/details/25136485 简单将日志打印到屏幕: [python] view plain copy ...

  3. VS下的解决方案目录结构设置和管理

    转载:http://blog.csdn.net/pl20140910/article/details/52074165 为了方便管理自己写的代码,也为了日后工作能方便的查找之前做过相同的代码,仿照某源 ...

  4. [问题2015S07] 复旦高等代数 II(14级)每周一题(第八教学周)

    [问题2015S07]  设 \(A\) 为 \(n\) 阶复方阵, 证明: 存在 \(n\) 阶非异复对称阵 \(S\), 使得 \(A'=S^{-1}AS\), 即 \(A\) 可通过非异复对称阵 ...

  5. ural1057 Amount of Degrees

    链接 这题有一点小坑点 就是AX^B  A只能为0或者1  ,剩下的就比较好做的了. #include <iostream> #include<cstdio> #include ...

  6. [WebLoad] 使用WebLoad进行Web Application 性能测试的流程

    1. 打开WebLOAD IDE录制或编写一个脚本文件,成功后会生成一个后缀为“.wlp”的文件. 2. 打开WebLOAD Console创建一个Load Template,创建过程当中需要添加“. ...

  7. 超级迷宫 nabc

    特点之一:益智模式 N  我们的游戏需要一点点益智答题使其精彩 A 在走迷宫的过程中,会遇到某一个点,出现一个益智小问题,答对即可通过 B 增加游戏的趣味性,吸引用户 C 答题游戏不少,前不久腾讯的手 ...

  8. Caché数据库学习笔记(3)

    目录 Query函数及其测试 重建索引表 Management portal简介 远程访问Ensemble ============================================== ...

  9. Ubuntu 16.04服务器安装及软件配置

    1.配置静态地址 vim /etc/network/interfaces auto enp1s0 iface enp1s0 inet static address 192.168.1.131 netm ...

  10. 【转】Mysql中varchar存放中文与英文所占字节异同

    本文转自Ruby china, 原文地址:https://ruby-china.org/topics/24920 一.关于UTF-8 UTF-8 Unicode Transformation Form ...