حبابها دیدن و مشارکت در مکالمات را برای کاربران آسانتر میکنند.
حبابها در سیستم اعلانها تعبیه شدهاند. آنها روی محتوای دیگر برنامه شناور میشوند و هر جا که کاربر میرود، او را دنبال میکنند. کاربران میتوانند حبابها را باز کنند تا محتوای برنامه را نمایش دهند و با آن تعامل داشته باشند و وقتی از آنها استفاده نمیکنند، میتوانند آنها را جمع کنند.
وقتی دستگاه قفل است یا قابلیت نمایشگر همیشه روشن فعال است، حبابهایی مانند اعلانها ظاهر میشوند.
حبابها یک ویژگی انصراف هستند. وقتی یک برنامه اولین حباب خود را نمایش میدهد، یک پنجرهی مجوز دو انتخاب ارائه میدهد:
- تمام حبابهای برنامهتان را مسدود کنید. اعلانها مسدود نمیشوند، اما هرگز به صورت حباب ظاهر نمیشوند.
-  همه حبابها را از برنامه خود مجاز کنید. همه اعلانهای ارسال شده با BubbleMetaDataبه صورت حباب ظاهر میشوند.
API حباب
حبابها با استفاده از API اعلان ایجاد میشوند، بنابراین اعلان خود را به صورت عادی ارسال کنید. اگر میخواهید اعلان شما به صورت حباب نمایش داده شود، دادههای اضافی را به آن پیوست کنید.
نمای گستردهی یک حباب از فعالیتی که شما انتخاب میکنید ایجاد میشود. فعالیت را طوری پیکربندی کنید که به درستی به عنوان یک حباب نمایش داده شود. فعالیت باید قابل تغییر اندازه و جاسازی باشد. اگر فاقد هر یک از این الزامات باشد، به جای آن به عنوان یک اعلان نمایش داده میشود.
کد زیر نحوه پیادهسازی یک حباب را نشان میدهد:
<activity
  android:name=".bubbles.BubbleActivity"
  android:theme="@style/AppTheme.NoActionBar"
  android:label="@string/title_activity_bubble"
  android:allowEmbedded="true"
  android:resizeableActivity="true"
/>
 اگر برنامه شما چندین حباب از یک نوع را نشان میدهد، مانند چندین مکالمه چت با مخاطبین مختلف، فعالیت باید بتواند چندین نمونه را راهاندازی کند. در دستگاههایی که اندروید ۱۰ و پایینتر را اجرا میکنند، اعلانها به صورت حباب نشان داده نمیشوند، مگر اینکه صریحاً documentLaunchMode روی "always" تنظیم کنید. از اندروید ۱۱ به بعد، نیازی به تنظیم صریح این مقدار نیست، زیرا سیستم به طور خودکار documentLaunchMode همه مکالمات را روی "always" تنظیم میکند.
