Kullanıcıların görüşmelere katılmasına izin vermek için baloncukları kullanın

Baloncuklar, kullanıcıların sohbetleri görmesini ve sohbetlere katılmasını kolaylaştırır.

Şekil 1. Sohbet balonu.

Balonlar, bildirim sistemine yerleştirilmiştir. Diğer uygulama içeriklerinin üzerinde yüzer ve kullanıcıyı gittiği her yerde takip eder. Kullanıcılar, uygulama içeriğini görmek ve onunla etkileşime geçmek için baloncukları genişletebilir, kullanmadıklarında ise daraltabilir.

Cihaz kilitliyken veya her zaman açık ekran etkinken bildirimler normal şekilde baloncuk şeklinde görünür.

Baloncuklar, devre dışı bırakılabilen bir özelliktir. Bir uygulama ilk balonunu gösterdiğinde izin iletişim kutusunda iki seçenek sunulur:

  • Uygulamanızdaki tüm baloncukları engelleyin. Bildirimler engellenmez ancak hiçbir zaman baloncuk olarak görünmez.
  • Uygulamanızdan gelen tüm baloncuklara izin verin. BubbleMetaData ile gönderilen tüm bildirimler baloncuk olarak görünür.

Bubble API

Balonlar, bildirim API'si kullanılarak oluşturulur. Bu nedenle, bildiriminizi normal şekilde gönderin. Bildiriminizin baloncuk olarak gösterilmesini istiyorsanız bildirime ek veri ekleyin.

Balonun genişletilmiş görünümü, seçtiğiniz bir etkinlikten oluşturulur. Etkinliği, balon olarak düzgün şekilde gösterilecek şekilde yapılandırın. Etkinlik yeniden boyutlandırılabilir ve yerleştirilebilir olmalıdır. Bu koşullardan herhangi birine uymuyorsa bildirim olarak gösterilir.

Aşağıdaki kodda, balonun nasıl uygulanacağı gösterilmektedir:

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

Uygulamanız aynı türden birden fazla balon (ör. farklı kişilerle birden fazla sohbet görüşmesi) gösteriyorsa etkinlik birden fazla örnek başlatabilmelidir. Android 10 ve önceki sürümleri çalıştıran cihazlarda, documentLaunchMode ayarını "always" olarak açıkça belirlemediğiniz sürece bildirimler baloncuk olarak gösterilmez. Android 11'den itibaren sistem tüm görüşmelerin documentLaunchMode değerini otomatik olarak "always" olarak ayarladığından bu değeri açıkça ayarlamanıza gerek yoktur.

Balon göndermek için aşağıdaki adımları uygulayın:

  1. Normalde yaptığınız gibi bir bildirim oluşturun.
  2. BubbleMetadata nesnesi oluşturmak için BubbleMetadata.Builder(PendingIntent, Icon) veya BubbleMetadata.Builder(String) işlevini çağırın.
  3. Meta verileri bildirime eklemek için setBubbleMetadata() simgesini kullanın.
  4. Android 11 veya sonraki sürümleri hedefliyorsanız balon meta verilerinin veya bildirimin bir paylaşım kısayoluna atıfta bulunduğundan emin olun.
  5. Uygulamanızı, baloncuk olarak görünen bildirimleri iptal etmeyecek şekilde değiştirin. Bildirim etkinliğinin balon olarak başlatılıp başlatılmadığını kontrol etmek için Activity#isLaunchedFromBubble() işlevini çağırın. Bir bildirimi iptal ettiğinizde baloncuk ekrandan kaldırılır. Bir balonu açtığınızda, onunla ilişkili bildirim otomatik olarak gizlenir.

Bu adımlar aşağıdaki örnekte gösterilmektedir:

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);

Bir baloncuk gönderildiğinde uygulamanız ön plandaysa önem dikkate alınmaz ve kullanıcı uygulamanızdaki baloncukları veya bildirimleri engellemediği sürece baloncuğunuz her zaman gösterilir.

Genişletilmiş balon oluşturma

