שימוש בבועות כדי לאפשר למשתמשים להשתתף בשיחות

בעזרת הבועות, המשתמשים יכולים לראות בקלות את השיחות ולהשתתף בהן.

איור 1. בועת צ'אט.

הבועות מובנות במערכת ההתראות. הבועות מרחפות מעל תוכן אחר באפליקציה ועוקבות אחרי המשתמש בכל מקום שבו הוא נמצא. המשתמשים יכולים להרחיב את הבועות כדי לחשוף את תוכן האפליקציה וליצור איתו אינטראקציה, ויכולים לכווץ אותן כשהם לא משתמשים בהן.

כשהמכשיר נעול או כשהתצוגה התמידית פועלת, הבועות מופיעות כמו התראות רגילות.

השימוש בבועות הוא תכונה אופציונלית. כשאפליקציה מציגה את הבועה הראשונה שלה, תיבת דו-שיח עם בקשה להרשאה מציעה שתי אפשרויות:

  • לחסום את כל הבועות מהאפליקציה. ההתראות לא נחסמות, אבל הן אף פעם לא מופיעות כבועות.
  • מאפשרים את כל הבועות מהאפליקציה. כל ההתראות שנשלחות באמצעות BubbleMetaData מופיעות כבועות.

ה-API של Bubbles

הבועות נוצרות באמצעות 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" באופן מפורש. החל מגרסה 11 של Android, אין צורך להגדיר את הערך הזה באופן מפורש, כי המערכת מגדירה את הערך "always" לכל השיחות באופן אוטומטי.documentLaunchMode

כדי לשלוח בועה:

  1. יוצרים התראה כרגיל.
  2. קוראים ל-BubbleMetadata.Builder(PendingIntent, Icon) או ל-BubbleMetadata.Builder(String) כדי ליצור אובייקט BubbleMetadata.
  3. משתמשים ב-setBubbleMetadata() כדי להוסיף את המטא-נתונים להתראה.
  4. אם מטרגטים ל-Android מגרסה 11 ואילך, חשוב לוודא שהמטא-נתונים או ההתראה בבועה מפנים לקצרת דרך לשיתוף.
  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();

מחזור החיים של תוכן בבועה

כשמגדילים בועה, פעילות התוכן עוברת את מחזור החיים הרגיל של התהליך, וכתוצאה מכך האפליקציה הופכת לתהליך בחזית, אם היא לא כבר כזו.

כשהבועה מכוונת או נסגרת, הפעילות נמחקת. כתוצאה מכך, יכול להיות שהתהליך יועבר למטמון ויושבת מאוחר יותר, בהתאם לרכיבים אחרים בחזית האפליקציה שפועלים.

מתי מופיעות בועות

כדי לצמצם את ההפרעות למשתמש, הבועות מופיעות רק בנסיבות מסוימות.

אם אפליקציה מטרגטת את Android 11 ואילך, התראה לא מופיעה כבועה אלא אם היא עומדת בדרישות לשיחת. אם אפליקציה מטרגטת את Android מגרסה 10 ואילך, ההתראה תופיע כבועה רק אם מתקיים אחד או יותר מהתנאים הבאים:

אם אף אחד מהתנאים האלה לא מתקיים, ההתראה תוצג במקום הבועה.

הפעלת פעילויות מתוך בועות

כשבועה מפעילה פעילות חדשה, הפעילות החדשה תופעל באותה משימה ובאותו חלון בבועה, או במשימה חדשה במסך מלא, והבועה שהפעילה אותה תתכווץ.

כדי להפעיל פעילות חדשה באותה משימה שבה נמצאת הבועה: 1. משתמשים בהקשר הפעילות כשמריצים כוונות, activity.startActivity(intent) ו-1. לא מגדירים את הדגל FLAG_ACTIVITY_NEW_TASK בכוונה.

אחרת, הפעילות החדשה תתחיל במשימה חדשה והבועה תיסגר.

חשוב לזכור שכל בועה מייצגת שיחה ספציפית, ולכן הפעילויות שמפעילים בתוך הבועה צריכות להיות קשורות לשיחה הזו. בנוסף, הפעלת פעילות בתוך הבועה מגדילה את סטאק המשימות של הבועה, ויכולה לסבך את חוויית המשתמש, במיוחד בנושא הניווט.

שיטות מומלצות

  • שולחים התראה כבועה רק אם היא חשובה, למשל אם היא חלק מתקשורת מתמשכת או אם המשתמש מבקש באופן מפורש להציג את התוכן בבועה. הבועות תופסות מקום במסך ומכסות תוכן של אפליקציות אחרות.
  • מוודאים שההתראה בבועה פועלת גם כהתראה רגילה. כשהמשתמש משבית את הבועה, התראה בבועה מוצגת כהתראה רגילה.
  • צריך לקרוא לפונקציה super.onBackPressed כשמבטלים את ההגדרה של onBackPressed בפעילות של הבועה. אחרת, יכול להיות שהבועה לא תפעל כמו שצריך.

כשמקבלים הודעה מעודכנת בבועה מכוונת, מופיע בה סמל תג כדי לציין שזו הודעה שלא נקראה. כשהמשתמש פותח את ההודעה באפליקציה המשויכת, פועלים לפי השלבים הבאים:

אפליקציה לדוגמה

האפליקציה לדוגמה SociaLite היא אפליקציית שיחות שמשתמשת בבועות. למטרות הדגמה, באפליקציה הזו נעשה שימוש ב-chatbots. באפליקציות בעולם האמיתי, כדאי להשתמש בבועות להודעות של בני אדם.