برای ارسال حباب، مراحل زیر را دنبال کنید:
- طبق معمول یک اعلان ایجاد کنید .
-  برای ایجاد یک شیء BubbleMetadataBubbleMetadata.Builder(PendingIntent, Icon)یاBubbleMetadata.Builder(String)را فراخوانی کنید.
-  برای اضافه کردن متادیتا به اعلان، از setBubbleMetadata()استفاده کنید.
- اگر اندروید ۱۱ یا بالاتر را هدف قرار دادهاید، مطمئن شوید که ابرداده یا اعلان حباب به یک میانبر اشتراکگذاری اشاره دارد.
-  برنامه خود را طوری تغییر دهید که اعلانهایی که به صورت حباب ظاهر میشوند را لغو نکند . برای بررسی اینکه آیا فعالیت اعلان به صورت حباب اجرا میشود یا خیر، Activity#isLaunchedFromBubble()فراخوانی کنید. لغو یک اعلان، حباب را از صفحه حذف میکند. باز کردن یک حباب به طور خودکار اعلان مرتبط با آن را پنهان میکند.
این مراحل در مثال زیر نشان داده شده است:
کاتلین
// 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)
جاوا
// 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() .
مثال زیر نحوه پیکربندی یک حباب را برای نمایش خودکار در حالت باز نشان میدهد:
کاتلین
val bubbleMetadata = Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build()
جاوا
Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build();
چرخه حیات محتوای حبابی
وقتی یک حباب بزرگ میشود، فعالیت محتوا چرخه حیات فرآیند عادی را طی میکند و در نتیجه، اگر برنامه از قبل به یک فرآیند پیشزمینه تبدیل نشده باشد، به آن تبدیل میشود.
وقتی حباب بسته یا حذف میشود، اکتیویتی از بین میرود. این ممکن است منجر به ذخیره شدن فرآیند و بعداً از بین رفتن آن شود، بسته به اینکه آیا برنامه اجزای پیشزمینه دیگری را در حال اجرا دارد یا خیر.
وقتی حبابها ظاهر میشوند
برای کاهش وقفه برای کاربر، حبابها فقط تحت شرایط خاصی ظاهر میشوند.
اگر برنامهای اندروید ۱۱ یا بالاتر را هدف قرار دهد، اعلان به صورت حباب ظاهر نمیشود مگر اینکه شرایط مکالمه را برآورده کند. اگر برنامهای اندروید ۱۰ یا پایینتر را هدف قرار دهد، اعلان فقط در صورتی به صورت حباب ظاهر میشود که یک یا چند مورد از شرایط زیر برآورده شود:
-  این اعلان از MessagingStyleاستفاده میکند و یکPersonبه آن اضافه شده است.
-  این اعلان از فراخوانی Service.startForegroundاست، دارایcategoryCATEGORY_CALLاست و یکPersonنیز به آن اضافه شده است.
- وقتی اعلان ارسال میشود، برنامه در پیشزمینه است.
اگر هیچ یک از این شرایط برآورده نشود، اعلان به جای حباب نشان داده میشود.
شروع فعالیتها از حبابها
وقتی یک حباب، فعالیت جدیدی را راهاندازی میکند، فعالیت جدید یا در همان وظیفه و در همان پنجره حبابی شکل، یا در یک وظیفه جدید در حالت تمام صفحه، اجرا میشود و حبابی که آن را راهاندازی کرده است، از بین میرود.
 برای راهاندازی یک اکتیویتی جدید در همان وظیفهای که حباب اجرا میشود: ۱. هنگام راهاندازی intentها، از context اکتیویتی، activity.startActivity(intent) استفاده کنید، و ۱. پرچم FLAG_ACTIVITY_NEW_TASK را روی intent تنظیم نکنید.
در غیر این صورت، فعالیت جدید در یک وظیفه جدید آغاز میشود و حباب از بین میرود.
به خاطر داشته باشید که یک حباب نشاندهنده یک مکالمه خاص است، بنابراین فعالیتهایی که درون حباب اجرا میشوند باید به آن مکالمه مرتبط باشند. علاوه بر این، اجرای یک فعالیت درون حباب، حجم وظایف حباب را افزایش میدهد و میتواند به طور بالقوه تجربه کاربری را، به ویژه در مورد ناوبری، پیچیده کند.
بهترین شیوهها
- فقط در صورتی که اعلان مهم باشد، مانند زمانی که بخشی از یک ارتباط مداوم است یا اگر کاربر صریحاً درخواست نمایش یک حباب برای محتوا را دارد، آن را به صورت حباب ارسال کنید. حبابها از فضای صفحه نمایش استفاده میکنند و سایر محتوای برنامه را میپوشانند.
- مطمئن شوید که اعلان حبابی شما به عنوان یک اعلان معمولی نیز کار میکند. وقتی کاربر حباب را غیرفعال میکند، یک اعلان حبابی به عنوان یک اعلان معمولی نمایش داده میشود.
-  هنگام override کردن onBackPressedدر فعالیت حباب،super.onBackPressedرا فراخوانی کنید. در غیر این صورت، حباب شما ممکن است به درستی رفتار نکند.
وقتی یک حباب جمعشده، پیام بهروزرسانیشدهای دریافت میکند، حباب یک نماد نشان را برای نشان دادن پیام خواندهنشده نشان میدهد. وقتی کاربر پیام را در برنامه مرتبط باز میکند، این مراحل را دنبال کنید:
-  BubbleMetadataرا بهروزرسانی کنید تا اعلان را سرکوب کنید.BubbleMetadata.Builder.setSuppressNotification()را فراخوانی کنید. این کار آیکون نشان را حذف میکند تا نشان دهد که کاربر با پیام تعامل داشته است.
-  برای جلوگیری از صدا یا لرزشی که همراه با بهروزرسانی BubbleMetadataرخ میدهد،Notification.Builder.setOnlyAlertOnce()را رویtrueتنظیم کنید.
نمونه برنامه
برنامه نمونه SociaLite یک برنامه مکالمه است که از حبابها استفاده میکند. برای اهداف نمایشی، این برنامه از چتباتها استفاده میکند. در برنامههای دنیای واقعی، از حبابها برای پیامهای ارسالی توسط انسانها استفاده کنید.
