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

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

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

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

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

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

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

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

The Notification Bubble API

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

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

يوضّح الرمز البرمجي التالي كيفية تنفيذ فقاعة:

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

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

لإرسال إشعار منبثق، اتّبِع الخطوات التالية:

  1. أنشئ إشعارًا بالطريقة المعتادة.
  2. استخدِم BubbleMetadata.Builder(PendingIntent, Icon) أو BubbleMetadata.Builder(String) لإنشاء عنصر BubbleMetadata.
  3. استخدِم setBubbleMetadata() لإضافة بيانات التعريف إلى الإشعار.
  4. إذا كنت تستهدف الإصدار 11 من نظام التشغيل Android أو الإصدارات الأحدث، تأكَّد من أنّ بيانات وصف الفقاعة أو الإشعار يشيران إلى اختصار ميزة المشاركة.
  5. عدِّل تطبيقك كي لا يلغي الإشعارات التي تظهر في شكل فقاعات. للتحقّق مما إذا كان نشاط الإشعارات يتم تشغيله كفقاعة، استدعِ الدالة 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)

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

مراحل النشاط في فقاعات المحتوى

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

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

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

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

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

  • يستخدم الإشعار MessagingStyle وتمت إضافة Person إليه.
  • الإشعار وارد من مكالمة إلى Service.startForeground، ويتضمّن category بقيمة CATEGORY_CALL، ويتضمّن Person تمت إضافته.
  • يكون التطبيق في المقدّمة عند إرسال الإشعار.

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

والبحث عن "الفقاعات" في قائمة "الإعدادات" وتفعيل إعدادات "الفقاعات".

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

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

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

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

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

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

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

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

نموذج تطبيق

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