알림 풍선을 사용하면 사용자가 손쉽게 대화를 보고 참여할 수 있습니다.
다른 앱 콘텐츠 위를 떠다니며 사용자는 풍선을 펼쳐 앱 콘텐츠를 확인하고 상호작용할 수 있으며 사용하지 않을 때는 접을 수 있습니다.
기기가 잠겨 있거나 항상 켜져 있는 화면이 활성화되어 있으면 일반적인 알림 표시처럼 풍선이 나타납니다.
알림 풍선은 사용자가 사용 설정합니다. 풍선을 지원하는 알림에서 풍선 버튼을 탭하여 사용 설정할 수 있습니다. 이렇게 하면 특정 채팅이 항상 풍선으로 표시됩니다. 설정에서 사용자는 풍선으로 표시한 채팅을 조정하거나 전체 앱의 설정을 수정할 수 있습니다.
사용자는 다음 작업을 할 수 있습니다.
- 앱에 표시되는 모든 알림 풍선을 차단합니다. 알림이 차단되지는 않지만 풍선으로 표시되지 않습니다.
- 앱에서 선택한 알림 풍선을 허용합니다. 풍선 버튼을 사용하여 풍선으로 표시되는 알림이 '선택'됩니다.
- 앱에 표시되는 모든 알림 풍선을 허용합니다.
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부터는 시스템에서 모든 대화의
를 자동으로 "always"로 설정하므로 이 값을 명시적으로
documentLaunchMode 설정할 필요가 없습니다.
알림 풍선을 전송하려면 다음 단계를 따르세요.
- 알림을 만듭니다 일반적인 방법으로.
BubbleMetadata.Builder(PendingIntent, Icon)또는BubbleMetadata.Builder(String)을 호출하여BubbleMetadata객체를 만듭니다.-
setBubbleMetadata()를 사용하여 메타데이터를 알림에 추가합니다. - Android 11 이상을 타겟팅하는 경우 풍선 메타데이터 또는 알림이 공유 단축키를 참조하는지 확인합니다.
- 풍선으로 표시되는 알림을 취소하지 않도록 앱을 수정합니다.
알림 활동이 풍선으로 실행되는지 확인하려면
Activity#isLaunchedFromBubble()을 호출합니다. 알림을 취소하면 화면에서 풍선이 삭제됩니다. 풍선을 열면 연결된 알림이 자동으로 숨겨집니다.
이러한 단계는 다음 예에 나와 있습니다.
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)
자바
// 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()
자바
Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build();
풍선 콘텐츠 수명 주기
풍선이 펼쳐지면 콘텐츠 활동이 일반 프로세스 수명 주기를 거치므로 애플리케이션이 포그라운드 프로세스가 됩니다(아직 포그라운드 프로세스가 아닌 경우).
풍선이 접히거나 닫히면 활동이 삭제됩니다. 그러면 앱에 실행 중인 다른 포그라운드 구성요소가 있는지 여부에 따라 프로세스가 캐시되고 나중에 종료될 수 있습니다.
풍선이 표시되는 상황
사용자의 방해를 줄이기 위해 풍선은 특정 상황에서만 표시됩니다.
Android 11 이상을 타겟팅하는 앱에서는 대화 요구사항을 충족하지 않으면 알림이 풍선으로 표시되지 않습니다. 앱이 Android 10 이하를 타겟팅하는 경우 다음 조건 중 하나 이상을 충족하는 경우에만 알림이 풍선으로 표시됩니다.
- 알림이
MessagingStyle을 사용하고Person이 추가되었습니다. - 알림이
Service.startForeground호출에서 발생하고category가CATEGORY_CALL이며Person이 추가되었습니다. - 알림이 전송되었을 때 앱이 포그라운드에 있습니다.
위 조건이 충족되지 않으면 풍선 대신 알림이 표시됩니다.
풍선에서 활동 실행
풍선이 새 활동을 실행하면 새 활동은 동일한 작업 및 동일한 풍선 창 내에서 실행되거나 전체 화면의 새 작업에서 실행되어 풍선을 실행한 풍선을 접습니다.
풍선과 동일한 작업에서 새 활동을 실행하려면 다음 단계를 따르세요.
1. 인텐트를 실행할 때 활동 컨텍스트를 사용하고
activity.startActivity(intent), 1. 인텐트에 FLAG_ACTIVITY_NEW_TASK 플래그를 설정하지 않습니다.
그렇지 않으면 새 활동이 새 작업에서 시작되고 풍선이 접힙니다.
풍선은 특정 대화를 나타내므로 풍선 내에서 실행되는 활동은 해당 대화와 관련이 있어야 합니다. 또한 풍선 내에서 활동을 실행하면 풍선의 작업 스택이 증가하고 특히 탐색과 관련하여 사용자 환경이 복잡해질 수 있습니다.
권장사항
- 진행 중인 커뮤니케이션의 일부이거나 사용자가 콘텐츠에 풍선을 명시적으로 요청하는 경우와 같이 중요한 경우에만 알림을 풍선으로 전송합니다. 풍선은 화면 공간을 사용하고 다른 앱 콘텐츠를 가립니다.
- 풍선 알림이 일반 알림으로도 작동하는지 확인합니다. 사용자가 풍선을 사용 중지하면 풍선 알림이 일반 알림으로 표시됩니다.
- 풍선 활동에서
onBackPressed를 재정의할 때super.onBackPressed를 호출합니다. 그렇지 않으면 풍선이 올바르게 동작하지 않을 수 있습니다.
접힌 풍선에 업데이트된 메시지가 수신되면 읽지 않은 메시지를 나타내는 배지 아이콘이 풍선에 표시됩니다. 사용자가 연결된 앱에서 메시지를 열면 다음 단계를 따르세요.
- 업데이트
하여 알림을 숨깁니다.
BubbleMetadataBubbleMetadata.Builder.setSuppressNotification()을 호출합니다. 그러면 배지 아이콘이 삭제되어 사용자가 메시지와 상호작용한 것으로 표시됩니다. -
Notification.Builder.setOnlyAlertOnce()를true로 설정하여BubbleMetadata업데이트에 수반되는 소리나 진동을 중단합니다.
샘플 앱
SociaLite 샘플 앱은 풍선을 사용하는 대화 앱입니다. 이 앱에서는 시연을 위해 챗봇을 사용합니다. 실제 애플리케이션에서는 사람이 작성하는 메시지에 풍선을 사용합니다.