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

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

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

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

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

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

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

ממשק ה-API של בועה

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

התצוגה המורחבת של הבועה תיווצר מפעילות שאתם בוחרים. מגדירים את הפעילות כך שתוצג כמו שצריך כבועה. הפעילות חייבת להיות resizeable וגם מוטמע. אם חסר בכל אחת מהדרישות האלה, הוא יוצג כהודעה.

הקוד הבא מדגים איך מטמיעים בועה:

<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 ואילך, יש לוודא שהבועה מטא-נתונים או התראה מפנים לקיצור דרך לשיתוף.

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

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. השתמשו בהקשר של הפעילות כשמפעילים Intentים, activity.startActivity(intent), וגם 1. אל תגדירו את הדגל FLAG_ACTIVITY_NEW_TASK ב-Intent.

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

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

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

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

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

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

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