UWP学习记录12-应用到应用的通信

1、应用间通信

“共享”合约是用户可以在应用之间快速交换数据的一种方式。 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参考。 如果你的应用需要为处于另一个应用的上下文中的用户快速完成内容接收,则可以考虑使用“共享”合约。

应用可以通过两种方式支持“共享”功能。 首先,应用可以是提供用户要共享的内容的源应用。 其次,应用可以是用户选择作为共享内容目标的目标应用。 一个应用也可以既是源应用,也是目标应用。 如果你希望你的应用作为源应用共享内容,则需要确定你的应用可以提供的数据格式。

除了“共享”合约外,应用还可以集成用于传输数据的传统技术,如拖放或复制和粘贴。 除了在 UWP 应用之间通信外,这些方法还支持在桌面应用程序之间共享。

2、共享数据

添加 DataRequested 事件处理程序以在用户每次调用共享时调用。 这种情况既会在用户点击应用中的控件(例如按钮或应用栏命令)时发生,也会在特定情况下(例如,如果用户完成某一关并获得了较高分数)自动发生。当发生 DataRequested 事件时,你的应用会收到 DataRequest 对象。 该对象包含 DataPackage,可用来提供用户要共享的内容。 你必须提供标题和要共享的数据。 描述是可选的,但建议提供。

你可以共享各种类型的数据,包括:

n 纯文本

n 统一资源标识符 (URI)

n HTML

n 格式化的文本

n 位图

n 纯文本

n 文件

n 自定义开发人员定义的数据

DataPackage 对象可以包含其中一种或多种格式(可任意组合)。

当你打包数据进行共享时,可以给出各种可提供与共享内容相关的其他信息的属性。 这些属性帮助目标应用改善用户体验。 例如,当用户通过多个应用共享内容时,可提供说明帮助。 共享图像或指向网页的链接时,添加一个缩略图可为用户提供直观的参考。 有关详细信息,请参阅 DataPackagePropertySet。

除了 Title,所有属性都是可选的。 Title 属性具有强制性,必须进行设置。

用于共享的 UI 由系统提供。 若要启动它,请调用 ShowShareUI 方法。

在大多数情况下,共享内容是一个简单直接的过程。 然而,意外总是有可能发生。 例如,应用可能需要用户选择用于共享的内容,但用户未选择任何内容。 若要处理这些情况,请使用 FailWithDisplayText 方法,它将在出现问题时向用户显示一条消息。

有时,它可能不宜立即准备用户要共享的数据。 例如,如果你的应用支持以几种可能的不同格式发送一个较大的图像文件,在用户进行选择之前,创建所有这些图像的效率非常低。若要解决此问题,DataPackage 可以包含委托 - 一种在接收应用请求数据时调用的函数。 我们建议你在用户想要共享的数据很消耗资源时使用委托。

3、接受数据

在用户调用“共享”时,系统将显示可能的目标应用列表。 为了显示在列表中,你的应用需要声明它支持“共享”合约。 这让系统知道你的应用可用于接收内容。

接下来,确定你支持的文件类型和数据格式。 共享 API 支持多种标准格式,如文本、HTML 和位图。 你还可以指定自定义文件类型和数据格式。 指定时,请记住源应用必须明确这些类型和格式,否则它们无法使用这些格式来共享数据。仅注册你的应用可以处理的格式。 当用户调用“共享”时,仅显示支持正在共享的数据的目标应用。

当用户选择你的应用时(通常从共享 UI 中可用目标应用的列表中进行选择),将引发 OnShareTargetActivated 事件。 你的应用需要处理此事件才能处理用户要共享的数据。用户要共享的数据包含在一个 ShareOperation 对象中。 你可以使用该对象来检查所包含的数据格式。

在某些情况下,你的应用可能需要花费一定时间来处理要共享的数据。 示例包括用户共享文件或图像的集合。 这些项目比简单文本字符串更大,因此处理时间较长。在调用 ReportStarted 之后,将不再有任何与你的应用所进行的用户交互。 因此,你不应该调用它,除非你的应用处于可以由用户关闭的位置。使用扩展共享,用户有可能会在你的应用获得来自 DataPackage 对象的所有数据之前关闭源应用。 因此,我们建议你让系统知道你的应用何时已获得它所需的数据。 这样,系统可以根据需要暂停或终止源应用。

如果发生错误,调用 ReportError 向系统发送一条错误消息。 用户在检查共享的状态时将看到该消息。 此时,你的应用将关闭并且共享将结束。 用户将需要再次启动才能将内容共享到你的应用。 根据你的方案,你可能确定某个特殊错误并不严重,不足以结束共享操作。 在这种情况下,你可以选择不调用 ReportError 并且继续此共享。

最后,当你的应用成功处理好共享内容之后,你应当调用 ReportCompleted 来通知系统。在使用这些方法时,通常按照所述的顺序来进行调用,不要多次调用它们。 然而在某些时候,目标应用可能会在调用 ReportStarted之前调用 ReportDataRetrieved。 例如,应用可能在激活处理程序中执行任务时检索数据,但不调用 ReportStarted,直到用户单击“共享”按钮之后才调用。

