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 事件来执行此操作。