בועות התראות מקלות על המשתמשים לראות את השיחות ולהשתתף בהן.
הן צפות מעל התוכן של אפליקציות אחרות, והמשתמשים יכולים להרחיב את הבועות כדי לראות את התוכן של האפליקציה ולבצע פעולות, וגם לכווץ אותן כשהם לא משתמשים בהן.
כשהמכשיר נעול או כשהתצוגה התמידית פעילה, הבועות מופיעות כהתראות רגילות.
המשתמש מפעיל את הבועות להצגת התראות. כדי לעשות את זה, צריך להקיש על לחצן הבועה בהתראות שתומכות בבועות. כך השיחה הספציפית הזו תמיד תופיע בבועה. בהגדרות, המשתמשים יכולים לשנות את ההגדרות של האפליקציה כולה או לבחור אילו צ'אטים יוצגו בבועות.
המשתמשים יכולים:
- חסימה של כל בועות ההתראות מהאפליקציה. ההתראות לא נחסמות, אבל הן אף פעם לא מופיעות כבועות.
- מאפשרים בועות להצגת התראות מאפליקציות נבחרות. התראות שמוצגות בבועות באמצעות לחצן הבועה הן 'נבחרות'.
- מאשרים את כל הבועות של ההתראות מהאפליקציה. כל ההתראות שנשלחות עם
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".
כדי לשלוח בועת התראה, פועלים לפי השלבים הבאים:
- יוצרים התראה כרגיל.
- מתקשרים אל
BubbleMetadata.Builder(PendingIntent, Icon)או אלBubbleMetadata.Builder(String)כדי ליצור אובייקטBubbleMetadata. - משתמשים ב-
setBubbleMetadata()כדי להוסיף את המטא-נתונים לתזכורת. - אם אתם מטargetים ל-Android 11 (רמת API 30) או לגרסאות חדשות יותר, ודאו שההפניה למטא-נתונים או להודעה של הבועה היא לקיצור דרך לשיתוף.
- משנים את האפליקציה כך שלא תבוטלנה הצגת ההתראות שמופיעות כבועות. ביטול ההתראה מסיר את הבועה מהמסך. כשפותחים בועה, ההתראה שמשויכת אליה מוסתרת באופן אוטומטי.
השלבים האלה מוצגים בדוגמה הבאה:
// 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) או לגרסאות קודמות, ההתראה מופיעה כבועה רק אם מתקיים אחד מהתנאים הבאים או יותר:
- ההתראה משתמשת ב-
MessagingStyleונוסף להPerson. - ההתראה היא משיחה עם
Service.startForeground, יש להcategoryשלCATEGORY_CALL, ונוסף להPerson. - האפליקציה בחזית כשההתראה נשלחת.
אם אף אחד מהתנאים האלה לא מתקיים, ההתראה מוצגת במקום בועה.
הפעלת פעילויות מבועות
כשמפעילים פעילות חדשה מתוך בועה, הפעילות החדשה תופעל באותה משימה ובאותו חלון בועה, או במשימה חדשה במסך מלא, והבועה שממנה היא הופעלה תצטמצם.
כדי להפעיל פעילות חדשה באותה משימה כמו הבועה:
1. משתמשים בהקשר של הפעילות כשמפעילים כוונות,
activity.startActivity(intent), ו
1. אל תגדירו את הדגל FLAG_ACTIVITY_NEW_TASK ב-Intent.
אחרת, הפעילות החדשה מתחילה במשימה חדשה והבועה מצטמצמת.
חשוב לזכור שכל בועה מייצגת שיחה ספציפית, ולכן הפעילויות שמופעלות בתוך הבועה צריכות להיות קשורות לשיחה הזו. בנוסף, הפעלת פעילות בתוך הבועה מגדילה את ערימת המשימות של הבועה, ויכולה לסבך את חוויית המשתמש, במיוחד בכל הנוגע לניווט.
שיטות מומלצות
- שליחת התראה כבועה רק אם היא חשובה, למשל אם היא חלק מתקשורת מתמשכת או אם המשתמש מבקש במפורש בועה לתוכן. הבועות תופסות מקום במסך ומסתירות תוכן של אפליקציות אחרות.
- מוודאים שההתראה בצורת בועה פועלת גם כהתראה רגילה. כשהמשתמש משבית את הבועה, ההתראה מופיעה כהתראה רגילה.
- משתמשים ב-composable
BackHandlerומקשרים את הפרמטרenabledלמצב ממשק המשתמש, כדי שהמערכת תיירט את הלחיצות על לחצן החזרה רק כשצריך. אחרי שה-handler משבית את עצמו, הבועה נסגרת.
כשמתקבל עדכון להודעה בבועה מכווצת, מופיע בבועה סמל תג כדי לציין שיש הודעה שלא נקראה. כשהמשתמש פותח את ההודעה באפליקציה המשויכת, פועלים לפי השלבים הבאים:
- מעדכנים את
BubbleMetadataכדי להשבית את ההתראה. מתקשרים אלBubbleMetadata.Builder.setSuppressNotification(). הפעולה הזו מסירה את סמל התג כדי לציין שהמשתמש ביצע אינטראקציה עם ההודעה. - מגדירים את
Notification.Builder.setOnlyAlertOnce()לערךtrueכדי להשתיק את הצליל או הרטט שמלווים את העדכון שלBubbleMetadata.
אפליקציה לדוגמה
אפליקציית הדוגמה SociaLite היא אפליקציה לשיחות שמשתמשת בבועות. לצורך הדגמה, האפליקציה הזו משתמשת בצ'אטבוטים. ביישומים בעולם האמיתי, כדאי להשתמש בבועות להודעות מאנשים.