নোটিফিকেশন বাবল ব্যবহারকারীদের জন্য কথোপকথন দেখা এবং তাতে অংশগ্রহণ করা সহজ করে তোলে।
এগুলো অ্যাপের অন্যান্য কন্টেন্টের উপরে ভেসে থাকে এবং ব্যবহারকারীরা বাবলগুলো প্রসারিত করে অ্যাপের কন্টেন্ট দেখতে ও তার সাথে ইন্টারঅ্যাক্ট করতে পারেন, এবং ব্যবহার না করার সময় সেগুলোকে সংকুচিত করে রাখতে পারেন।
যখন ডিভাইসটি লক করা থাকে, অথবা অলওয়েজ-অন-ডিসপ্লে সক্রিয় থাকে, তখন সাধারণ নোটিফিকেশনের মতোই বাবলগুলো প্রদর্শিত হয়।
ব্যবহারকারী নোটিফিকেশন বাবল চালু করতে পারেন। যেসব নোটিফিকেশনে বাবল সাপোর্ট আছে, সেগুলোর বাবল বাটনে ট্যাপ করে তারা এটি করতে পারেন। এর ফলে সেই নির্দিষ্ট চ্যাটটি সবসময় বাবল হিসেবে প্রদর্শিত হবে। সেটিংসে, ব্যবহারকারীরা কোন কোন চ্যাট বাবল করেছেন তা ঠিক করতে পারেন অথবা পুরো অ্যাপের জন্য সেটিংস পরিবর্তন করতে পারেন।
ব্যবহারকারীরা নিম্নলিখিত কাজগুলো করতে পারেন:
- আপনার অ্যাপের সমস্ত নোটিফিকেশন বাবল ব্লক করুন। নোটিফিকেশনগুলো ব্লক করা হবে না, কিন্তু সেগুলো আর বাবল হিসেবে প্রদর্শিত হবে না।
- আপনার অ্যাপ থেকে নির্বাচিত নোটিফিকেশন বাবলগুলোর অনুমতি দিন। বাবল বাটন ব্যবহার করে পাঠানো নোটিফিকেশন বাবলগুলো 'নির্বাচিত' হিসেবে গণ্য হয়।
- আপনার অ্যাপ থেকে সমস্ত নোটিফিকেশন বাবল পাঠানোর অনুমতি দিন।
BubbleMetadataসহ পাঠানো সমস্ত নোটিফিকেশন বাবল হিসেবে প্রদর্শিত হবে।
নোটিফিকেশন বাবল এপিআই
নোটিফিকেশন এপিআই ব্যবহার করে নোটিফিকেশন বাবল তৈরি করা হয়। যদি আপনি আপনার নোটিফিকেশনটি বাবল হিসেবে দেখাতে চান, তবে এর সাথে অতিরিক্ত ডেটা সংযুক্ত করুন।
বাবলটির বর্ধিত রূপটি আপনার নির্বাচিত একটি অ্যাক্টিভিটি থেকে তৈরি করা হয়। অ্যাক্টিভিটিটিকে বাবল হিসেবে সঠিকভাবে প্রদর্শিত হওয়ার জন্য কনফিগার করুন। অ্যাক্টিভিটিটি অবশ্যই রিসাইজযোগ্য এবং এমবেডেড হতে হবে। যদি এই শর্তগুলোর কোনো একটির অভাব থাকে, তবে সিস্টেম এটিকে পরিবর্তে একটি নোটিফিকেশন হিসেবে প্রদর্শন করে।
নিম্নলিখিত কোডটি দেখায় কিভাবে একটি বাবল বাস্তবায়ন করতে হয়:
<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" এ সেট করে দেয়।
নোটিফিকেশন বাবল পাঠাতে এই ধাপগুলো অনুসরণ করুন:
- আপনি সাধারণত যেভাবে করেন, সেভাবেই একটি নোটিফিকেশন তৈরি করুন ।
- একটি
BubbleMetadataঅবজেক্ট তৈরি করতেBubbleMetadata.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এর একটি কল থেকে এসেছে, এরcategoryহলোCATEGORY_CALLএবং এতে একজনPersonযুক্ত আছেন। - নোটিফিকেশন পাঠানোর সময় অ্যাপটি ফোরগ্রাউন্ডে থাকে।
যদি এই শর্তগুলোর কোনোটিই পূরণ না হয়, তাহলে বাবলের পরিবর্তে নোটিফিকেশনটি দেখানো হয়।
বুদবুদ থেকে কার্যক্রম শুরু করা
যখন একটি বাবল একটি নতুন অ্যাক্টিভিটি চালু করে, তখন নতুন অ্যাক্টিভিটিটি হয় একই টাস্কের মধ্যে এবং একই বাবলযুক্ত উইন্ডোতে চালু হবে, অথবা ফুলস্ক্রিনে একটি নতুন টাস্কে চালু হবে এবং যে বাবলটি এটিকে চালু করেছিল সেটি সংকুচিত হয়ে যাবে।
বাবলের সাথে একই টাস্কে একটি নতুন অ্যাক্টিভিটি চালু করতে: ১. ইন্টেন্ট চালু করার সময় অ্যাক্টিভিটি কনটেক্সট ব্যবহার করুন, activity.startActivity(intent) , এবং ২. ইন্টেন্টে FLAG_ACTIVITY_NEW_TASK ফ্ল্যাগটি সেট করবেন না।
অন্যথায়, নতুন কাজটি একটি নতুন টাস্কে শুরু হয় এবং বাবলটি সংকুচিত হয়ে যায়।
মনে রাখবেন যে একটি বাবল একটি নির্দিষ্ট কথোপকথনের প্রতিনিধিত্ব করে, তাই বাবলের মধ্যে চালু করা কার্যকলাপগুলো সেই কথোপকথনের সাথে সম্পর্কিত হওয়া উচিত। এছাড়াও, বাবলের মধ্যে কোনো কার্যকলাপ চালু করলে বাবলটির টাস্ক স্ট্যাক বেড়ে যায় এবং এটি ব্যবহারকারীর অভিজ্ঞতাকে, বিশেষ করে নেভিগেশনের ক্ষেত্রে, জটিল করে তুলতে পারে।
সর্বোত্তম অনুশীলন
- শুধুমাত্র গুরুত্বপূর্ণ হলেই নোটিফিকেশন বাবল হিসেবে পাঠান, যেমন—যখন এটি কোনো চলমান যোগাযোগের অংশ হয় অথবা ব্যবহারকারী কোনো কন্টেন্টের জন্য স্পষ্টভাবে বাবলের অনুরোধ করেন। বাবল স্ক্রিনের জায়গা দখল করে এবং অ্যাপের অন্যান্য কন্টেন্ট ঢেকে দেয়।
- নিশ্চিত করুন যে আপনার বাবল নোটিফিকেশনটি একটি সাধারণ নোটিফিকেশন হিসেবেও কাজ করে। যখন ব্যবহারকারী বাবলটি নিষ্ক্রিয় করে, তখন বাবল নোটিফিকেশনটি একটি সাধারণ নোটিফিকেশন হিসেবে প্রদর্শিত হয়।
- বাবল অ্যাক্টিভিটিতে
onBackPressedওভাররাইড করার সময়super.onBackPressedকল করুন। অন্যথায়, আপনার বাবলটি সঠিকভাবে কাজ নাও করতে পারে।
যখন একটি সংকুচিত বাবলে কোনো আপডেট করা বার্তা আসে, তখন বাবলটিতে একটি ব্যাজ আইকন দেখা যায় যা একটি অপঠিত বার্তা নির্দেশ করে। ব্যবহারকারী যখন সংশ্লিষ্ট অ্যাপে বার্তাটি খোলেন, তখন এই ধাপগুলো অনুসরণ করুন:
- নোটিফিকেশনটি দমন করতে
BubbleMetadataআপডেট করুন ।BubbleMetadata.Builder.setSuppressNotification()কল করুন। এটি ব্যবহারকারী যে মেসেজটির সাথে ইন্টারঅ্যাক্ট করেছেন, তা বোঝানোর জন্য থাকা ব্যাজ আইকনটি সরিয়ে দেয়। -
BubbleMetadataআপডেটের সাথে আসা শব্দ বা কম্পন বন্ধ করতেNotification.Builder.setOnlyAlertOnce()কেtrueতে সেট করুন।
নমুনা অ্যাপ
সোসিয়ালাইট স্যাম্পল অ্যাপটি একটি কথোপকথন অ্যাপ যা বাবল ব্যবহার করে। প্রদর্শনের উদ্দেশ্যে, এই অ্যাপটি চ্যাটবট ব্যবহার করে। বাস্তব ক্ষেত্রে, মানুষের বার্তার জন্য বাবল ব্যবহার করুন।