בועות של התראות מאפשרות למשתמשים לראות שיחות ולהשתתף בהן בקלות.
הן צפות מעל תוכן אחר באפליקציה, והמשתמשים יכולים להרחיב אותן כדי לראות את תוכן האפליקציה ולבצע בו פעולות, או לכווץ אותן כשהם לא משתמשים בהן.
כשהמכשיר נעול או כשהתצוגה התמידית פעילה, הבועות מופיעות כמו התראות רגילות.
המשתמש הפעיל את בועות ההתראות. כדי לעשות את זה, הם יכולים ללחוץ על כפתור הבועה בהתראות שתומכות בבועות. כך השיחה הספציפית הזו תמיד תופיע כבועה. בהגדרות, המשתמשים יכולים לבחור אילו צ'אטים יופיעו כבועות או לשנות את ההגדרות של האפליקציה כולה.
המשתמשים יכולים:
- חסימה של כל בועות ההתראה מהאפליקציה. ההתראות לא נחסמות, אבל הן לא מופיעות כבועות.
- האפשרות הזו מאפשרת להציג בועות התראה נבחרות מהאפליקציה. התראות שמוצגות כבועות באמצעות כפתור הבועה הן התראות "נבחרות".
- לאשר את כל בועות ההתראות מהאפליקציה. כל ההתראות שנשלחות באמצעות
BubbleMetadataמופיעות כבועות.
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()כדי להוסיף את המטא-נתונים להתראה. - אם מטרגטים ל-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 היא אפליקציה מבוססת-שיחה שמשתמשת בבועות. למטרות הדגמה, האפליקציה הזו משתמשת בצ'אט בוטים. באפליקציות בעולם האמיתי, השתמשו בבועות להודעות של בני אדם.