Wear 上的通知样式

Wear OS by Google 谷歌支持通知样式以提升手表的用户体验。

最常见的通知样式包括:

  • BIG_TEXT_STYLE
  • BIG_PICTURE_STYLE
  • INBOX_STYLE
  • MESSAGING_STYLE

下面几部分介绍如何向您的通知添加 MESSAGING_STYLEBIG_TEXT_STYLE。要并入其他通知样式,请参阅 Wear 通知示例。

构建 MessagingStyle 通知

如果您有聊天短信应用,您的通知应使用 NotificationCompat.MessagingStyle,它是 Android 7.0 中新增的样式。Wear 使用 MessagingStyle 通知中包含的聊天消息(请参阅 addMessage())在展开式通知中提供类似聊天应用的丰富体验。

注意MessagingStyle 展开式通知要求配对的 Android 手机上至少安装了 Wear 配套应用 1.5.0.2861804 版本。

智能回复

Wear 针对 MessagingStyle 通知引入了智能回复。智能回复在展开式通知和 RemoteInput 中为用户提供与情境相关的可触摸选项。这些选项扩充了开发者使用 setChoices() 方法在 RemoteInput 中提供的固定选项列表。

智能回复让用户可通过快速(只需点按一下)、礼貌(无需大声说话)、私密(用户接收的消息绝不会离开手表)且可靠(无需连接互联网)的方式响应聊天消息。

智能回复响应由一个完全在手表上的机器学习模型使用 MessagingStyle 通知提供的上下文生成。生成智能回复响应无需向 Google 服务器发送用户通知数据。

要为通知操作启用智能回复,您需要执行以下操作:

  1. 使用 NotificationCompat.MessagingStyle
  2. 为通知操作调用 setAllowGeneratedReplies(true) 方法。
  3. 确保为通知操作定义了 RemoteInput(响应所在的位置)。

以下示例展示了如何创建带有智能回复响应的 MessagingStyle 通知。

Kotlin

    // Create an intent for the reply action
    val replyPendingIntent = Intent(this, ReplyActivity::class.java).let { replyIntent ->
        PendingIntent.getActivity(this, 0, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT)
    }

    // Create the reply action and add the remote input
    val action = NotificationCompat.Action.Builder(
            R.drawable.ic_reply_icon,
            getString(R.string.label),
            replyPendingIntent
    )
            .addRemoteInput(remoteInput)
            // 1) allow generated replies
            .setAllowGeneratedReplies(true)
            .build()

    val noti = NotificationCompat.Builder(context, channelId)
            .setContentTitle("${messages.size} new messages with $sender")
            .setContentText(subject)
            .setSmallIcon(R.drawable.new_message)
            .setLargeIcon(aBitmap)
            // 2) set the style to MessagingStyle
            .setStyle(
                    NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
                            .addMessage(messages[0].text, messages[0].time, messages[0].sender)
                            .addMessage(messages[1].text, messages[1].time, messages[1].sender)
            )
            // 3) add an action with RemoteInput
            .extend(NotificationCompat.WearableExtender().addAction(action)).build()
    

Java

    // Create an intent for the reply action
    Intent replyIntent = new Intent(this, ReplyActivity.class);
    PendingIntent replyPendingIntent =
       PendingIntent.getActivity(this, 0, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    // Create the reply action and add the remote input
    NotificationCompat.Action action =
       new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
       getString(R.string.label), replyPendingIntent)
      .addRemoteInput(remoteInput)
       // 1) allow generated replies
      .setAllowGeneratedReplies(true)
      .build();

    Notification noti = new NotificationCompat.Builder()
        .setContentTitle(messages.length + " new messages with " + sender.toString())
        .setContentText(subject)
        .setSmallIcon(R.drawable.new_message)
        .setLargeIcon(aBitmap)
        // 2) set the style to MessagingStyle
        .setStyle(new NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
        .addMessage(messages[0].getText(), messages[0].getTime(), messages[0].getSender())
        .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getSender()))
        // 3) add an action with RemoteInput
        .extend(new WearableExtender().addAction(action)).build();
    

