Görüşmeler için bildirim balonlarını kullanma

Bildirim balonları, kullanıcıların görüşmeleri görmesini ve görüşmelere katılmasını kolaylaştırır.

Şekil 1. Sohbet balonu.

Diğer uygulama içeriklerinin üzerinde yüzerler. Kullanıcılar, uygulama içeriğini görüntülemek ve bu içerikle etkileşimde bulunmak için baloncukları genişletebilir, kullanmadıklarında ise daraltabilir.

Cihaz kilitliyken veya her zaman açık ekran etkin durumdayken mesaj balonları normal bildirimler gibi görünür.

Bildirim balonları kullanıcı tarafından etkinleştirilmiş olmalıdır. Bunun için, balonları destekleyen bildirimlerdeki balon düğmesine dokunabilirler. Bu sayede söz konusu sohbet her zaman balon olarak gösterilir. Kullanıcılar, ayarlarda hangi sohbetlerin balon olarak gösterileceğini ayarlayabilir veya uygulamanın genel ayarlarını değiştirebilir.

Kullanıcılar şunları yapabilir:

  • Uygulamanızdan gelen tüm bildirim baloncuklarını engeller. Bildirimler engellenmez ancak hiçbir zaman baloncuk olarak görünmez.
  • Uygulamanızdan gelen belirli bildirim balonlarına izin verin. Balon düğmesi kullanılarak oluşturulan bildirim balonları "seçilmiş"tir.
  • Uygulamanızdan gelen tüm bildirim baloncuklarına izin verin. BubbleMetadata ile gönderilen tüm bildirimler baloncuk olarak görünür.

Bildirim Balonu API'si

Bildirim balonları, bildirim API'si kullanılarak oluşturulur. Bildiriminizin balon olarak görünmesini istiyorsanız bildirime ek veriler ekleyin.

Seçtiğiniz bir etkinlikten balonun genişletilmiş görünümü oluşturulur. Etkinliği, balon olarak düzgün şekilde görünecek şekilde yapılandırın. Etkinlik yeniden boyutlandırılabilir ve yerleştirilmiş olmalıdır. Bu koşullardan birini karşılamıyorsa sistem bunu bildirim olarak gösterir.

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ürde birden fazla balon gösteriyorsa (ör. farklı kişilerle birden fazla sohbet görüşmesi), etkinliğin birden fazla örnek başlatabilmesi gerekir. Android 10 ve önceki sürümlerin yüklü olduğu cihazlarda, documentLaunchMode ayarını açıkça "always" olarak ayarlamadığınız sürece bildirimler balon 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ız gerekmez.

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

  1. Normalde yaptığınız gibi bir bildirim oluşturun.
  2. BubbleMetadata.Builder(PendingIntent, Icon) veya BubbleMetadata.Builder(String) çağrısı yaparak BubbleMetadata nesnesi oluşturun.
  3. Meta verileri bildirime eklemek için setBubbleMetadata() kullanın.
  4. Android 11 veya sonraki sürümler hedefleniyorsa balon meta verilerinin ya da bildirimlerin bir paylaşım kısayoluna referans verdiğinden emin olun.
  5. Uygulamanızı, baloncuk olarak görünen bildirimleri iptal etmeyecek şekilde değiştirin. Bildirim etkinliğinin kabarcık 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 balon ekranınızdan kaldırılır. Bir balon açıldığında, 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);

Baloncuk gönderildiğinde uygulamanız ön plandaysa önem düzeyi yoksayılır ve kullanıcı, uygulamanızdan gelen baloncukları veya bildirimleri engellemediği sürece baloncuk her zaman gösterilir.

Genişletilmiş baloncuk oluşturma

Sohbet balonunuzu, otomatik olarak genişletilmiş durumda gösterecek şekilde yapılandırabilirsiniz. Bu özelliği yalnızca kullanıcının yeni bir sohbet başlatmak için düğmeye dokunmak gibi bir balona neden olan bir işlem yapması durumunda kullanmanızı öneririz. Bu durumda, balon oluşturulduğunda gönderilen ilk bildirimi de devre dışı bırakmak mantıklıdır.

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österilecek şekilde nasıl yapılandırılacağı açıklanmaktadır:

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

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

Bir balon genişletildiğinde içerik etkinliği normal işlem yaşam döngüsünden geçer. Bu da uygulama önceden ön plan işlemi değilse ön plan işlemi haline gelir.

Balon daraltıldığında veya kapatıldığında etkinlik silinir. Bu durum, uygulamanın başka ön plan bileşenleri çalıştırıp çalıştırmadığına bağlı olarak işlemin önbelleğe alınmasına ve daha sonra sonlandırılmasına neden olabilir.

Balonlar ne zaman görünür?

Kullanıcının kesintiye uğramasını en aza indirmek için sohbet balonları yalnızca belirli durumlarda görünür.

Android 11 veya sonraki sürümleri hedefleyen uygulamalarda, sohbet şartlarını karşılamayan bildirimler balon olarak gösterilmez. Android 10 veya daha eski bir sürümü hedefleyen uygulamalarda bildirim yalnızca aşağıdaki koşullardan biri ya da daha fazlası karşılandığında balon olarak gösterilir:

Bu koşullardan hiçbiri karşılanmazsa bildirim, balon yerine gösterilir.

Balonlardan etkinlik başlatma

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

Aynı görevde yeni bir etkinlik başlatmak için: 1. Amaçları başlatırken etkinlik bağlamını kullanın, activity.startActivity(intent) ve 1. Niyette FLAG_ACTIVITY_NEW_TASK işaretini ayarlamayın.

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

Balonun belirli bir görüşmeyi temsil ettiğini unutmayın. Bu nedenle, balon içinde başlatılan etkinlikler söz konusu görüşmeyle ilgili olmalıdır. Ayrıca, baloncuk içinde bir etkinlik başlatmak baloncuk görev yığınını artırır ve kullanıcı deneyimini, özellikle gezinme konusunda zorlaştırabilir.

En iyi uygulamalar

  • Yalnızca önemli durumlarda (ör. devam eden bir iletişimin parçasıysa veya kullanıcı içerik için açıkça balon isteğinde bulunursa) bildirimi balon olarak gönderin. Sohbet 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.
  • Balon etkinliğinde onBackPressed geçersiz kılınırken super.onBackPressed işlevini çağırın. Aksi takdirde, sohbet balonunuz düzgün çalışmayabilir.

Daraltılmış bir baloncuk güncellenmiş bir mesaj aldığında, okunmamış mesaj olduğunu belirtmek için baloncukta bir rozet simgesi gösterilir. Kullanıcı mesajı ilişkili uygulamada açtığında şu adımları uygulayın:

Örnek uygulama

SociaLite örnek uygulaması, balonları kullanan bir sohbet uygulamasıdır. Bu uygulama, gösterim amacıyla sohbet botlarını kullanır. Gerçek hayattaki uygulamalarda, insanlardan gelen mesajlar için baloncukları kullanın.