استخدام فقاعات المحادثات للسماح للمستخدمين بالمشاركة في المحادثات

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

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

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

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

يمكنك إيقاف ميزة "فقاعات الدردشة". عندما يعرض أحد التطبيقات فقاعة العرض الأولى، يقدّم مربع حوار الأذونات خيارَين:

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

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

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

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

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

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

إذا كان تطبيقك يعرض فقاعات متعددة من النوع نفسه، مثل محادثات chat متعدّدة مع جهات اتصال مختلفة، يجب أن يكون النشاط قادرًا على إطلاق عمليات متعددة. على الأجهزة التي تعمل بنظام التشغيل Android 10 والإصدارات الأقدم، لا يتم عرض الإشعارات على شكل فقاعات ما لم تضبط 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 أو إصدارًا أحدث، لن يظهر الإشعار في شكل فقاعة ما لم يستوفِ متطلبات المحادثة. إذا كان التطبيق يستهدف نظام التشغيل Android 10 أو إصدارًا أقدم، لن يظهر الإشعار في شكل فقاعة إلا في حال استيفاء شرط واحد أو أكثر من الشروط التالية:

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

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

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

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

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

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

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

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

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

نموذج تطبيق

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