人与对话

“人与对话”计划是一项多年期 Android 计划,目的是在手机的系统界面中提升人与对话的比重。这种重视基于这样一个事实:对于形形色色的用户而言,与他人的沟通和互动仍然是绝大多数人最看重也是最重要的功能领域。

Android 11 中引入了许多功能来支持“人与对话”计划。

对话空间


对话空间是人与人之间实时对话的专用通知区域。
图 1:对话聊天室。

在手持设备上,通知栏顶部有一个单独的部分,其中仅包含与他人的实时对话(例如通话和聊天消息,包括群聊)。此空间内的通知在外观和行为上不同于许多手机上的非会话通知:

  • 设计不同,着重强调代表人的头像,再加上进行对话所用的应用。
  • 点按通知即可在应用中打开对话(如果对话此前以对话泡形式显示,则会以对话泡的形式中打开),点按文字插入点即可将通知栏中的新消息展开到完整篇幅,同时显示完整选项列表。
  • 提供了对话专用的操作(某些操作通过长按来执行):
    • 将此对话标记为优先
    • 将此对话提升为对话泡(仅当应用支持对话泡时才会显示)
    • 将此对话的通知设为静音
    • 为此对话设置自定义提示音或振动

对话泡中的对话

如果通知满足对话要求,平台会将其以对话泡形式从抽屉式通知栏中启动。
图 2:通知以气泡形式从抽屉式通知栏中启动。

从 Android 11 开始,对话泡可以从“对话”部分中的通知启动。只有带关联快捷方式的通知才能以对话泡形式显示。如果对话在通知栏中标记为“重要”或触发了对话泡显示方式,系统将自动以对话泡形式显示这些对话。

对话快捷方式

对话的快捷方式会出现在启动器中,并且会与共享表单中长期存在的共享快捷方式一起出现。

API 准则

本部分介绍了一些 API,这些 API 旨在支持在您的应用中使用系统提供的人与对话显示空间。

对话的快捷方式

为了参与这项以对话为中心的计划,应用需要向系统提供长期存在的快捷方式。我们强烈建议您使用长期存在的共享快捷方式。如有需要,您也可以在 Android 11 中使用动态快捷方式,但将来我们可能会移除这个选项。

如需发布对话的快捷方式,请调用 ShortcutManagerCompat 方法 setDynamicShortcuts()addDynamicShortcuts()pushDynamicShortcut()(可自动为开发者管理快捷方式限制)。此快捷方式必须长期存在并附有关于一个人或多个人的 Person 数据,用于标识对话中的其他参与者。我们还建议您设置 LocusIdCompat

如果某段对话已不存在,应用可以使用 removeLongLivedShortcuts() 删除相应快捷方式;这样做会让系统删除与这段对话关联的所有数据。虽然快捷方式可移除,但除非绝对必要,否则应用不得移除缓存的快捷方式;缓存某个快捷方式或许是因为用户与之互动来改变体验,移除该快捷方式会撤消这些更改,从而引起用户的不满。

对话通知

如果满足以下条件,通知将被视为对话通知:

  • 通知使用 MessagingStyle

  • (只有在应用以 Android 11 或更高版本为目标平台时适用)通知与长期存在的有效动态或缓存共享快捷方式关联。通知可以通过调用 setShortcutId()setShortcutInfo() 来设置此关联。如果应用以 Android 10 或更低版本为目标平台,通知就不必与快捷方式关联,如回退选项部分中所述。

  • 在发布时,用户没有通过通知渠道设置使对话部分中的对话降位。

使用 LocusIdCompat

设备端智能技术可确定用户最有可能感兴趣的对话。有许多重要的信号,其中最重要的两个是每段对话中对话会话的新近度和频率。如果正确地标记了通过启动器快捷方式或在通知中与对话进行的互动,系统就会知道这些互动。不过,系统不知道完全发生在应用中的对话,除非也标记了这些互动。因此,我们强烈建议您LocusIdCompat 附加到快捷方式,并使用关联的 LocusIdCompat 注释应用内 Activity 或 Fragment。使用 LocusIdCompat 可让建议系统正确地对对话进行排名,并使系统能够显示用户最后一次与对话互动(包括应用内互动)的正确时间。如果您使用 setShortcutInfo() 将对话与快捷方式关联,对话系统会自动附加适当的 LocusIdCompat

对话空间对以 Android 10 或更低版本为目标平台的应用有哪些要求

如果应用并非以 Android 11 为目标平台,其消息仍可呈现在对话空间中。不过,应用仍必须满足某些要求。本部分介绍了对这些应用有哪些要求,以及应用不满足这些要求时表现出的回退行为。

加入消息传递空间的核心要求是应用必须实现 MessagingStyle 通知,并且此类通知必须引用一个长期存在的快捷方式,该快捷方式在发布通知时发布。满足这些要求的通知会出现在对话空间中,其行为如下:

  • 通知以对话样式显示
  • 提供了对话泡按钮(如果已实现)
  • 以内嵌方式提供了对话专用的功能

如果通知不满足这些要求,则平台会使用回退选项来设置通知的格式。如果通知满足任意一种回退情况的要求,则会以特殊格式显示在对话空间中。如果通知不符合任意一个回退选项的条件,则不会显示在对话空间中。

