Win10/UWP新特性系列—Launcher实现应用间的通信

UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等。

如今,微软丰富了Launcher的功能,使用新的Launcher我们可以在App中实现调用文件资源管理器、App-To-App Server(应用对应用服务),Background Task Server App(后台任务处理服务App)还有设置页面调用。

一:Launcher.LaunchFolderAsync

该方法可以打开指定的文件夹,有两个方法重载:

1 public static IAsyncOperation<System.Boolean> LaunchFolderAsync(IStorageFolder folder);
2 public static IAsyncOperation<System.Boolean> LaunchFolderAsync(IStorageFolder folder, FolderLauncherOptions options);

比如我们可以在App中打开设备的图片文件夹

var picturesLibrary = await Launcher.LaunchFolderAsync(KnownFolders.PicturesLibrary);

KnownFolders给我们提供了很多可访问的文件夹位置

在尝试访问这些文件夹的时候,我们还需要在Package.appxmanifest中声明相应的权限

1 <uap:CapabilityName="picturesLibrary"/>

二:Launcher.LaunchUriForResultsAsync

我个人习惯称之为:AppToApp 应用于应用之间的通讯

通过新增的LaunchUriForResultsAsync API,Windows应用程序(以及Windows Web App)可以相互启动并交换数据和文件。利用这个新的API,使得以前需要多个App才能完成的复杂任务现在可以无缝的进行处理,使用户根本无法感觉到应用之间的切换。比如我们可以启动社交App来选择联系人,或者应用在支付的场景。

如果要使用AppToApp,首先我们需要在被启动的App中声明Protocol服务:

 1   <Applications>
 2     <Application Id="App"
 3
 4     ……
 5
 6       <!--  在能够提供外部调用服务的App中注册处理的协议
 7       在协议中,ReturnResults有三种可能的值
 8
 9         ● optional  应用可以通过使用LaunchUriForResultsAsync针对处理结果进行启动,而不是LaunchUriAsync。
10                      当使用optional时,调用的应用必须明确认定它是可以针对结果而调用的App(确认是AppToApp模式),我们还可以检查
11                      OnActivated()事件参数进行确定。如果事件参数的IactivatedEventArgs.Kind属性值是ProtocolForResults,或
12                      事件参数类型是ProtocolActivatedEventArgs,则可以确定应用是通过LaunchUriForResultsAsync启动的。
13
14         ● always    应用只能通过AppToApp模式调用,即它只能通过LaunchUriForResultsAsync调用
15
16         ● none      应用不能通过AppToApp进行调用,即它只能通过LaunchUriAsync调用-->
17       <Extensions>
18         <uap:Extension Category="windows.protocol">
19           <uap:Protocol Name="app2app-sample" ReturnResults="optional">
20             <uap:DisplayName>App2App Sample</uap:DisplayName>
21           </uap:Protocol>
22         </uap:Extension>
23       </Extensions>
24     </Application>
25 </Applications>

然后在App.xaml.cs中重写OnActivated方法

 1 protected override void OnActivated(IActivatedEventArgs args)
 2 {
 3     if (args.Kind == ActivationKind.ProtocolForResults)
 4     {
 5         Frame rootFrame = Window.Current.Content as Frame;
 6         if (rootFrame == null)
 7         {
 8             rootFrame = new Frame();
 9             Window.Current.Content = rootFrame;
10         }
11         var protocolArgs = (ProtocolForResultsActivatedEventArgs)args;
12         rootFrame.Navigate(typeof(App2AppPage), protocolArgs);
13         Window.Current.Activate();
14     }
15 }

上面代码中我们需要检查下IActivatedEventArgs.Kind的值是否是ProtocolForResults来确定应用是否是使用AppToApp方式被启动起来的。如果是,则跳转到提供服务的页面App2AppPage,并传递数据参数。

在App2AppPage页面中我们重写OnNavigatedTo方法来接收数据,OnNavigationTo方法中NavigationEventArgs包含从调用方应用传来的数据。

Ok,开始重写OnNavigatedTo方法

 1 protected override void OnNavigatedTo(NavigationEventArgs e)
 2 {
 3     var protocolForResultsArgs = e.Parameter as ProtocolForResultsActivatedEventArgs;
 4     _operation = protocolForResultsArgs.ProtocolForResultsOperation;
 5     if (protocolForResultsArgs.Data.ContainsKey("TestData"))
 6     {
 7         var dataFromCaller = protocolForResultsArgs.Data["TestData"] as string;
 8         //页面显示得到的数据
 9         testData.Text = dataFromCaller;
10     }
11 }

当应用处理完数据后,可以调用ProtocolForResultsOperation. ReportCompleted方法将一个ValueSet对象返回到调用方App

1 private void Button_Click(object sender, RoutedEventArgs e)
2 {
3     var result = new ValueSet();
4     result["ReturnData"] = string.Format("他给了你{0}", money.Text);
5     _operation.ReportCompleted(result);
6 }

至此,被调用方App逻辑已完成

