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. 【jQuery】window.onload 和 $(document).ready() 的区别

    ... 在Stack Overflow上看到了这个问题,自己翻译了过来. The onload event is a standard event in the DOM, while the read ...

  2. MyEclipse 10.7 添加JBOSS 6应用服务器

    首先,确保你的JAVA和JBOSS的环境变量配置正确然后,在myeclipse中,window->preferences->myeclipse->servers->JBOSS- ...

  3. python importlib

    api 文档 importlib.import_module(name, package=None) Import a module. The name argument specifies what ...

  4. 细话 - 如何在web应用中使用百度地图

    初步接触了高德地图嵌入到网站应用中的知识后,对高德地图提供的文档,源码以及使用快捷,方便非常满意. 由此,利用周末时间研究了下如何使用 百度地图 . 总的来说,方式方法都差不多,都提供了源码和文档实例 ...

  5. [像黑客一样生活] shell终端听音乐之网易云shell版

    这是一个Python程序,使用Python构建,并以mpg123作为后端.Follow me... 特点: Vim 式的流畅操作,支持快捷键绑定 支持电台.收藏等各种特色功能 支持 OS X 及各类 ...

  6. VirtualBox4.3.12 Centos6.5-i386 设置共享文件夹

    新在虚拟机下安装个CentOS6.5,准备设置个与win7的共享文件夹,遇到一个问题,搞了好几天呢 现在先说一下: 首先,在虚拟机下安装好CentOS这里不说了 然后启动,点击安装增强功能 如下图: ...

  7. c++ *.h和*.cpp在编译中的作用

    首先,我们可以将所有东西都放在一个.cpp文件内.然后编译器就将这个.cpp编译成.obj,obj是什么东西?就是编译单元了. 一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想 ...

  8. 解决在国内更新android sdk时连不到服务器的问题

    修改hosts文件 Windows下:打开C:\Windows\System32\drivers\etc\hosts Linux下:vi /etc/hosts 在文件尾加入如下两行: 74.125.2 ...

  9. oracle PROCEDURE AS IS区别

    在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别,在视图(VIEW)中只能用 ,在游标(CURSOR)中只能用IS不能用AS.

  10. JVM类加载机制

    一.概述 JVM把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是JVM的类加载机制 二.类加载过程 加载—(验证—准备— ...