استخدام فقاعات الإشعارات للمحادثات

تسهّل فقاعات الإشعارات على المستخدمين الاطّلاع على المحادثات والمشاركة فيها.

الشكل 1. فقاعة محادثة

تظهر الفقاعات فوق محتوى التطبيقات الأخرى، ويمكن للمستخدمين توسيعها للكشف عن محتوى التطبيق والتفاعل معه، ويمكنهم تصغيرها عندما لا يستخدمونها.

عند قفل الجهاز أو تفعيل ميزة "تشغيل الشاشة دائمًا"، تظهر الفقاعات كالإشعارات العادية.

يتم تفعيل فقاعات الإشعارات من قِبل المستخدم. ويمكنه إجراء ذلك من خلال النقر على زر الفقاعة في الإشعارات التي تتيح استخدام الفقاعات. يسمح هذا الإجراء بعرض فقاعة المحادثة المحدّدة دائمًا. في الإعدادات، يمكن للمستخدمين تعديل المحادثات التي تم عرضها في فقاعات أو تعديل إعدادات التطبيق بشكل عام.

يمكن للمستخدمين إجراء ما يلي:

  • حظر جميع فقاعات الإشعارات من تطبيقك: لا يتم حظر الإشعارات، ولكنها لا تظهر أبدًا كفقاعات.
  • السماح بفقاعات إشعارات محدّدة من تطبيقك: يتم "اختيار" فقاعات الإشعارات التي يتم عرضها باستخدام زر الفقاعة.
  • السماح بجميع فقاعات الإشعارات من تطبيقك: تظهر جميع الإشعارات المُرسَلة باستخدام BubbleMetadata كفقاعات.

واجهة برمجة التطبيقات Notification Bubble API

يتم إنشاء فقاعات الإشعارات باستخدام Notification 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 (مستوى واجهة برمجة التطبيقات 30) أو الإصدارات الأحدث، تأكَّد من أنّ بيانات تعريف الفقاعة أو الإشعار تشير إلى اختصار ميزة المشاركة.
  5. عدِّل تطبيقك لكي لا يلغي الإشعارات التي تظهر كفقاعات. يؤدي إلغاء الإشعار إلى إزالة الفقاعة من الشاشة. يؤدي فتح فقاعة إلى إخفاء الإشعار المرتبط بها تلقائيًا.

تظهر هذه الخطوات في المثال التالي:

