Wear의 알림 스타일

Google의 Wear OS는 알림 스타일을 지원하여 시계의 사용자 환경을 개선합니다.

가장 일반적인 알림 스타일은 다음과 같습니다.

  • 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 스마트폰에 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()
    

자바

    // 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()
    

자바

    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()을 호출하고, 여기에 BigTextStyle 또는 InboxStyle의 인스턴스를 전달합니다.

예를 들어 다음 코드는 전체 이벤트 설명을 포함하기 위해 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)
    

자바

    // 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 클래스를 사용할 수 있습니다. 시스템 UI가 활성 미디어 세션을 나타내는 알림을 식별하고 적절히 응답하려면(예: 잠금 화면에 앨범 아트워크 표시) setMediaSession(MediaSession.Token) 메서드를 사용하여 MediaSession.Token을 첨부하세요.

참고: 미디어 세션을 첨부하지 않은 채 로컬 알림에서 NotificationCompat.MediaStyle을 사용하면, 시스템은 이 알림을 일반 알림으로 표시하고 미디어 스타일 세부정보를 무시합니다.