返回我们的调用方,使用Launcher.LaunchUriForResultsAsync方法调用App2并让App2帮助处理逻辑。

 1 private async Task<string> GetLaunchAppForResults()
 2    {
 3        string resultTxt = string.Empty;
 4        //被调用方的 Protocol Name
 5        var testAppUri = new Uri("app2app-sample:");
 6
 7        var options = new LauncherOptions
 8        {
 9            //这个东东是被调用方的TargetApplicationPackageFamilyName
10            //可以在被调用方里使用 Windows.ApplicationModel.Package.Current.Id.FamilyName 方法来拿到
11            //当然被调用方也可以将这个值存储到共享文件夹中 方便其他App获取
12            //要使用共享文件夹 则可以使用 ShareStorageAccessManager 类来处理
13            //ShareStorageAccessManager 以后会讲解到
14            TargetApplicationPackageFamilyName = "0de26e7d-8c3d-4040-8275-93a92570666d_md3s7cn435nw2"
15        };
16
17        //要传递的数据 ValueSet最大不能超过100k
18        var inputData = new ValueSet();
19        inputData["TestData"] = "一百块都不给我,打我还要叫人来……一百一百一百块";
20
21        //启动App2 要去提供服务
22        LaunchUriResult result = await Windows.System.Launcher.LaunchUriForResultsAsync(testAppUri, options, inputData);
23
24        //结果的处理
25        if (result.Status == LaunchUriStatus.Success &&
26            result.Result != null &&
27            result.Result.ContainsKey("ReturnData"))
28        {
29            var theValues = result.Result;
30            resultTxt = theValues["ReturnData"] as string;
31        }
32        return resultTxt;
33 }

我们模仿小红帽(App1)向大叔要钱,QAQ来看效果:

推荐一个UWP开发群:53078485 大家可以进来一起学习~~

时间: 2024-10-30 15:12:56

Win10/UWP新特性系列—Launcher实现应用间的通信的相关文章

Win10/UWP新特性系列-GetPublisherCacheFolder

微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的数据是不会被别的App获取到的. 在UWP中,微软新增了GetPublisherCacheFolder —— 共享存储文件夹的机制,这个获取的共享存储文件夹并不是说打破了原有的"沙盒机制",而是指,同一个软件开发商发布的App之间,是允许访问一个共享的文件夹以及里面的内容.例如,多个应用程

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

微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来为设备(包括移动设备)添加基于XAML的App打印功能.使用Windows.Graphics.Printing和Windows.UI.Xaml.Printing命名空间,就可以很方便的将打印功能添加到我们的应用中. 下面是个例子,我们需要打印一个购物清单,前台代码如下: 1 <Page.Resource

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

UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的电池API,你可以了解到正在运行的设备所有的电池详细信息. 通过创建Battery对象来表示单个电池控制器或聚合的所有电池控制器,然后使用GetReport方法返回BatteryReport对象,该对象可指示响应电池的充电.容量和状态. 需要用到的资源: Battery:提供该设备的电池控制器信息类

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

在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop App & UWP App中.昨天重新研究了Win10 拖拽这一块,发现以前没能实现的功能,在正式版的环境下都可以实现了,做个笔记以防日后忘记. 在UWP中,想要拖动元素到Desktop或者另一个UWP App中,除了设置元素的CanDrag="True"我们要使用元素的DragSt

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

首先先给大家推荐一个UWP/Win10开发者群:53078485  里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发! 在UWP开发中,微软提供了一个新的特性叫做SharedStorageAccessManager,它允许我们的App根据指定的文件生成一个FileToken来共享此文件,其他App可以使用SharedStorageAccessManager. RedeemTokenForFileAsync(fileToken);方法根据FileToken来获取到共享的文件.这样

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

atitit.win7 win8 win9 win10  win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 1 1.3. 很少损坏不能启动(只有一次,2年,多机) 1 1.4. PC也可以触摸 1 2. win8 新特性 2 2.1. 2012年2月29日 2 2.2. Metro界面跨平台(移动平台,) 2 2.3. 本文导航 2 2.4. U盘上也可运行 2 3. win9 新特性 3 3.1. wi

UWP/Win10新特性系列—App Service

Win10中,新增了一个很实用的新特性叫做App Service,App Service允许App不在前台运行的情况下提供出一个或多个对外服务供其他App使用,这看起来就好像Web开发中的Web Api. 通过对外提供服务的形式,可以使App更好的完成一些其他App所拥有的专业性操作,而不必自己再去实现服务所做的操作.一些企业用户可以提供复杂的服务,比如云识别和云存储来供开发者使用.这样使开发成本大大降低,也可以为服务提供商带来更多的用户.比如我们可以调用二维码识别服务(如下图,假设其他App提

UWP/Win10新特性系列—UserConsentVerifier

在UWP开发中,微软提供了新的用户许可验证方式-指纹(生物识别).Pin.密码验证.在爆料的新型Win10 Mobile移动设备中,会增加虹膜识别等先进的用户身份识别技术,微软现在统一了身份验证的API,将生物识别认证和传统的密码识别封装为系统API供开发者调用,调用者只需关心认证的结果,而无需担心用户使用的是虹膜识别还是指纹还是密码等其他的识别技术. 通过UserConsentVerifier类可以提高应用程序的安全性,例如,你可以授权应用程序的购买,或者访问受限制的资源之前需要指纹验证.下面

Atitit.业务系统的新特性&#160;开发平台&#160;新特性的来源总结

Atitit.业务系统的新特性 开发平台 新特性的来源总结 1.1. 语言新特性(java c# php js python lisp c++ oc swift ruby  go dart1 1.2. 流行lib.frmawork  新特性 jdk clr framework 新特性 (jq   Servlet2 1.3. Ide 新特性( eclipse vs netbea jetbrain2 1.4. Vm  新特性 clr  jvm(jvm好像没有独立的版本号,继承在jdk里面2 1.5.