// Create a bubble intent.
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent =
    PendingIntent.getActivity(context, 0, target, PendingIntent.FLAG_IMMUTABLE /* 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 =
    ShortcutInfoCompat.Builder(context, shortcutId)
        .setCategories(setOf(category))
        .setIntent(Intent(Intent.ACTION_DEFAULT))
        .setLongLived(true)
        .setShortLabel("Chat partner name")
        .build()
// Publish the shortcut, otherwise the bubble metadata will not apply.
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)

// Create a bubble metadata.
val bubbleData = NotificationCompat.BubbleMetadata.Builder(bubbleIntent,
    IconCompat.createWithResource(context, R.drawable.ic_logo))
    .setDesiredHeight(600)
    .build()

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

إذا كان تطبيقك في المقدّمة عند إرسال فقاعة، يتم تجاهل مستوى الأهمية وتظهر الفقاعة دائمًا، ما لم يحظر المستخدم الفقاعات أو الإشعارات من تطبيقك.

إنشاء فقاعة موسّعة

يمكنك ضبط الفقاعة لعرضها في حالة موسّعة تلقائيًا. ننصحك باستخدام هذه الميزة فقط إذا اتّخذ المستخدم إجراءً يؤدي إلى ظهور فقاعة، مثل النقر على زر لبدء محادثة جديدة. في هذه الحالة، من المنطقي أيضًا إيقاف الإشعار الأولي الذي يتم إرساله عند إنشاء فقاعة.

هناك طريقتان يمكنك استخدامهما لضبط العلامات التي تفعِّل هذه السلوكيات: setAutoExpandBubble() و setSuppressNotification().

يوضّح المثال التالي كيفية ضبط فقاعة لعرضها تلقائيًا في حالة موسّعة:

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

دورة حياة محتوى الفقاعة

عند توسيع فقاعة، يمرّ نشاط المحتوى بدورة حياة العملية العادية، ما يؤدي إلى أن يصبح التطبيق عملية في المقدّمة، إذا لم يكن كذلك من قبل.

عند تصغير الفقاعة أو إغلاقها، يتم إتلاف النشاط. قد يؤدي ذلك إلى تخزين العملية مؤقتًا ثم إيقافها، وذلك حسب ما إذا كان التطبيق يتضمّن مكوّنات أخرى تعمل في المقدّمة.

حالات ظهور الفقاعات

للحدّ من مقاطعة المستخدم، لا تظهر الفقاعات إلا في ظروف معيّنة.

إذا كان التطبيق يستهدف Android 11 (المستوى 30 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، لا يظهر الإشعار كفقاعة إلا إذا استوفى متطلبات المحادثة. إذا كان التطبيق يستهدف Android 10 (مستوى واجهة برمجة التطبيقات 29) أو الإصدارات الأقدم، لا يظهر الإشعار كفقاعة إلا إذا استوفى شرطًا واحدًا أو أكثر من الشروط التالية:

إذا لم يتم استيفاء أي من هذه الشروط، يظهر الإشعار بدلاً من الفقاعة.

تشغيل الأنشطة من الفقاعات

عندما تشغّل فقاعة نشاطًا جديدًا، سيتم تشغيل النشاط الجديد إما ضمن المهمة نفسها والنافذة نفسها التي تم عرضها في فقاعة، أو في مهمة جديدة بملء الشاشة، ما يؤدي إلى تصغير الفقاعة التي شغّلتها.

لتشغيل نشاط جديد في المهمة نفسها التي تم عرضها في فقاعة: 1. استخدِم سياق النشاط عند تشغيل النوايا، activity.startActivity(intent), و 1. لا تضبط العلامة FLAG_ACTIVITY_NEW_TASK على النية.

بخلاف ذلك، يتم تشغيل النشاط الجديد في مهمة جديدة ويتم تصغير الفقاعة.

ضَع في اعتبارك أنّ الفقاعة تمثّل محادثة معيّنة، لذا يجب أن تكون الأنشطة التي يتم تشغيلها داخل الفقاعة مرتبطة بهذه المحادثة. بالإضافة إلى ذلك، يؤدي تشغيل نشاط داخل الفقاعة إلى زيادة مكدس المهام للفقاعة وقد يؤدي إلى تعقيد تجربة المستخدم، خاصةً فيما يتعلق بالتنقّل.

أفضل الممارسات

  • أرسِل إشعارًا كفقاعة فقط إذا كان مهمًا، مثلاً إذا كان جزءًا من عملية تواصل مستمرة أو إذا طلب المستخدم صراحةً فقاعة لعرض المحتوى. تستخدم الفقاعات مساحة الشاشة وتغطّي محتوى التطبيقات الأخرى.
  • تأكَّد من أنّ إشعار الفقاعة يعمل أيضًا كإشعار عادي. عندما يوقف المستخدم الفقاعة، يظهر إشعار الفقاعة كإشعار عادي.
  • استخدِم الدالة المركّبة BackHandler واربط المعلمة enabled بحالة واجهة المستخدم حتى لا تعترض على عمليات الضغط على زر الرجوع إلا عند الضرورة. بعد أن يوقف المعالج نفسه، يتم تصغير الفقاعة.

عندما تتلقّى فقاعة مصغّرة رسالة معدَّلة، تعرض الفقاعة رمز شارة للإشارة إلى وجود رسالة غير مقروءة. عندما يفتح المستخدم الرسالة في التطبيق المرتبط بها، اتّبِع الخطوات التالية:

نموذج التطبيق

تطبيق SociaLite النموذجي هو تطبيق محادثة يستخدم الفقاعات. لأغراض العرض التوضيحي، يستخدم هذا التطبيق روبوتات الدردشة. في التطبيقات الواقعية، استخدِم الفقاعات للرسائل التي يرسلها الأشخاص.