আপনার অ্যাপ ব্যবহার না করার সময়, বিজ্ঞপ্তি আপনাকে অ্যাপের ইভেন্ট সম্পর্কে সংক্ষিপ্ত, সময়োপযোগী তথ্য প্রদান করে। এই ডকুমেন্ট থেকে আপনি জানতে পারবেন যে কীভাবে বিভিন্ন ফিচার সহ বিজ্ঞপ্তি তৈরি করতে হয়। Android-এ কীভাবে বিজ্ঞপ্তি দেখানো হয় সেই সম্পর্কে জানতে, বিজ্ঞপ্তির ওভারভিউ দেখুন। বিজ্ঞপ্তি ব্যবহার করে এমন স্যাম্পেল কোডের জন্য, GitHub-এ SociaLite স্যাম্পেল দেখুন।
এই পৃষ্ঠার কোড AndroidX লাইব্রেরি থেকে NotificationCompat API ব্যবহার করে। এইসব API আপনাকে Android-এর নতুন ভার্সনে উপলভ্য ফিচার যোগ করতে দেয়,
তবে Android 9 (API লেভেল ২৮) পর্যন্ত পুরনো ভার্সনের সাথে মানানসই থাকে।
তবে, ইনলাইন উত্তর অ্যাকশনের মতো কিছু ফিচার, আগের ভার্সনে
কাজ করে না।
একটি সাধারণ বিজ্ঞপ্তি তৈরি করা
সবচেয়ে প্রাথমিক ও কমপ্যাক্ট ফর্মের বিজ্ঞপ্তি—যা কোলাপ্সড ফর্ম নামেও পরিচিত—একটি আইকন, শীর্ষক ও অল্প টেক্সট কন্টেন্ট দেখায়। এই বিভাগটি দেখায় যে কীভাবে একটি বিজ্ঞপ্তি তৈরি করতে হয় যা ব্যবহারকারী আপনার অ্যাপে একটি অ্যাক্টিভিটি চালু করতে ট্যাপ করতে পারেন।
ছবি ১. একটি আইকন, একটি শীর্ষক এবং কিছু টেক্সট সহ একটি বিজ্ঞপ্তি।
বিজ্ঞপ্তির প্রতিটি অংশ সম্পর্কে আরও জানতে, বিজ্ঞপ্তির অ্যানাটমি সম্পর্কে পড়ুন।
রানটাইম অনুমতি ঘোষণা করুন
Android 13 (API লেভেল 33) এবং এর পরবর্তী যেকোনও ভার্সনে, কোনও অ্যাপ থেকে ছাড়প্রাপ্ত নয় (ফোরগ্রাউন্ড সার্ভিস (FGS) সহ) এমন বিজ্ঞপ্তি পোস্ট করার জন্য রানটাইম অনুমতি প্রয়োজন।
আপনার অ্যাপের ম্যানিফেস্ট ফাইলে যে অনুমতি ঘোষণা করতে হবে তা নিম্নলিখিত কোড স্নিপেটে দেখা যাবে:
<manifest ...> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <application ...> ... </application> </manifest>
রানটাইম অনুমতি সম্পর্কে আরও জানতে, বিজ্ঞপ্তি রানটাইম অনুমতি দেখুন।
বিজ্ঞপ্তি সংক্রান্ত কন্টেন্ট সেট করুন
শুরু করতে, NotificationCompat.Builder অবজেক্ট ব্যবহার করে বিজ্ঞপ্তির কন্টেন্ট ও চ্যানেল সেট করুন। নিম্নলিখিত উদাহরণ থেকে জানতে পারবেন যে কীভাবে
নিম্নলিখিত তথ্য সহ বিজ্ঞপ্তি তৈরি করতে হয়:
একটি ছোট আইকন,
setSmallIcon()দ্বারা সেট করা হয়েছে। এটিই একমাত্র ব্যবহারকারীর-দৃশ্যমান কন্টেন্ট যা প্রয়োজন।একটি শিরোনাম,
setContentTitle()দ্বারা সেট করা হয়েছে।setContentText()-এর সেট করা বডি টেক্সট।বিজ্ঞপ্তির অগ্রাধিকার,
setPriority()সেট করেছেন। Android 7.1 এবং তার আগের ভার্সনে, বিজ্ঞপ্তি কতটা অনুপ্রবেশকারী তা অগ্রাধিকার নির্ধারণ করে। Android 8.0 ও তার পরের সব ভার্সনের জন্য, পরিবর্তে পরবর্তী বিভাগে দেখানো পদ্ধতি অনুযায়ী চ্যানেলের গুরুত্ব সেট করুন।
val textTitle = "Title" val textContent = "Content" val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle(textTitle) .setContentText(textContent) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
NotificationCompat.Builder কনস্ট্রাক্টরের জন্য আপনাকে চ্যানেল আইডি
প্রদান করতে হবে। Android 8.0 (API লেভেল ২৬) এবং তার পরবর্তী ভার্সনের সাথে মানানসই হওয়ার জন্য এটি প্রয়োজন, তবে আগের ভার্সনগুলি এটি উপেক্ষা করে।
ডিফল্ট হিসেবে, বিজ্ঞপ্তির টেক্সট কন্টেন্ট এক লাইনে দেখানোর জন্য ছোট করা হয়। আপনি একটি এক্সপ্যান্ডেবল বিজ্ঞপ্তি তৈরি করে অতিরিক্ত তথ্য দেখাতে পারেন।
ছবি ২. বড় করা যায় এমন বিজ্ঞপ্তি আড়াল করা ও বড় করা অবস্থায়।
আপনি যদি চান যে আপনার বিজ্ঞপ্তিটি আরও দীর্ঘ হোক, তাহলে আপনি setStyle() সহ একটি স্টাইল টেমপ্লেট যোগ করে একটি এক্সপ্যান্ডেবল বিজ্ঞপ্তি চালু করতে পারেন। যেমন,
নিম্নলিখিত কোডটি একটি বড় টেক্সট এরিয়া তৈরি করে:
val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle("My notification") .setContentText("Much longer text that cannot fit one line...") .setStyle(NotificationCompat.BigTextStyle() .bigText("Much longer text that cannot fit one line...")) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
ছবি ও মিডিয়া প্লেব্যাক কন্ট্রোল কীভাবে যোগ করতে হয় তা সহ অন্যান্য বড় বিজ্ঞপ্তি স্টাইল সম্পর্কে আরও তথ্য পেতে, বড় করা যায় এমন বিজ্ঞপ্তি তৈরি করুন দেখুন।
চ্যানেল তৈরি করে গুরুত্ব সেট করুন
Android 8.0 ও তার পরবর্তী ভার্সনে বিজ্ঞপ্তি ডেলিভার করার আগে, NotificationChannel-এর ইনস্ট্যান্স createNotificationChannel()-এ পাস করে, সিস্টেমের সাথে আপনার অ্যাপের বিজ্ঞপ্তি চ্যানেল রেজিস্টার করুন। SDK_INT ভার্সনে
নিম্নলিখিত কোডটি একটি শর্তের কারণে ব্লক করা হয়েছে:
fun createNotificationChannel(context: Context) { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is not in the Support Library. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val name = context.getString(R.string.channel_name) val descriptionText = context.getString(R.string.channel_description) val importance = NotificationManager.IMPORTANCE_DEFAULT val channel = NotificationChannel(CHANNEL_ID, name, importance).apply { description = descriptionText } // Register the channel with the system. val notificationManager: NotificationManager = context.getSystemService(NotificationManager::class.java) as NotificationManager notificationManager.createNotificationChannel(channel) } }
Android 8.0 এবং তার পরবর্তী যেকোনও ভার্সনে বিজ্ঞপ্তি পোস্ট করার আগে আপনাকে অবশ্যই বিজ্ঞপ্তি চ্যানেল তৈরি করতে হবে, তাই আপনার অ্যাপ চালু হলে এই কোডটি এক্সিকিউট করুন। বারবার কল করা নিরাপদ কারণ আগে থেকে থাকা চ্যানেল তৈরি করলে কিছুই হয় না।
NotificationChannel কনস্ট্রাক্টরের জন্য NotificationManager কনস্ট্যান্ট ব্যবহার করে গুরুত্বের লেভেল প্রয়োজন। এটি নির্ধারণ করে যে কীভাবে ব্যবহারকারীকে
বাধা দেওয়া হবে। Android 7.1 এবং তার আগের ভার্সনে কাজ করার জন্য, পূর্ববর্তী উদাহরণে দেখানো
setPriority()-এর সাথে প্রায়োরিটিও সেট করুন।
আপনাকে গুরুত্ব বা অগ্রাধিকার সেট করতে হবে, তবে সিস্টেম সতর্কতার আচরণ সম্পর্কে কোনও গ্যারান্টি দেয় না। সিস্টেম অন্যান্য বিষয়ের উপর ভিত্তি করে এটি অ্যাডজাস্ট করতে পারে এবং ব্যবহারকারী সবসময় চ্যানেলের গুরুত্বের লেভেল কাস্টমাইজ করতে পারবেন।
বিভিন্ন লেভেলের অর্থ কী, সেই সম্পর্কে আরও তথ্য পেতে, বিজ্ঞপ্তির গুরুত্বের লেভেল সম্পর্কে পড়ুন।
বিজ্ঞপ্তির ট্যাপ অ্যাকশন সেট করুন
প্রতিটি বিজ্ঞপ্তিতে ট্যাপ করলে কোনও না কোনও অ্যাকশন হতে হবে, সাধারণত আপনার অ্যাপে কোনও অ্যাক্টিভিটি খুলতে হবে যা বিজ্ঞপ্তির সাথে সম্পর্কিত। এটি করতে, PendingIntent অবজেক্টের মাধ্যমে
সংজ্ঞায়িত কন্টেন্ট ইনটেন্ট নির্দিষ্ট করুন এবং
setContentIntent()-এ পাস করুন।
ব্যবহারকারী বিজ্ঞপ্তিতে ট্যাপ করলে কোনও অ্যাক্টিভিটি খোলার জন্য কীভাবে একটি প্রাথমিক ইনটেন্ট তৈরি করতে হয় তা নিম্নলিখিত স্নিপেট থেকে জানা যায়:
// Create an explicit intent for an Activity in your app. val intent = Intent(context, AlertDetails::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntent: PendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) // Set the intent that fires when the user taps the notification. .setContentIntent(pendingIntent) .setAutoCancel(true)
এই কোড setAutoCancel() কল করে, যা ব্যবহারকারী ট্যাপ করলে অটোমেটিক বিজ্ঞপ্তি
সরিয়ে দেয়।
আগের উদাহরণে ইনটেন্ট ফ্ল্যাগ ব্যবহারকারীর প্রত্যাশিত নেভিগেশন অভিজ্ঞতা বজায় রাখে যখন ব্যবহারকারী বিজ্ঞপ্তি ব্যবহার করে আপনার অ্যাপ খোলেন। আপনি যে ধরনের অ্যাক্টিভিটি শুরু করছেন তার উপর নির্ভর করে এটি ব্যবহার করতে চাইতে পারেন, যা নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:
এমন একটি অ্যাক্টিভিটি যা শুধুমাত্র বিজ্ঞপ্তির উত্তর দেওয়ার জন্য রয়েছে। অ্যাপের স্বাভাবিক ব্যবহারের সময় ব্যবহারকারীর এই অ্যাক্টিভিটিতে নেভিগেট করার কোনও কারণ নেই, তাই অ্যাক্টিভিটি আপনার অ্যাপের বিদ্যমান টাস্ক এবং ব্যাক স্ট্যাক-এ যোগ করার পরিবর্তে একটি নতুন টাস্ক শুরু করে। এটি হল পূর্ববর্তী স্যাম্পেলে তৈরি করা ইনটেন্টের ধরন।
আপনার অ্যাপের নিয়মিত অ্যাপ ফ্লোতে থাকা অ্যাক্টিভিটি। এই ক্ষেত্রে, অ্যাক্টিভিটি শুরু করলে একটি ব্যাক স্ট্যাক তৈরি হয় যাতে ফিরে যান এবং উপরে যান বোতাম ব্যবহার করার সময় ব্যবহারকারীর প্রত্যাশা পূরণ হয়।
বিজ্ঞপ্তি দেখান
বিজ্ঞপ্তি দেখাতে, NotificationManagerCompat.notify() কল করুন, বিজ্ঞপ্তির জন্য একটি অনন্য আইডি এবং NotificationCompat.Builder.build()-এর ফলাফল পাস করুন। এটি
নিচের উদাহরণে দেখানো হয়েছে:
with(NotificationManagerCompat.from(context)) { if (ActivityCompat.checkSelfPermission( context, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling ActivityCompat#requestPermissions here // to request the missing permissions, and then overriding // public fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, // grantResults: IntArray) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return@with } // notificationId is a unique int for each notification that you must define. notify(notificationId, builder.build())
আপনি NotificationManagerCompat.notify()-এ যে বিজ্ঞপ্তি আইডি পাস করেন সেটি সেভ করুন,
কারণ আপডেট বা
বিজ্ঞপ্তি সরিয়ে দিতে চাইলে এটি প্রয়োজন হবে।
এছাড়াও, Android 13 ও তার পরবর্তী ভার্সনে চলা ডিভাইসে বেসিক বিজ্ঞপ্তি পরীক্ষা করতে, ম্যানুয়ালি বিজ্ঞপ্তি চালু করুন অথবা বিজ্ঞপ্তির অনুরোধ করার জন্য একটি ডায়ালগ তৈরি করুন।
অ্যাকশন বোতাম যোগ করুন
একটি বিজ্ঞপ্তিতে সর্বাধিক তিনটি অ্যাকশন বোতাম থাকতে পারে যা ব্যবহারকারীকে দ্রুত উত্তর দিতে দেয়, যেমন কোনও রিমাইন্ডার স্নুজ করা বা কোনও টেক্সট মেসেজের উত্তর দেওয়া। তবে, ব্যবহারকারী বিজ্ঞপ্তিতে ট্যাপ করলে যে অ্যাকশন পারফর্ম করা হয়, এই অ্যাকশন বোতামগুলি যেন তার ডুপ্লিকেট না হয়।
ছবি ৩. একটি অ্যাকশন বোতাম সহ বিজ্ঞপ্তি।
অ্যাকশন বোতাম যোগ করতে, addAction()
পদ্ধতিতে PendingIntent পাস করুন। এটি বিজ্ঞপ্তির ডিফল্ট ট্যাপ অ্যাকশন সেট-আপ করার মতোই, তবে
অ্যাক্টিভিটি লঞ্চ করার পরিবর্তে, আপনি অন্যান্য কাজ করতে পারেন যেমন,
BroadcastReceiver শুরু করা যা ব্যাকগ্রাউন্ডে কোনও কাজ করে যাতে
অ্যাকশনটি আগে থেকেই খোলা অ্যাপে বাধা সৃষ্টি না করে।
যেমন, নিম্নলিখিত কোড থেকে বোঝা যায় যে কীভাবে নির্দিষ্ট প্রাপকের কাছে ব্রডকাস্ট পাঠাতে হয়:
val ACTION_SNOOZE = "snooze" val snoozeIntent = Intent(context, MyBroadcastReceiver::class.java).apply { action = ACTION_SNOOZE putExtra(EXTRA_NOTIFICATION_ID, 0) } val snoozePendingIntent: PendingIntent = PendingIntent.getBroadcast(context, 0, snoozeIntent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .addAction(R.drawable.snooze, context.getString(R.string.snooze), snoozePendingIntent)
ব্যাকগ্রাউন্ডে কাজ চালানোর জন্য BroadcastReceiver তৈরি করা সম্পর্কে আরও তথ্যের জন্য, ব্রডকাস্ট ওভারভিউ দেখুন।
আপনি যদি মিডিয়া প্লেব্যাক বোতাম সহ বিজ্ঞপ্তি তৈরি করতে চান, যেমন ট্র্যাক পজ ও স্কিপ করা, তাহলে কীভাবে মিডিয়া কন্ট্রোল সহ বিজ্ঞপ্তি তৈরি করবেন তা দেখুন।
সরাসরি উত্তর দেওয়ার অ্যাকশন যোগ করুন
Android 7.0 (API লেভেল ২৪)-এ চালু করা সরাসরি উত্তর দেওয়ার অ্যাকশন, ব্যবহারকারীদের সরাসরি বিজ্ঞপ্তিতে টেক্সট লিখতে দেয়। তারপর, কোনও অ্যাক্টিভিটি না খুলেই টেক্সটটি আপনার অ্যাপে ডেলিভার করা হয়। যেমন, আপনি সরাসরি উত্তর দেওয়ার অ্যাকশন ব্যবহার করতে পারেন যাতে ব্যবহারকারীরা টেক্সট মেসেজের উত্তর দিতে পারেন বা বিজ্ঞপ্তি থেকে টাস্ক লিস্ট আপডেট করতে পারেন।
ছবি ৪. "উত্তর দিন" বোতামে ট্যাপ করলে টেক্সট ইনপুট খুলে যায়।
সরাসরি উত্তর দেওয়ার অ্যাকশনটি বিজ্ঞপ্তিতে একটি অতিরিক্ত বোতাম হিসেবে দেখা যায় যা টেক্সট ইনপুট খোলে। ব্যবহারকারী টাইপ করা শেষ করলে, সিস্টেম টেক্সট উত্তরটি বিজ্ঞপ্তি অ্যাকশনের জন্য আপনার নির্দিষ্ট করা ইনটেন্টের সাথে অ্যাটাচ করে এবং ইনটেন্টটি আপনার অ্যাপে পাঠায়।
উত্তর দেওয়ার বোতাম যোগ করুন
সরাসরি উত্তর দেওয়ার সুবিধা আছে এমন বিজ্ঞপ্তি অ্যাকশন তৈরি করতে, এইসব ধাপ অনুসরণ করুন:
RemoteInput.Builder-এর একটি ইনস্ট্যান্স তৈরি করুন যা আপনি নিজের বিজ্ঞপ্তি অ্যাকশনে যোগ করতে পারবেন। এই ক্লাসের কনস্ট্রাক্টর একটি স্ট্রিং গ্রহণ করে যা সিস্টেম টেক্সট ইনপুটের জন্য 'কী' হিসেবে ব্যবহার করে। আপনার অ্যাপ পরে ইনপুটের টেক্সট ফিরিয়ে আনতে সেই 'কী' ব্যবহার করে।
// Key for the string that's delivered in the action's intent. val replyLabel: String = context.resources.getString(R.string.reply_label) val remoteInput: RemoteInput = RemoteInput.Builder(KEY_TEXT_REPLY).run { setLabel(replyLabel) build() }
উত্তর দেওয়ার অ্যাকশনের জন্য একটি PendingIntent তৈরি করুন।
// Build a PendingIntent for the reply action to trigger. val replyPendingIntent: PendingIntent = PendingIntent.getBroadcast(context, conversationId, getMessageReplyIntent(conversationId), PendingIntent.FLAG_MUTABLE)
addRemoteInput() ব্যবহার করে
RemoteInput অবজেক্টকে কোনও অ্যাকশনের সাথে অ্যাটাচ করুন।
// Create the reply action and add the remote input. val action: NotificationCompat.Action = NotificationCompat.Action.Builder(R.drawable.reply, context.getString(R.string.reply_label), replyPendingIntent) .addRemoteInput(remoteInput) .build()
বিজ্ঞপ্তিতে অ্যাকশন প্রয়োগ করুন এবং বিজ্ঞপ্তি ইস্যু করুন।
// Build the notification and add the action.
val newMessageNotification = NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_message)
.setContentTitle(context.getString(R.string.title))
.setContentText(context.getString(R.string.content))
.addAction(action)
.build()
// Issue the notification.
NotificationManagerCompat.from(context).notify(notificationId, newMessageNotification)
ছবি ৪-এ যেমন দেখানো হয়েছে, ব্যবহারকারী বিজ্ঞপ্তি অ্যাকশন ট্রিগার করলে, সিস্টেম তাকে উত্তর ইনপুট করার জন্য প্রম্পট করে।
উত্তর থেকে ব্যবহারকারীর ইনপুট ফিরিয়ে আনুন
বিজ্ঞপ্তির উত্তর UI থেকে ব্যবহারকারীর ইনপুট পেতে, RemoteInput.getResultsFromIntent() কল করুন, আপনার BroadcastReceiver-এর মাধ্যমে পাওয়া Intent
এতে পাস করুন:
private fun getMessageText(intent: Intent): CharSequence? { return RemoteInput.getResultsFromIntent(intent)?.getCharSequence(KEY_TEXT_REPLY) }
আপনি টেক্সট প্রসেস করার পরে, একই আইডি এবং ট্যাগ (যদি ব্যবহার করা হয়) সহ
NotificationManagerCompat.notify() কল করে বিজ্ঞপ্তি আপডেট করুন। সরাসরি উত্তর দেওয়ার UI লুকানো এবং ব্যবহারকারীকে তার উত্তর
সঠিকভাবে পাওয়া ও প্রসেস করা হয়েছে বলে কনফার্ম করার জন্য এটি
প্রয়োজন।
// Build a new notification, which informs the user that the system // handled their interaction with the previous notification. val repliedNotification = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.message) .setContentText(context.getString(R.string.replied)) .build() // Issue the new notification. NotificationManagerCompat.from(context).notify(notificationId, repliedNotification)
অন্যান্য ডেটা ফিরিয়ে আনা
অন্যান্য ধরনের ডেটা ম্যানেজ করার পদ্ধতি RemoteInput-এর মতোই। নিম্নলিখিত
উদাহরণে ইনপুট হিসেবে ছবি ব্যবহার করা হয়েছে।
val replyLabel: String = context.resources.getString(R.string.reply_label) val remoteInput: RemoteInput = RemoteInput.Builder(KEY_REPLY).run { setLabel(replyLabel) // Allow for image data types in the input. // This method can be used again to allow for other data types. setAllowDataType("image/*", true) build() }
RemoteInput#getDataResultsFromIntent কল করুন এবং সংশ্লিষ্ট ডেটা এক্সট্র্যাক্ট করুন।
class ReplyReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val dataResults = RemoteInput.getDataResultsFromIntent(intent, KEY_REPLY) val imageUri: Uri? = dataResults?.get("image/*") as? Uri if (imageUri != null) { // Extract the image context.contentResolver.openInputStream(imageUri)?.use { inputStream -> val bitmap = BitmapFactory.decodeStream(inputStream) // Display the image // ... } } } companion object { const val KEY_REPLY = "key_reply" const val KEY_TEXT_REPLY = "key_text_reply" } }
এই নতুন বিজ্ঞপ্তির সাথে কাজ করার সময়, রিসিভারের onReceive() পদ্ধতিতে পাস করা প্রসঙ্গ ব্যবহার করুন।
setRemoteInputHistory() কল করে বিজ্ঞপ্তির নিচে উত্তর যোগ করুন। তবে, আপনি কোনও মেসেজিং অ্যাপ তৈরি করলে,
মেসেজিং-স্টাইল বিজ্ঞপ্তি তৈরি করুন এবং কথোপকথনে নতুন মেসেজ
যোগ করুন।
মেসেজিং অ্যাপ থেকে বিজ্ঞপ্তি পাওয়ার ব্যাপারে আরও পরামর্শের জন্য, মেসেজিং অ্যাপের জন্য পেশাদার পদ্ধতি সংক্রান্ত বিভাগটি দেখুন।
একটি জরুরি মেসেজ দেখান
আপনার অ্যাপকে হয়ত কোনও জরুরি, সময়-সংবেদনশীল মেসেজ দেখাতে হতে পারে, যেমন ইনকামিং ফোন কল বা অ্যালার্মের রিং। এইসব পরিস্থিতিতে, আপনার বিজ্ঞপ্তির সাথে ফুল-স্ক্রিন ইনটেন্ট অ্যাসোসিয়েট করতে পারবেন।
বিজ্ঞপ্তিটি চালু হলে, ব্যবহারকারীরা ডিভাইসের লক স্ট্যাটাসের উপর নির্ভর করে নিম্নলিখিতগুলির মধ্যে একটি দেখতে পাবেন:
- ব্যবহারকারীর ডিভাইস লক করা থাকলে, ফুল-স্ক্রিন অ্যাক্টিভিটি দেখা যায়, যা লকস্ক্রিনকে কভার করে।
- ব্যবহারকারীর ডিভাইস আনলক করা থাকলে, বিজ্ঞপ্তিটি বড় আকারে দেখানো হয় যেখানে বিজ্ঞপ্তি ম্যানেজ বা বাতিল করার বিকল্প থাকে।
নিচের কোড স্নিপেট থেকে জানতে পারবেন যে কীভাবে আপনার বিজ্ঞপ্তি ফুল-স্ক্রিন ইনটেন্টের সাথে যুক্ত করবেন:
val fullScreenIntent = Intent(context, ImportantActivity::class.java) val fullScreenPendingIntent = PendingIntent.getActivity(context, 0, fullScreenIntent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setFullScreenIntent(fullScreenPendingIntent, true)
লক স্ক্রিনের দৃশ্যমানতা সেট করুন
লক স্ক্রিন থেকে বিজ্ঞপ্তিতে কতটা বিবরণ দেখা যাবে তা কন্ট্রোল করতে,
setVisibility() কল করুন এবং নিম্নলিখিত ভ্যালুগুলির মধ্যে একটি নির্দিষ্ট করুন:
VISIBILITY_PUBLIC: লক স্ক্রিনে বিজ্ঞপ্তির সম্পূর্ণ কন্টেন্ট দেখা যায়।VISIBILITY_SECRET: লক স্ক্রিনে বিজ্ঞপ্তির কোনও অংশই দেখানো হয় না।VISIBILITY_PRIVATE: লক স্ক্রিনে শুধুমাত্র প্রাথমিক তথ্য, যেমন বিজ্ঞপ্তির আইকন এবং কন্টেন্টের শীর্ষক দেখানো হয়। বিজ্ঞপ্তির সম্পূর্ণ কন্টেন্ট দেখা যায় না।
আপনি VISIBILITY_PRIVATE সেট করলে, বিজ্ঞপ্তির কন্টেন্টের বিকল্প ভার্সনও দিতে পারবেন
যা নির্দিষ্ট কিছু বিবরণ লুকিয়ে রাখে। যেমন, কোনও এসএমএস অ্যাপ "আপনার কাছে ৩টি নতুন টেক্সট মেসেজ আছে" বলে বিজ্ঞপ্তি দেখাতে পারে, কিন্তু
মেসেজের কন্টেন্ট ও প্রেরকের নাম লুকানো থাকে। এই বিকল্প বিজ্ঞপ্তি প্রদান করতে, প্রথমে NotificationCompat.Builder-এর মাধ্যমে
স্বাভাবিকভাবে বিকল্প বিজ্ঞপ্তি তৈরি করুন। তারপর, setPublicVersion() ব্যবহার করে সাধারণ বিজ্ঞপ্তির সাথে
বিকল্প বিজ্ঞপ্তিটি অ্যাটাচ করুন।
মনে রাখবেন, লক স্ক্রিনে বিজ্ঞপ্তি দেখানো হবে কিনা তা ব্যবহারকারী সবসময় নিয়ন্ত্রণ করতে পারেন এবং আপনার অ্যাপের বিজ্ঞপ্তি চ্যানেলের উপর ভিত্তি করে সেগুলি নিয়ন্ত্রণ করতে পারেন।
বিজ্ঞপ্তি আপডেট করা
আপনি বিজ্ঞপ্তি ইস্যু করার পরে সেটি আপডেট করতে,
NotificationManagerCompat.notify()-এ আবার কল করুন এবং আগে ব্যবহার করা একই আইডি পাস করুন। আগের বিজ্ঞপ্তি বাতিল করা হলে, তার পরিবর্তে নতুন বিজ্ঞপ্তি তৈরি করা
হয়।
আপনি চাইলে setOnlyAlertOnce() কল করতে পারেন যাতে আপনার বিজ্ঞপ্তি
ব্যবহারকারীকে বাধা দেয়—সাউন্ড, ভাইব্রেশন বা ভিজ্যুয়াল ক্লুয়ের মাধ্যমে—শুধুমাত্র
প্রথমবার বিজ্ঞপ্তি দেখা গেলে এবং পরবর্তী আপডেটের জন্য নয়।
বিজ্ঞপ্তি সরিয়ে দেওয়া
নিম্নলিখিত কোনও একটি ঘটনা না ঘটা পর্যন্ত বিজ্ঞপ্তি দেখা যায়:
- ব্যবহারকারী বিজ্ঞপ্তি বাতিল করে দেন।
- আপনি বিজ্ঞপ্তি তৈরি করার সময়
setAutoCancel()কল করলে, ব্যবহারকারী বিজ্ঞপ্তিতে ট্যাপ করেন। - নির্দিষ্ট বিজ্ঞপ্তি আইডির জন্য আপনি
cancel()কল করেন। এই পদ্ধতিটি চলমান বিজ্ঞপ্তিগুলিও মুছে দেয়। - আপনি
cancelAll()কল করেন, যা আপনার আগে ইস্যু করা সব বিজ্ঞপ্তি সরিয়ে দেয়। - আপনি
setTimeoutAfter()ব্যবহার করে বিজ্ঞপ্তি তৈরি করার সময় টাইমআউট সেট করলে, নির্দিষ্ট সময়সীমা শেষ হয়ে যায়। প্রয়োজন হলে, নির্দিষ্ট টাইমআউট সময়সীমা শেষ হওয়ার আগে আপনি বিজ্ঞপ্তি বাতিল করতে পারবেন।
মেসেজিং অ্যাপের জন্য পেশাদার পদ্ধতি
আপনার মেসেজিং ও চ্যাট অ্যাপের জন্য বিজ্ঞপ্তি তৈরি করার সময় এখানে তালিকাভুক্ত পেশাদার পদ্ধতিগুলি বিবেচনা করুন।
MessagingStyle ব্যবহার করুন
Android 7.0 (API লেভেল ২৪) থেকে শুরু করে, Android বিশেষভাবে মেসেজিং কন্টেন্টের জন্য
একটি বিজ্ঞপ্তি স্টাইল টেমপ্লেট প্রদান করে। NotificationCompat.MessagingStyle ক্লাস ব্যবহার করে, আপনি বিজ্ঞপ্তিতে দেখানো
বেশ কয়েকটি লেবেল পরিবর্তন করতে পারবেন, যার মধ্যে রয়েছে কথোপকথনের শীর্ষক,
অতিরিক্ত মেসেজ এবং বিজ্ঞপ্তির জন্য কন্টেন্ট ভিউ।
MessagingStyle ক্লাস ব্যবহার করে কীভাবে বিজ্ঞপ্তির স্টাইল কাস্টমাইজ করতে হয় তা নিম্নলিখিত কোড স্নিপেট থেকে
জানতে পারবেন।
val message1 = NotificationCompat.MessagingStyle.Message( messages[0].text, messages[0].time, messages[0].sender ) val message2 = NotificationCompat.MessagingStyle.Message( messages[1].text, messages[1].time, messages[1].sender ) notification = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setStyle( NotificationCompat.MessagingStyle(Person.Builder().setName("Me").build()) .addMessage(message1) .addMessage(message2) ) .build()
Android 9.0 (API লেভেল ২৮) থেকে শুরু করে, বিজ্ঞপ্তি ও তার অবতারের
অপ্টিমাল রেন্ডারিং পেতে
Person ক্লাস ব্যবহার করাও প্রয়োজন।
NotificationCompat.MessagingStyle ব্যবহার করার সময়, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
- দুইয়ের বেশি ব্যক্তির সাথে গ্রুপ চ্যাটের জন্য
শীর্ষক সেট করতে
MessagingStyle.setConversationTitle()-কে কল করুন। কথোপকথনের একটি ভালো শিরোনাম হতে পারে গ্রুপ চ্যাটের নাম অথবা, যদি কোনও নাম না থাকে, তাহলে কথোপকথনে অংশগ্রহণকারীদের একটি তালিকা। এটি না থাকলে, মেসেজটি ভুল করে কথোপকথনে সবচেয়ে সাম্প্রতিক মেসেজ পাঠানো ব্যক্তির সাথে ওয়ান-টু-ওয়ান কথোপকথনের অংশ হিসেবে বিবেচিত হতে পারে। - ছবির মতো মিডিয়া মেসেজ অন্তর্ভুক্ত করতে
MessagingStyle.setData()পদ্ধতি ব্যবহার করুন। image/* প্যাটার্নের MIME টাইপ কাজ করে।
সরাসরি উত্তর দেওয়ার সুবিধা ব্যবহার করা
সরাসরি উত্তর দেওয়ার সুবিধা ব্যবহারকারীকে ইনলাইনে মেসেজের উত্তর দিতে দেয়।
- ব্যবহারকারী ইনলাইন উত্তর অ্যাকশনের মাধ্যমে উত্তর দেওয়ার পরে,
MessagingStyleবিজ্ঞপ্তি আপডেট করতেMessagingStyle.addMessage()ব্যবহার করুন এবং বিজ্ঞপ্তি প্রত্যাহার বা বাতিল করবেন না। বিজ্ঞপ্তি বাতিল না করলে, ব্যবহারকারী বিজ্ঞপ্তি থেকে একাধিক উত্তর পাঠাতে পারবেন। - ইনলাইন উত্তর অ্যাকশনকে Wear OS-এর সাথে মানানসই করতে,
Action.WearableExtender.setHintDisplayInlineAction(true)কল করুন। - বিজ্ঞপ্তিতে পুরনো মেসেজ যোগ করে সরাসরি উত্তর দেওয়া কথোপকথনে প্রসঙ্গ প্রদান করতে
addHistoricMessage()পদ্ধতি ব্যবহার করুন।
স্মার্ট রিপ্লাই চালু করুন
- স্মার্ট রিপ্লাই চালু করতে, উত্তর অ্যাকশনে
setAllowGeneratedResponses(true)কল করুন। এর ফলে, Wear OS ডিভাইসে বিজ্ঞপ্তি ব্রিজিং করা হলে, ব্যবহারকারীরা স্মার্ট রিপ্লাইয়ের উত্তর দেখতে পান। স্মার্ট রিপ্লাইয়ের উত্তরNotificationCompat.MessagingStyleবিজ্ঞপ্তির মাধ্যমে প্রদান করা প্রসঙ্গ ব্যবহার করে সম্পূর্ণভাবে অন-ওয়াচ মেশিন লার্নিং মডেলের মাধ্যমে জেনারেট করা হয় এবং উত্তর জেনারেট করার জন্য ইন্টারনেটে কোনও ডেটা আপলোড করা হয় না।
বিজ্ঞপ্তির মেটাডেটা যোগ করুন
- ডিভাইস বিরক্ত করবে না মোডে থাকলে, আপনার অ্যাপের বিজ্ঞপ্তি কীভাবে ম্যানেজ করতে হবে তা সিস্টেমকে জানাতে বিজ্ঞপ্তি মেটাডেটা অ্যাসাইন করুন। যেমন,
'বিরক্ত করবে না' মোড ওভাররাইড করতে
addPerson()বাsetCategory(Notification.CATEGORY_MESSAGE)পদ্ধতি ব্যবহার করুন।