שימוש בבועות של התראות לניהול שיחות

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

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

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

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

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

המשתמשים יכולים:

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

The 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 (רמת API‏ 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 (רמת API 30) או לגרסאות מתקדמות יותר, ההתראה לא תופיע כבועה אלא אם היא עומדת בדרישות לשיחות. אם האפליקציה מיועדת ל-Android 10 (רמת API 29) או לגרסאות קודמות, ההתראה תופיע כבועה רק אם מתקיים אחד מהתנאים הבאים:

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

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

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

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

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

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

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

  • שליחת התראה כבועה רק אם היא חשובה, למשל אם היא חלק מתקשורת מתמשכת או אם המשתמש מבקש במפורש בועה לתוכן. הבועות תופסות מקום במסך ומסתירות תוכן של אפליקציות אחרות.
  • מוודאים שההתראה בצורת בועה פועלת גם כהתראה רגילה. כשהמשתמש משבית את הבועה, ההתראה מופיעה כהתראה רגילה.
  • משתמשים ב-composable‏ BackHandler ומקשרים את הפרמטר enabled שלו למצב ממשק המשתמש, כדי שהוא ייכנס לפעולה רק כשצריך. אחרי שה-handler משבית את עצמו, הבועה נסגרת.

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

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

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