向 MessagingStyle 通知添加图片

您可以向通知消息添加图片,方法是设置适当的 MIME 类型,并在 NotificationCompat.MessagingStyle.Message.setData() 方法中添加图片的 URI。

以下代码段可在通知中设置图片类型的数据:

Kotlin

    val message = NotificationCompat.MessagingStyle.Message("sticker", 1, "Jeff")
            .setData("image/png", stickerUri)

    val notification = NotificationCompat.Builder(context, channelId)
            .setStyle(
                    NotificationCompat.MessagingStyle("Me").addMessage(message)
            )
            .build()
    

Java

    NotificationCompat.MessagingStyle.Message message = new Message("sticker", 1, "Jeff")
       .setData("image/png", stickerUri);

    NotificationCompat notification = new NotificationCompat.Builder()
        .setStyle(new NotificationCompat.MessagingStyle("Me")
            .addMessage(message))
        .build();
    

在上述代码段中,变量 stickerUri 是一个 URI,它指向一个可公开访问的位置,如此处所述。

构建 BigTextStyle 通知

您可以使用 BIG_TEXT_STYLE 将扩展文本内容插入您的通知。在手持式设备上,用户可以展开通知来查看扩展内容。在穿戴式设备上,当您使用 BigTextStyle 时,默认情况下会看到展开的内容。

要向您的通知添加扩展内容,请在 NotificationCompat.Builder 对象上调用 setStyle(),向其传递一个 BigTextStyleInboxStyle 实例。

例如,以下代码向事件通知添加了一个 NotificationCompat.BigTextStyle 实例,以包含完整的事件说明(它包含的文本太多,为 setContentText() 提供的空间容纳不下)。

Kotlin

    // Specify the 'big view' content to display the long
    // event description that may not fit the normal content text.
    val bigStyle = NotificationCompat.BigTextStyle().run {
        bigText(eventDescription)
    }

    val notificationBuilder = NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_event)
            .setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.notif_background))
            .setContentTitle(eventTitle)
            .setContentText(eventLocation)
            .setContentIntent(viewPendingIntent)
            .addAction(R.drawable.ic_map, getString(R.string.map), mapPendingIntent)
            .setStyle(bigStyle)
    

Java

    // Specify the 'big view' content to display the long
    // event description that may not fit the normal content text.
    BigTextStyle bigStyle = new NotificationCompat.BigTextStyle();
    bigStyle.bigText(eventDescription);

    NotificationCompat.Builder notificationBuilder =
        new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_event)
            .setLargeIcon(BitmapFactory.decodeResource(
                    getResources(), R.drawable.notif_background))
            .setContentTitle(eventTitle)
            .setContentText(eventLocation)
            .setContentIntent(viewPendingIntent)
            .addAction(R.drawable.ic_map,
                    getString(R.string.map), mapPendingIntent)
            .setStyle(bigStyle);
    

请注意,您可以使用 setLargeIcon() 方法向任意通知添加大图标图片。不过,这些图标在穿戴式设备上显示为大背景图片,在为适应穿戴式设备屏幕而放大后显示效果不佳。要向通知添加穿戴式设备专属背景图片,请参阅为通知添加穿戴式设备专属功能。如需详细了解如何设计带有大图片的通知,请参阅 Wear OS 设计原则

构建 MediaStyle 通知

您可以使用 NotificationCompat.MediaStyle 类在您的通知中添加播放控件。要使系统界面能够识别表示活动媒体会话的通知并相应地做出响应(例如,通过在锁定屏幕中显示专辑封面),请使用 setMediaSession(MediaSession.Token) 方法附加 MediaSession.Token

注意:如果您对未附加媒体会话的本地通知使用 NotificationCompat.MediaStyle,系统会将该通知显示为常规通知,并忽略媒体样式详细信息。