사용자가 대화에 참여할 수 있도록 대화창 사용

대화창을 사용하면 사용자가 더 쉽게 대화를 보고 참여할 수 있습니다.

그림 1. 채팅 풍선

도움말 풍선은 알림 시스템에 내장되어 있습니다. 다른 앱 콘텐츠 위를 떠다니며 어디를 가든 사용자의 위치를 따라갑니다. 사용자는 도움말 풍선을 펼쳐 앱 기능과 정보를 확인할 수 있으며, 사용하지 않을 때는 접을 수 있습니다.

기기가 잠겨 있거나 항상 켜져 있는 화면이 활성화되면 일반적인 알림과 같이 도움말 풍선이 표시됩니다.

버블은 선택 해제 기능입니다. 앱에 첫 번째 도움말 풍선이 표시되면 권한 대화상자에서 다음 두 가지 옵션을 제공합니다.

  • 앱에서 모든 도움말 풍선을 차단합니다. 알림이 차단되지는 않지만 도움말 풍선으로 표시되지 않습니다.
  • 앱의 모든 도움말 풍선을 허용합니다. BubbleMetaData와 함께 전송되는 모든 알림은 도움말 풍선으로 표시됩니다.

도움말 풍선 API

도움말 풍선은 알림 API를 통해 생성되므로 평소와 같이 알림을 전송합니다. 알림을 도움말 풍선으로 표시하려면 추가 데이터를 첨부하세요.

도움말 풍선 펼쳐 보기는 개발자가 선택하는 활동에서 생성됩니다. 도움말 풍선으로 올바르게 표시되도록 활동을 구성합니다. 활동은 크기 조절이 가능해야 하고 삽입되어야 합니다. 이러한 요구사항 중 하나라도 부족하면 대신 알림으로 표시됩니다.

다음 코드에서는 간단한 버블을 구현하는 방법을 보여줍니다.

<activity
  android:name=".bubbles.BubbleActivity"
  android:theme="@style/AppTheme.NoActionBar"
  android:label="@string/title_activity_bubble"
  android:allowEmbedded="true"
  android:resizeableActivity="true"
/>

서로 다른 연락처와의 여러 채팅 대화와 같이 유형이 같은 여러 개의 도움말 풍선이 앱에 표시되는 경우 해당 활동에서 여러 인스턴스를 실행할 수 있어야 합니다. Android 10 이하를 실행하는 기기에서는 documentLaunchMode를 명시적으로 "always"로 설정하지 않는 한 알림이 도움말 풍선으로 표시되지 않습니다. Android 11부터는 시스템에서 모든 대화의 documentLaunchMode"always"로 자동 설정하므로 이 값을 명시적으로 설정할 필요가 없습니다.

버블을 전송하려면 다음 단계를 따르세요.

  1. 평소와 같이 알림을 만듭니다.
  2. BubbleMetadata.Builder(PendingIntent, Icon) 또는 BubbleMetadata.Builder(String)를 호출하여 BubbleMetadata 객체를 만듭니다.
  3. setBubbleMetadata()를 사용하여 알림에 메타데이터를 추가합니다.
  4. Android 11 이상을 타겟팅하는 경우 도움말 풍선 메타데이터 또는 알림이 공유 바로가기를 참조해야 합니다.

이러한 단계는 다음 예에 나와 있습니다.

Kotlin

// Create a bubble intent.
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* flags */)
val category = "com.example.category.IMG_SHARE_TARGET"

val chatPartner = Person.Builder()
    .setName("Chat partner")
    .setImportant(true)
    .build()

// Create a sharing shortcut.
val shortcutId = generateShortcutId()
val shortcut =
   ShortcutInfo.Builder(mContext, shortcutId)
       .setCategories(setOf(category))
       .setIntent(Intent(Intent.ACTION_DEFAULT))
       .setLongLived(true)
       .setShortLabel(chatPartner.name)
       .build()

// Create a bubble metadata.
val bubbleData = Notification.BubbleMetadata.Builder(bubbleIntent,
            Icon.createWithResource(context, R.drawable.icon))
    .setDesiredHeight(600)
    .build()

// Create a notification, referencing the sharing shortcut.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setBubbleMetadata(bubbleData)
    .setShortcutId(shortcutId)
    .addPerson(chatPartner)

Java

// Create a bubble intent.
Intent target = new Intent(mContext, BubbleActivity.class);
PendingIntent bubbleIntent =
    PendingIntent.getActivity(mContext, 0, target, 0 /* flags */);

private val CATEGORY_TEXT_SHARE_TARGET =
    "com.example.category.IMG_SHARE_TARGET"

Person chatPartner = new Person.Builder()
        .setName("Chat partner")
        .setImportant(true)
        .build();

// Create a sharing shortcut.
private String shortcutId = generateShortcutId();
ShortcutInfo shortcut =
   new ShortcutInfo.Builder(mContext, shortcutId)
       .setCategories(Collections.singleton(CATEGORY_TEXT_SHARE_TARGET))
       .setIntent(Intent(Intent.ACTION_DEFAULT))
       .setLongLived(true)
       .setShortLabel(chatPartner.getName())
       .build();

