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 大家可以进来一起学习~~

最新文章

  1. 【腾讯Bugly干货分享】微信热补丁Tinker的实践演进之路
  2. Spring的特点
  3. MySQL5.7.10免安装版配置
  4. //判断是否安装Flash插件
  5. Extjs Cmd 学习笔记
  6. C# 让程序自动以管理员身份运行
  7. eclipse的调试方法的简单介绍
  8. Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&amp;&amp;Codeforces 861B Which floor?【枚举,暴力】
  9. React,Node.js,Vue,Webkit技术内幕
  10. Dubbo 泛化调用的参数解析问题及一个强大的参数解析工具 PojoUtils
  11. docker入门实例
  12. ExaWizards 2019
  13. js调用ajax案例2,使用ok
  14. MySQL5.6 大量SQL语句处于Writing to net状态的案例分析
  15. Servlet中request对象得到路径问题
  16. python-web微信实现
  17. php post和get请求
  18. Python3面向对象基础
  19. 让windows能像ubuntu一样方便的神器
  20. LeetCode——Add Digits

热门文章

  1. MAC地址泛洪攻击测试
  2. Unity3D之协程(Coroutines &amp; Yield )
  3. c++ 指针常量,常量指针
  4. UITableViewCell的cell重用原理
  5. Intellij自动下载导入框架包
  6. &lt;开心一笑&gt; 前端工程师你们伤不起!
  7. (转)Uiautomator——API详解
  8. JAVA 使用POI导出数据格式为Execl
  9. Setup Factory Error3014
  10. zabbix3.0.4 部署之一 (简介)