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

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

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

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

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

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

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

ה-API של Bubbles

הבועות נוצרות באמצעות Notification 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 ואילך, חשוב לוודא שהמטא-נתונים או ההתראה בבועה מפנים לקצרת דרך לשיתוף.
  5. משנים את האפליקציה כך שלא תבטל התראות שמופיעות כבועות. כדי לבדוק אם פעילות ההתראות מופעלת כבועה, צריך להפעיל את הפונקציה Activity#isLaunchedFromBubble(). ביטול ההתראה מסיר את הבועה מהמסך. פתיחת בועה מסתירה באופן אוטומטי את ההתראה שמשויכת אליה.

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

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 בפעילות של הבועה. אחרת, ייתכן שהבועה לא תתנהג כראוי.

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

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

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