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

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

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

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

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

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

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

The 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".

כדי לשלוח בועה:

  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 ב-Intent.

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

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

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

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

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

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

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