// Create a bubble metadata.
Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder(bubbleIntent,
            Icon.createWithResource(context, R.drawable.icon))
        .setDesiredHeight(600)
        .build();

// Create a notification, referencing the sharing shortcut.
Notification.Builder builder =
    new Notification.Builder(mContext, CHANNEL_ID)
        .setContentIntent(contentIntent)
        .setSmallIcon(smallIcon)
        .setBubbleMetadata(bubbleData)
        .setShortcutId(shortcutId)
        .addPerson(chatPartner);

도움말 풍선이 전송될 때 앱이 포그라운드에 있으면 사용자가 앱에서 도움말 풍선이나 알림을 차단하지 않는 한 중요도가 무시되고 도움말 풍선이 항상 표시됩니다.

펼쳐진 도움말 풍선 만들기

버블이 자동으로 펼침 상태로 표시되도록 구성할 수 있습니다. 버튼을 탭하여 새 채팅을 시작하는 등 사용자가 대화창이 되는 작업을 실행하는 경우에만 이 기능을 사용하는 것이 좋습니다. 이 경우 도움말 풍선이 생성될 때 전송되는 초기 알림을 숨기는 것도 좋습니다.

이러한 동작을 사용 설정하는 플래그를 설정하는 데 사용할 수 있는 메서드는 setAutoExpandBubble()setSuppressNotification()입니다.

다음 예에서는 펼침 상태에 자동으로 표시되도록 도움말 풍선을 구성하는 방법을 보여줍니다.

Kotlin

val bubbleMetadata = Notification.BubbleMetadata.Builder()
    .setDesiredHeight(600)
    .setIntent(bubbleIntent)
    .setAutoExpandBubble(true)
    .setSuppressNotification(true)
    .build()

Java

Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder()
        .setDesiredHeight(600)
        .setIntent(bubbleIntent)
        .setAutoExpandBubble(true)
        .setSuppressNotification(true)
        .build();

버블 콘텐츠 수명 주기

도움말 풍선이 펼쳐지면 콘텐츠 활동이 일반 프로세스 수명 주기를 거치므로 애플리케이션이 포그라운드 프로세스가 아닌 경우 포그라운드 프로세스가 됩니다.

도움말 풍선이 접히거나 닫히면 활동이 소멸됩니다. 이로 인해 앱에 실행 중인 다른 포그라운드 구성요소가 있는지 여부에 따라 프로세스가 캐시되고 나중에 종료될 수 있습니다.

버블이 표시되는 상황

사용자에게 방해가 되지 않도록 도움말 풍선은 특정 상황에서만 표시됩니다.

앱이 Android 11 이상을 타겟팅하는 경우 알림이 대화 요구사항을 충족하지 않는 한 대화창으로 표시되지 않습니다. 앱이 Android 10 이하를 타겟팅하는 경우 다음 조건 중 하나 이상을 충족하는 경우에만 알림이 도움말 풍선으로 표시됩니다.

이러한 조건이 모두 충족되지 않으면 도움말 풍선 대신 알림이 표시됩니다.

권장사항

  • 진행 중인 커뮤니케이션의 일부이거나 사용자가 콘텐츠의 도움말 풍선을 명시적으로 요청하는 경우와 같이 중요한 경우에만 알림을 도움말 풍선으로 전송하세요. 도움말 풍선은 화면 공간을 사용하고 다른 앱 콘텐츠를 덮습니다.
  • 도움말 풍선 알림이 일반 알림으로도 작동하는지 확인합니다. 사용자가 대화창을 사용 중지하면 도움말 풍선 알림이 일반 알림으로 표시됩니다.
  • 기능은 최대한 구체적이고 가볍게 유지하세요. 활동 및 대화상자와 같이 도움말 풍선에서 시작하는 프로세스는 도움말 풍선 컨테이너 안에 표시됩니다. 즉, 도움말 풍선이 작업 스택을 가질 수 있다는 의미입니다. 도움말 풍선 내에 기능이나 탐색이 많으면 상황이 복잡해질 수 있습니다.
  • 도움말 풍선 활동에서 onBackPressed를 재정의할 때 super.onBackPressed를 호출합니다. 그렇지 않으면 도움말 풍선이 제대로 작동하지 않을 수 있습니다.

접힌 도움말 풍선에 업데이트된 메시지가 수신되면 읽지 않은 메시지를 나타내는 배지 아이콘이 도움말 풍선에 표시됩니다. 사용자가 연결된 앱에서 메시지를 열면 다음 단계를 따르세요.

샘플 앱

People 샘플 앱은 대화창을 사용하는 간단한 대화 앱입니다. 이 앱에서는 시연을 위해 챗봇을 사용합니다. 실제 애플리케이션에서는 봇이 아닌 사람이 작성하는 메시지에만 도움말 풍선을 사용해야 합니다.