当用户选择你的应用来接收内容时,我们建议你创建一个 QuickLink。 QuickLink 类似于快捷方式,可让用户更轻松地使用你的应用共享信息。 例如,你可以创建一个 QuickLink,用来打开预配置了好友电子邮件地址的新邮件。QuickLink 必须包含标题、图标和 ID。 当用户点击“共享”超级按钮时,会显示标题(类似“Email Mom”)和图标。 你的应用使用 ID 来访问任何自定义信息,如电子邮件地址或登录凭据。 当你的应用创建 QuickLink 时,该应用会通过调用 ReportCompleted,将 QuickLink 返回到系统。QuickLink 实际上并不存储数据。 而是包含一个标识符,如果选中该标识符,则会将该标识符发送至你的应用。 你的应用负责存储 QuickLink 的 ID 及相应的用户数据。 当用户点击 QuickLink 时,你可以通过 QuickLinkId 属性获取其 ID。

4、复制和粘帖

许多情况下,你无需编写用于支持剪贴板操作的代码。 可用于创建应用的许多默认 XAML 控件已经支持剪贴板操作。

除了复制和粘贴命令以外,你可能还想要跟踪剪贴板更改。 可通过处理剪贴板的 ContentChanged 事件来执行此操作。

UWP学习记录12-应用到应用的通信的更多相关文章

  1. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  2. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

  3. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  4. UWP学习记录8-设计和UI之控件和模式5

    UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...

  5. UWP学习记录7-设计和UI之控件和模式4

    UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...

  6. UWP学习记录6-设计和UI之控件和模式3

    UWP学习记录6-设计和UI之控件和模式3 1.按钮 按钮,响应用户输入和引发 Click 事件的控件. 使用<Button>就能创建一个按钮控件了.按钮是 ContentControl, ...

  7. UWP学习记录5-设计和UI之控件和模式2

    UWP学习记录5-设计和UI之控件和模式2 1.应用栏和命令栏 CommandBar 控件是一款通用.灵活.轻型的控件,可显示复杂内容(如图像或文本块)以及简单的命令(如 AppBarButton.A ...

  8. UWP学习记录4-设计和UI之控件和模式1

    UWP学习记录4-设计和UI之控件和模式1 1.控件和事件简介 在 UWP 应用开发中,控件是一种显示内容或支持交互的 UI 元素. 控件是用户界面的构建基块. 我们提供了超过 45 种控件供你使用, ...

  9. UWP学习记录3-设计和UI之样式

    UWP学习记录3-设计和UI之样式 1.颜色 在系统的“设置”>“个性化”>“颜色”里,提供了主题色选择.选定主题色后,会根据颜色亮度的 HSB 值创建浅色和深色的主题色. 应用可使用阴影 ...

随机推荐

  1. synthesize的作用

    @synthesize是对属性的实现,实际上就是制定setter和getter操作的实例变量的名称   举个栗子: @synthesize array;  默认操作的实例变量和属性同名 @synthe ...

  2. 看着水了一天的群,终于看到一段高质量的代码了分享一下localStorage

    _history : { //缓存 isLocalStorage:window.localStorage?true:false, set : function(key,value){ //设置缓存 i ...

  3. LUA 学习笔记

    1.C# 与 LUAC#调用LUA比较简单,但LUA调用C#,有两种方法,一种是直接反射调用,但这种方法有局限性,比如性能低,在IOS平台无法使用反射,因此一般使用WARP方法,即把C#代码注册到LU ...

  4. Create a new Windows service on windows server2012

    netsh http add iplisten ipaddress=0.0.0.0:15901 sc.exe create "FPPService" binPath= " ...

  5. 2012Chhengdu K - Yet Another Multiple Problem

    K - Yet Another Multiple Problem Time Limit:20000MS     Memory Limit:65536KB     64bit IO Format:%I6 ...

  6. hashMap 深入理解

    1.java 的hashMap 是通过 链地址 法来解决 hash冲突的 2.初始时是一个empty table, 第一次添加数据时检查到时空数组就会 生成指定容量的数组,也就是 在第一次使用时才初始 ...

  7. mysql导出部分表数据

    mysqldump -uroot -p -h 192.168.1.11 -P 3306 mojiarticle UID_IMEI --where "ID > 1021230 and I ...

  8. Bootstrap table使用心得

    序号显示带分页信息的连续编号,在序号列添加以下格式化代码即可. { field: 'number', title: '序号', align:'center', width:45, formatter: ...

  9. C++中有关数组的相关问题

    1.数组长度相关: strlen(from <string.h>)只是针对字符数组才有的,他不包含\0的长度.无法对其他类型求长度.sizeof()则可以对\0发起作用.记住(a.leng ...

  10. 增量式PID推导及C语言实现

    PID控制器表达式为: \[ u(t) = K_pe(t) + K_i\int_0^t e(\tau)d\tau + K_d\frac{de(t)}{dt} \] 离散化: 令 $ t = nT,~T ...