Balonunuzu otomatik olarak genişletilmiş durumda sunacak şekilde yapılandırabilirsiniz. Bu özelliği yalnızca kullanıcı bir balonla sonuçlanan bir işlem yaptığında (ör. yeni bir sohbet başlatmak için bir düğmeye dokunma) kullanmanızı öneririz. Bu durumda, bir balon oluşturulduğunda gönderilen ilk bildirimi de engellemek mantıklı olur.

Bu davranışları etkinleştiren işaretleri ayarlamak için kullanabileceğiniz yöntemler vardır: setAutoExpandBubble() ve setSuppressNotification().

Aşağıdaki örnekte, bir balonun otomatik olarak genişletilmiş durumda gösterilmesi için nasıl yapılandırılacağı gösterilmektedir:

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

Baloncuk içerik yaşam döngüsü

Bir balon genişletildiğinde içerik etkinliği normal işlem yaşam döngüsünü tamamlar. Bu da, henüz ön planda değilse uygulamanın ön plan işlemi haline gelmesine neden olur.

Balon daraltıldığında veya kapatıldığında etkinlik yok edilir. Bu durum, uygulamanın çalışan başka ön plan bileşenlerine sahip olup olmadığına bağlı olarak işlemin önbelleğe alınmasına ve daha sonra sonlandırılmasına neden olabilir.

Baloncuklar ne zaman görünür?

Kullanıcının kesintiye uğramasını azaltmak için balonlar yalnızca belirli durumlarda gösterilir.

Bir uygulama Android 11 veya sonraki sürümleri hedefliyorsa ileti dizisi şartlarını karşılamadığı sürece bildirim baloncuk olarak görünmez. Bir uygulama Android 10 veya daha eski sürümleri hedefliyorsa bildirim yalnızca aşağıdaki koşullardan biri veya daha fazlası karşılanırsa baloncuk olarak görünür:

Bu koşulların hiçbiri karşılanmazsa baloncuk yerine bildirim gösterilir.

Balonlardan etkinlik başlatma

Bir balon yeni bir etkinlik başlattığında yeni etkinlik, aynı görev ve aynı balonlu pencerede ya da yeni bir görevde tam ekran olarak açılır ve başlatan balonu daraltır.

Balonla aynı görevde yeni bir etkinlik başlatmak için: 1. Intent'leri başlatırken etkinlik bağlamını kullanın, activity.startActivity(intent), ve 1. Intent'te FLAG_ACTIVITY_NEW_TASK işaretini ayarlamayın.

Aksi takdirde yeni etkinlik yeni bir görevde başlatılır ve baloncuk daraltılır.

Balonların belirli bir sohbeti temsil ettiğini unutmayın. Bu nedenle, balon içinde başlatılan etkinlikler bu sohbetle ilgili olmalıdır. Ayrıca, balon içinde bir etkinlik başlatmak balonun görev yığınını artırır ve özellikle gezinme konusunda kullanıcı deneyimini karmaşık hale getirebilir.

En iyi uygulamalar

  • Bildirimi yalnızca önemli olduğunda (ör. devam eden bir iletişimin parçası olduğunda veya kullanıcı içerik için açıkça balon isteğinde bulunduğunda) balon olarak gönderin. Balonlar ekran alanını kullanır ve diğer uygulama içeriklerini kapatır.
  • Balon bildiriminizin normal bildirim olarak da çalıştığından emin olun. Kullanıcı balonu devre dışı bıraktığında balon bildirimi normal bildirim olarak gösterilir.
  • Kabarcık etkinliğinde onBackPressed öğesini geçersiz kıldığında super.onBackPressed öğesini çağırın. Aksi takdirde, balonunuz düzgün çalışmayabilir.

Daraltılmış bir balona güncellenmiş bir mesaj geldiğinde, balonda okunmamış mesajı belirten bir rozet simgesi gösterilir. Kullanıcı mesajı ilişkili uygulamada açtığında aşağıdaki adımları uygulayın:

Örnek uygulama

SociaLite örnek uygulaması, baloncukları kullanan bir sohbet uygulamasıdır. Bu uygulamada, gösterim amacıyla chatbot'lar kullanılmaktadır. Gerçek hayattaki uygulamalarda, gerçek kişiler tarafından gönderilen mesajlar için baloncuklar kullanın.