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

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

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

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

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

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

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

ה-API של Bubbles

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

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

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

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

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

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

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

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