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

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

איור 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. אם אתם מטargetים ל-Android 11 (רמת API‏ 30) או לגרסאות חדשות יותר, ודאו שהמטא-נתונים של הבועות או ההפניות להתראות מפנים לקיצור דרך לשיתוף.
  5. משנים את האפליקציה כך שלא תבטל התראות שמופיעות כבועות. ביטול ההתראה יגרום להסרת הבועה מהמסך. כשפותחים בועה, ההתראה שמשויכת אליה מוסתרת באופן אוטומטי.

השלבים האלה מופיעים בדוגמה הבאה:

  // 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(context, 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)

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

איך יוצרים בועה מורחבת

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

יש שיטות להגדרת דגלים שמפעילים את ההתנהגויות האלה: setAutoExpandBubble() ו- setSuppressNotification().

בדוגמה הבאה מוצג איך להגדיר בועה כך שתוצג אוטומטית במצב מורחב:

  val bubbleMetadata = Notification.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.

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

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

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

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

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

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

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