Wear 上的通知样式

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

最常见的通知样式包括:

  • BIG_TEXT_STYLE
  • BIG_PICTURE_STYLE
  • INBOX_STYLE
  • MESSAGING_STYLE

以下各部分讨论如何向通知添加 MESSAGING_STYLEBIG_TEXT_STYLE。要包含其他通知样式,请参阅 Wear 通知示例。

构建 MessagingStyle 通知

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

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

智能回复

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 类型并将图片的 URI 放入 NotificationCompat.MessagingStyle.Message.setData() 方法中,即可向通知消息添加图片。

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

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,系统会将该通知显示为常规通知,并忽略媒体样式详细信息。