回退:如果使用了 MessagingStyle 但未提供快捷方式

如果应用以 Android 10 或更低版本为目标平台,并且某条通知使用了 MessagingStyle 但未将消息与快捷方式关联,则该通知会显示在对话空间中,其行为如下:

  • 通知以对话样式显示
  • 没有提供“对话泡”按钮
  • 没有以内嵌方式提供对话专用的功能

回退:如果未使用 MessagingStyle 但将应用识别为即时通讯应用

如果某条通知未使用 MessagingStyle,但平台将应用识别为即时通讯应用,并且该通知的 category 参数设为 msg,则该通知会显示在对话空间中,其行为如下:

  • 通知以 Android 11 之前版本中的旧样式显示
  • 没有提供“对话泡”按钮
  • 没有以内嵌方式提供对话专用的功能

指导、使用和测试

本部分提供了有关如何使用和测试对话功能的一般指导。

我应该在何时使用对话?

对话通知和相关的快捷方式旨在改善实时对话的用户体验。例如,短信、文字聊天和通话就是用户期望能够快速沟通的实时对话。用户对电子邮件以及与对话无关的活动没有这样的期望。

我们为用户提供了相关功能,如果他们觉得给定的对话所在位置不合适,能够从对话部分中将其移除。

最佳实践

为提高用户互动度,让用户更轻松地与他人互动,并围绕您的应用开展对话,我们建议您遵循以下最佳做法。

  • 为确保未接电话呈现在按优先级排列的对话栏中,并在对话微件中正确显示,请将未接电话通知的格式设置为 conversations,并将其类别设置为 CATEGORY_MISSED_CALL
  • 为用户提供高品质的头像 (104dp);否则,系统会使用用户的姓名首字母缩写,这会大大降低互动体验。
  • 在用户尚未查看消息之前,请勿 cancel 相应对话通知。例如,在用户无法查看或处理消息的视图中打开应用时取消通知。如果用户没有机会阅读或处理消息,已取消的通知及其关联的对话泡被移除,这会导致对话缺失上下文。
  • 为与消息关联的 MIME 相关元数据提供 data URI,方便您在通知中为用户提供更加丰富的体验。
  • 使用 Android 12 status API,让对话微件更具吸引力。
  • 采用以下有关对话快捷方式的最佳实践。
    • 发布不推送通知的传入和外发应用内对话的快捷方式。同一对话的传入和传出消息应具有相同的快捷方式 ID。使用 pushDynamicShortcut() 发布快捷方式并报告使用情况。
    • 为避免您的快捷方式头像被无意中裁剪,请提供 AdaptiveIconDrawable 作为快捷方式的图标。如需了解详情,请参阅提供快捷方式图像
    • 为帮助系统提升您的快捷方式,请遵循获得最佳排名的准则。 您的快捷方式会在不同的系统界面中进行排名,包括 Android Sharesheet(如果它是共享快捷方式)。
    • 确保对话快捷方式 intents 直接启动相应的对话。
    • 使用 compat 库方便地将快捷方式设置为与 conversation 相关。

测试对话通知和快捷方式

长按对话会打开对话相关操作的菜单。
图 3:您可以长按对话通知并检查是否显示对话菜单,验证其配置是否正确。

如果您遵循对话空间准则,对话应自动出现在对话空间中。您可以长按通知来验证快捷方式是否已与通知正确集成。如果正确实现了集成,则界面会显示与对话相关的操作。如果通知未与快捷方式关联,则界面会显示一些文字,说明应用不支持对话功能。

长按应用启动器时,会显示已添加的快捷方式。请务必测试这些快捷方式是否可以使您转到应用中的正确位置。

共享您的共享快捷方式可以接收的内容时,已添加的共享快捷方式会显示在共享表单的直接共享行中。

对话微件

对话微件中显示的对话
图 1:对话微件中显示的对话。

在 Android 12 中,对话微件功能是对 Android 11 中引入的人与对话功能的扩展,允许应用在对话微件中显示对话状态。

对话微件能让用户在主屏幕上轻松打开聊天对话,借此促进用户互动。这些微件是增强的快捷方式,不仅能显示对话状态的片段或其他相关信息,还可以让用户高效地返回会话。

验证您的应用是否支持对话微件

如需验证您的应用是否支持对话微件,您至少需要两部 Android 设备(均搭载 Android 12)和两个用户账号(每部设备一个账号),以交换消息。在此过程中,我们将账号命名为“用户 A”和“用户 B”。

用于添加新对话微件的微件选择器界面
图 2:用于添加新对话微件的微件选择器界面。

请完成以下步骤:

  1. 在用户 A 的设备上,长按启动器。在微件选择器中,点按对话的新微件,如图 2 所示。
  2. 将微件拖动到主屏幕。您应该可以选择用户 A 应用中列出的正在进行的对话或近期对话。
  3. 现在,在用户 B 的设备上,向用户 A 发送一条测试消息。
  4. 返回用户 A 的设备,验证微件是否已更新,以显示来自用户 B 的消息通知。
  5. 可选:让用户 A 和用户 B 将对话设置为不同的状态值,以确保其微件能正确反映这些值。如需查看状态值的列表,请参阅 ConversationStatus