আপনার অ্যাপটি ব্যবহার না করার সময় বিজ্ঞপ্তিগুলি ইভেন্ট সম্পর্কে সংক্ষিপ্ত, সময়োপযোগী তথ্য প্রদান করে। এই ডকুমেন্টটি আপনাকে বিভিন্ন বৈশিষ্ট্য সহ একটি বিজ্ঞপ্তি তৈরি করার পদ্ধতি দেখায়। অ্যান্ড্রয়েডে বিজ্ঞপ্তিগুলি কীভাবে প্রদর্শিত হয় তার একটি ভূমিকার জন্য, বিজ্ঞপ্তিগুলির ওভারভিউ দেখুন। বিজ্ঞপ্তিগুলি ব্যবহার করে এমন নমুনা কোডের জন্য, GitHub-এ SociaLite নমুনা দেখুন।
এই পৃষ্ঠার কোডটি AndroidX লাইব্রেরির NotificationCompat API ব্যবহার করে। এই API গুলি আপনাকে শুধুমাত্র Android এর নতুন সংস্করণগুলিতে উপলব্ধ বৈশিষ্ট্যগুলি যোগ করতে দেয় এবং একই সাথে Android 9 (API স্তর 28) এর সাথে সামঞ্জস্যতা প্রদান করে। তবে, কিছু বৈশিষ্ট্য, যেমন ইনলাইন উত্তর অ্যাকশন, পূর্ববর্তী সংস্করণগুলিতে কোনও বিকল্পের ফলে কাজ বন্ধ করে দেয়।
একটি মৌলিক বিজ্ঞপ্তি তৈরি করুন
একটি বিজ্ঞপ্তি তার সবচেয়ে মৌলিক এবং সংক্ষিপ্ত আকারে—যাকে কোলাপজড ফর্মও বলা হয়—একটি আইকন, একটি শিরোনাম এবং অল্প পরিমাণে টেক্সট কন্টেন্ট প্রদর্শন করে। এই বিভাগটি দেখায় কিভাবে একটি বিজ্ঞপ্তি তৈরি করবেন যা ব্যবহারকারী আপনার অ্যাপে একটি কার্যকলাপ চালু করতে ট্যাপ করতে পারবেন।

চিত্র ১. একটি আইকন, একটি শিরোনাম এবং কিছু লেখা সহ একটি বিজ্ঞপ্তি।
বিজ্ঞপ্তির প্রতিটি অংশ সম্পর্কে আরও বিস্তারিত জানার জন্য, বিজ্ঞপ্তির অ্যানাটমি সম্পর্কে পড়ুন।
রানটাইম অনুমতি ঘোষণা করুন
অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) এবং তার উচ্চতর সংস্করণগুলি কোনও অ্যাপ থেকে অব্যাহতিপ্রাপ্ত (ফোরগ্রাউন্ড সার্ভিসেস (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 এবং তার পরবর্তী সংস্করণগুলির জন্য, পরবর্তী বিভাগে দেখানো চ্যানেলের গুরুত্ব সেট করুন।
কোটলিন
var builder = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle(textTitle)
.setContentText(textContent)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
জাভা
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle(textTitle)
.setContentText(textContent)
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
NotificationCompat.Builder কনস্ট্রাক্টরের জন্য আপনাকে একটি চ্যানেল আইডি প্রদান করতে হবে। এটি Android 8.0 (API লেভেল 26) এবং পরবর্তী সংস্করণগুলির সাথে সামঞ্জস্যের জন্য প্রয়োজন, কিন্তু পূর্ববর্তী সংস্করণগুলি এটি উপেক্ষা করে।
ডিফল্টরূপে, বিজ্ঞপ্তির টেক্সট কন্টেন্ট এক লাইনে ফিট করার জন্য ছোট করা হয়। আপনি একটি প্রসারণযোগ্য বিজ্ঞপ্তি তৈরি করে অতিরিক্ত তথ্য দেখাতে পারেন।

চিত্র ২। একটি সম্প্রসারণযোগ্য বিজ্ঞপ্তি, যা তার সংকুচিত এবং সম্প্রসারিত আকারে।
যদি আপনি আপনার বিজ্ঞপ্তিটি দীর্ঘতর করতে চান, setStyle() দিয়ে একটি স্টাইল টেমপ্লেট যোগ করে একটি প্রসারণযোগ্য বিজ্ঞপ্তি সক্ষম করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি একটি বৃহত্তর টেক্সট এরিয়া তৈরি করে:
কোটলিন
var builder = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Much longer text that cannot fit one line...")
<b>.setStyle(NotificationCompat.BigTextStyle()
.bigText("Much longer text that cannot fit one line..."))</b>
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
জাভা
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Much longer text that cannot fit one line...")
<b>.setStyle(new NotificationCompat.BigTextStyle()
.bigText("Much longer text that cannot fit one line..."))</b>
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
অন্যান্য বৃহৎ বিজ্ঞপ্তি শৈলী সম্পর্কে আরও তথ্যের জন্য, যেমন একটি ছবি এবং মিডিয়া প্লেব্যাক নিয়ন্ত্রণ কীভাবে যোগ করবেন, একটি সম্প্রসারণযোগ্য বিজ্ঞপ্তি তৈরি করুন দেখুন।
একটি চ্যানেল তৈরি করুন এবং গুরুত্ব নির্ধারণ করুন
অ্যান্ড্রয়েড ৮.০ এবং তার পরবর্তী সংস্করণে বিজ্ঞপ্তি সরবরাহ করার আগে, NotificationChannel এর একটি উদাহরণ createNotificationChannel() এ পাস করে সিস্টেমে আপনার অ্যাপের বিজ্ঞপ্তি চ্যানেল নিবন্ধন করুন। SDK_INT সংস্করণে একটি শর্ত দ্বারা নিম্নলিখিত কোডটি ব্লক করা হয়েছে:
কোটলিন
private fun createNotificationChannel() {
// 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 = getString(R.string.channel_name)
val descriptionText = 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 =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}
জাভা
private void createNotificationChannel() {
// 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) {
CharSequence name = getString(R.string.channel_name);
String description = getString(R.string.channel_description);
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this.
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
যেহেতু অ্যান্ড্রয়েড ৮.০ এবং তার পরবর্তী সংস্করণে কোনও বিজ্ঞপ্তি পোস্ট করার আগে আপনাকে অবশ্যই বিজ্ঞপ্তি চ্যানেল তৈরি করতে হবে, তাই আপনার অ্যাপটি শুরু হওয়ার সাথে সাথে এই কোডটি কার্যকর করুন। এটি বারবার কল করা নিরাপদ, কারণ বিদ্যমান বিজ্ঞপ্তি চ্যানেল তৈরি করা কোনও কাজ করে না।
NotificationChannel কনস্ট্রাক্টরের জন্য NotificationManager ক্লাসের যেকোনো একটি ধ্রুবক ব্যবহার করে একটি importance প্রয়োজন। এই প্যারামিটারটি নির্ধারণ করে যে এই চ্যানেলের সাথে সম্পর্কিত যেকোনো বিজ্ঞপ্তির জন্য ব্যবহারকারীকে কীভাবে বাধা দেওয়া হবে। পূর্ববর্তী উদাহরণে দেখানো হিসাবে, Android 7.1 এবং তার আগের সংস্করণগুলিকে সমর্থন করার জন্য setPriority() দিয়ে অগ্রাধিকার সেট করুন।
যদিও আপনাকে নিম্নলিখিত উদাহরণে দেখানো বিজ্ঞপ্তির গুরুত্ব বা অগ্রাধিকার নির্ধারণ করতে হবে, সিস্টেমটি আপনার প্রাপ্ত সতর্কতা আচরণের গ্যারান্টি দেয় না। কিছু ক্ষেত্রে, সিস্টেম অন্যান্য কারণের উপর ভিত্তি করে গুরুত্বের স্তর পরিবর্তন করতে পারে এবং ব্যবহারকারী সর্বদা একটি নির্দিষ্ট চ্যানেলের জন্য গুরুত্বের স্তরটি পুনরায় সংজ্ঞায়িত করতে পারে।
বিভিন্ন স্তরের অর্থ কী সে সম্পর্কে আরও তথ্যের জন্য, বিজ্ঞপ্তির গুরুত্বের স্তর সম্পর্কে পড়ুন।
বিজ্ঞপ্তির ট্যাপ অ্যাকশন সেট করুন
প্রতিটি বিজ্ঞপ্তিকে একটি ট্যাপে সাড়া দিতে হবে, সাধারণত আপনার অ্যাপে বিজ্ঞপ্তির সাথে সম্পর্কিত একটি কার্যকলাপ খুলতে। এটি করার জন্য, একটি PendingIntent অবজেক্টের সাথে সংজ্ঞায়িত একটি কন্টেন্ট ইন্টেন্ট নির্দিষ্ট করুন এবং এটি setContentIntent() এ পাস করুন।
নিম্নলিখিত স্নিপেটটি দেখায় যে ব্যবহারকারী যখন বিজ্ঞপ্তিটি ট্যাপ করেন তখন কোনও কার্যকলাপ খোলার জন্য কীভাবে একটি মৌলিক উদ্দেশ্য তৈরি করতে হয়:
কোটলিন
// Create an explicit intent for an Activity in your app.
<b>val intent = Intent(this, AlertDetails::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}</b>
val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE)
val builder = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
// Set the intent that fires when the user taps the notification.
<b>.setContentIntent(pendingIntent)</b>
.setAutoCancel(true)
জাভা
// Create an explicit intent for an Activity in your app.
<b>Intent intent = new Intent(this, AlertDetails.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);</b>
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
// Set the intent that fires when the user taps the notification.
<b>.setContentIntent(pendingIntent)</b>
.setAutoCancel(true);
এই কোডটি setAutoCancel() কল করে, যা ব্যবহারকারী যখন এটিতে ট্যাপ করে তখন স্বয়ংক্রিয়ভাবে বিজ্ঞপ্তিটি সরিয়ে দেয় ।
পূর্ববর্তী উদাহরণে দেখানো ইনটেন্ট ফ্ল্যাগগুলি ব্যবহারকারীর প্রত্যাশিত নেভিগেশন অভিজ্ঞতা সংরক্ষণ করে যখন ব্যবহারকারী বিজ্ঞপ্তি ব্যবহার করে আপনার অ্যাপটি খোলে। আপনি যে ধরণের কার্যকলাপ শুরু করছেন তার উপর নির্ভর করে আপনি এটি ব্যবহার করতে চাইতে পারেন, যা নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:
এমন একটি অ্যাক্টিভিটি যা কেবলমাত্র বিজ্ঞপ্তির প্রতিক্রিয়ার জন্য বিদ্যমান। সাধারণ অ্যাপ ব্যবহারের সময় ব্যবহারকারী এই অ্যাক্টিভিটিতে নেভিগেট করার কোনও কারণ নেই, তাই অ্যাক্টিভিটিটি আপনার অ্যাপের বিদ্যমান টাস্ক এবং ব্যাক স্ট্যাকে যোগ করার পরিবর্তে একটি নতুন টাস্ক শুরু করে। এটি পূর্ববর্তী নমুনায় তৈরি করা ইনটেন্টের ধরণ।
আপনার অ্যাপের নিয়মিত অ্যাপ প্রবাহে বিদ্যমান একটি কার্যকলাপ। এই ক্ষেত্রে, কার্যকলাপ শুরু করলে একটি ব্যাক স্ট্যাক তৈরি হয় যাতে ব্যবহারকারীর ব্যাক এবং আপ বোতামগুলির জন্য প্রত্যাশা সংরক্ষিত থাকে।
আপনার বিজ্ঞপ্তির উদ্দেশ্য কনফিগার করার বিভিন্ন উপায় সম্পর্কে আরও জানতে, বিজ্ঞপ্তি থেকে একটি কার্যকলাপ শুরু করুন দেখুন।
বিজ্ঞপ্তিটি দেখান
বিজ্ঞপ্তিটি প্রদর্শিত করার জন্য, NotificationManagerCompat.notify() কল করুন, বিজ্ঞপ্তি এবং NotificationCompat.Builder.build() এর ফলাফলের জন্য একটি অনন্য আইডি পাস করুন। এটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
কোটলিন
with(NotificationManagerCompat.from(this)) {
if (ActivityCompat.checkSelfPermission(
this@MainActivity,
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(NOTIFICATION_ID, builder.build())
}
জাভা
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
NotificationManagerCompat.from(this).notify(NOTIFICATION_ID, builder.build());
আপনার পাস করা নোটিফিকেশন আইডিটি NotificationManagerCompat.notify() এ সংরক্ষণ করুন, কারণ যখন আপনি নোটিফিকেশন আপডেট করতে বা অপসারণ করতে চান তখন এটির প্রয়োজন হয়।
এছাড়াও, Android 13 এবং তার পরবর্তী ভার্সনে চলমান ডিভাইসগুলিতে মৌলিক বিজ্ঞপ্তিগুলি পরীক্ষা করার জন্য, ম্যানুয়ালি বিজ্ঞপ্তিগুলি চালু করুন অথবা বিজ্ঞপ্তিগুলির অনুরোধ করার জন্য একটি ডায়ালগ তৈরি করুন।
অ্যাকশন বোতাম যোগ করুন
একটি বিজ্ঞপ্তিতে সর্বাধিক তিনটি অ্যাকশন বোতাম থাকতে পারে যা ব্যবহারকারীকে দ্রুত প্রতিক্রিয়া জানাতে দেয়, যেমন একটি অনুস্মারক স্নুজ করা বা একটি টেক্সট বার্তার উত্তর দেওয়া। কিন্তু এই অ্যাকশন বোতামগুলি ব্যবহারকারী যখন বিজ্ঞপ্তিটি ট্যাপ করে তখন সম্পাদিত ক্রিয়াটির নকল করা উচিত নয়।

চিত্র ৩। একটি অ্যাকশন বোতাম সহ একটি বিজ্ঞপ্তি।
একটি অ্যাকশন বোতাম যোগ করতে, addAction() পদ্ধতিতে একটি PendingIntent পাস করুন। এটি নোটিফিকেশনের ডিফল্ট ট্যাপ অ্যাকশন সেট আপ করার মতো, কোনও অ্যাক্টিভিটি চালু করার পরিবর্তে, আপনি অন্যান্য কাজ করতে পারেন যেমন একটি BroadcastReceiver শুরু করা যা ব্যাকগ্রাউন্ডে একটি কাজ করে যাতে অ্যাকশনটি ইতিমধ্যে খোলা অ্যাপটিকে ব্যাহত না করে।
উদাহরণস্বরূপ, নিম্নলিখিত কোডটি দেখায় কিভাবে একটি নির্দিষ্ট রিসিভারে একটি সম্প্রচার পাঠাতে হয়:
কোটলিন
val ACTION_SNOOZE = "snooze"
<b>val snoozeIntent = Intent(this, MyBroadcastReceiver::class.java).apply {
action = ACTION_SNOOZE
putExtra(EXTRA_NOTIFICATION_ID, 0)
}
val snoozePendingIntent: PendingIntent =
PendingIntent.getBroadcast(this, 0, snoozeIntent, 0)</b>
val builder = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
<b>.addAction(R.drawable.ic_snooze, getString(R.string.snooze),
snoozePendingIntent)</b>
জাভা
String ACTION_SNOOZE = "snooze"
<b>Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class);
snoozeIntent.setAction(ACTION_SNOOZE);
snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0);
PendingIntent snoozePendingIntent =
PendingIntent.getBroadcast(this, 0, snoozeIntent, 0);</b>
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
<b>.addAction(R.drawable.ic_snooze, getString(R.string.snooze),
snoozePendingIntent);</b>
ব্যাকগ্রাউন্ডে কাজ চালানোর জন্য একটি BroadcastReceiver তৈরি সম্পর্কে আরও তথ্যের জন্য, ব্রডকাস্টের ওভারভিউ দেখুন।
যদি আপনি মিডিয়া প্লেব্যাক বোতাম ব্যবহার করে একটি বিজ্ঞপ্তি তৈরি করার চেষ্টা করেন, যেমন ট্র্যাক পজ করা এবং এড়িয়ে যাওয়া, তাহলে মিডিয়া নিয়ন্ত্রণ ব্যবহার করে কীভাবে একটি বিজ্ঞপ্তি তৈরি করবেন তা দেখুন।
একটি সরাসরি উত্তর অ্যাকশন যোগ করুন
অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) এ প্রবর্তিত ডাইরেক্ট রিপ্লাই অ্যাকশন ব্যবহারকারীদের সরাসরি নোটিফিকেশনে টেক্সট প্রবেশ করতে দেয়। এরপর কোনও অ্যাক্টিভিটি না খুলেই টেক্সটটি আপনার অ্যাপে পৌঁছে দেওয়া হয়। উদাহরণস্বরূপ, আপনি ডাইরেক্ট রিপ্লাই অ্যাকশন ব্যবহার করে ব্যবহারকারীদের নোটিফিকেশনের মধ্যে থেকে টেক্সট মেসেজের উত্তর দিতে বা টাস্ক লিস্ট আপডেট করতে দিতে পারেন।

চিত্র ৪. "উত্তর দিন" বোতামে ট্যাপ করলে টেক্সট ইনপুট খোলে।
সরাসরি উত্তর দেওয়ার ক্রিয়াটি বিজ্ঞপ্তিতে একটি অতিরিক্ত বোতাম হিসাবে উপস্থিত হয় যা একটি টেক্সট ইনপুট খোলে। ব্যবহারকারী টাইপ করা শেষ করলে, সিস্টেমটি বিজ্ঞপ্তির ক্রিয়াটির জন্য আপনার নির্দিষ্ট করা অভিপ্রায়ের সাথে টেক্সট প্রতিক্রিয়া সংযুক্ত করে এবং আপনার অ্যাপে উদ্দেশ্যটি প্রেরণ করে।
উত্তর বোতামটি যোগ করুন
সরাসরি উত্তর সমর্থন করে এমন একটি বিজ্ঞপ্তি ক্রিয়া তৈরি করতে, এই পদক্ষেপগুলি অনুসরণ করুন:
-
RemoteInput.Builderএর একটি ইনস্ট্যান্স তৈরি করুন যা আপনি আপনার নোটিফিকেশন অ্যাকশনে যোগ করতে পারেন। এই ক্লাসের কনস্ট্রাক্টর একটি স্ট্রিং গ্রহণ করে যা সিস্টেম টেক্সট ইনপুটের জন্য কী হিসেবে ব্যবহার করে। আপনার অ্যাপ পরবর্তীতে ইনপুটের টেক্সট পুনরুদ্ধার করতে সেই কী ব্যবহার করে। * {Kotlin} ```kotlin // অ্যাকশনের ইন্টেন্টে ডেলিভার করা স্ট্রিংয়ের জন্য কী। private val KEY_TEXT_REPLY = "key_text_reply" var replyLabel: String = resources.getString(R.string.reply_label) var remoteInput: RemoteInput = RemoteInput.Builder(KEY_TEXT_REPLY).run { setLabel(replyLabel) build() } ``` * {Java} ```java // অ্যাকশনের ইন্টেন্টে ডেলিভার করা স্ট্রিংয়ের জন্য কী। private static final String KEY_TEXT_REPLY = "key_text_reply"; String replyLabel = getResources().getString(R.string.reply_label); রিমোটইনপুট রিমোটইনপুট = নতুন রিমোটইনপুট.বিল্ডার(KEY_TEXT_REPLY) .সেটলেবেল(রিপ্লাইলেবেল) .বিল্ড(); ``` - উত্তর অ্যাকশনের জন্য একটি
PendingIntentতৈরি করুন। * {Kotlin} ```kotlin // উত্তর অ্যাকশনটি ট্রিগার করার জন্য একটি PendingIntent তৈরি করুন। var replyPendingIntent: PendingIntent = PendingIntent.getBroadcast(applicationContext, conversation.getConversationId(), getMessageReplyIntent(conversation.getConversationId()), PendingIntent.FLAG_UPDATE_CURRENT) ``` * {Java} ```java // উত্তর অ্যাকশনটি ট্রিগার করার জন্য একটি PendingIntent তৈরি করুন। PendingIntent replyPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), conversation.getConversationId(), getMessageReplyIntent(conversation.getConversationId()), PendingIntent.FLAG_UPDATE_CURRENT); ``` -
addRemoteInput()ব্যবহার করে একটি অ্যাকশনেRemoteInputঅবজেক্ট সংযুক্ত করুন। * {Kotlin} ```kotlin // উত্তর অ্যাকশন তৈরি করুন এবং রিমোট ইনপুট যোগ করুন। var অ্যাকশন: NotificationCompat.Action = NotificationCompat.Action.Builder(R.drawable.ic_reply_icon, getString(R.string.label), replyPendingIntent) .addRemoteInput(remoteInput) .build() ``` * {Java} ```java // উত্তর অ্যাকশন তৈরি করুন এবং রিমোট ইনপুট যোগ করুন। NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon, getString(R.string.label), replyPendingIntent) .addRemoteInput(remoteInput) .build(); ``` - একটি বিজ্ঞপ্তিতে ক্রিয়াটি প্রয়োগ করুন এবং বিজ্ঞপ্তিটি জারি করুন। * {Kotlin} ```kotlin // বিজ্ঞপ্তিটি তৈরি করুন এবং ক্রিয়াটি যুক্ত করুন। val newMessageNotification = Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentTitle(getString(R.string.title)) .setContentText(getString(R.string.content)) .addAction(action) .build() // বিজ্ঞপ্তিটি জারি করুন। with(NotificationManagerCompat.from(this)) { notificationManager.notify(notificationId, newMessageNotification) } ``` * {Java} ```java // বিজ্ঞপ্তিটি তৈরি করুন এবং ক্রিয়াটি যুক্ত করুন। বিজ্ঞপ্তি newMessageNotification = নতুন Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentTitle(getString(R.string.title)) .setContentText(getString(R.string.content)) .addAction(action) .build(); // বিজ্ঞপ্তিটি ইস্যু করুন। NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(notificationId, newMessageNotification); ```
চিত্র ৪-এ দেখানো হয়েছে, যখন ব্যবহারকারী বিজ্ঞপ্তি ক্রিয়াটি ট্রিগার করে তখন সিস্টেমটি তাকে একটি প্রতিক্রিয়া ইনপুট করতে অনুরোধ করে।
উত্তর থেকে ব্যবহারকারীর ইনপুট পুনরুদ্ধার করুন
বিজ্ঞপ্তির উত্তর UI থেকে ব্যবহারকারীর ইনপুট পেতে, RemoteInput.getResultsFromIntent() এ কল করুন, এটিকে আপনার BroadcastReceiver দ্বারা প্রাপ্ত Intent পাস করুন:
কোটলিন
private fun getMessageText(intent: Intent): CharSequence? {
return RemoteInput.getResultsFromIntent(intent)?.getCharSequence(KEY_TEXT_REPLY)
}
জাভা
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
return remoteInput.getCharSequence(KEY_TEXT_REPLY);
}
return null;
}
টেক্সটটি প্রক্রিয়া করার পরে, একই আইডি এবং ট্যাগ ব্যবহার করে NotificationManagerCompat.notify() কল করে বিজ্ঞপ্তিটি আপডেট করুন, যদি ব্যবহার করা হয়। সরাসরি উত্তর UI লুকানোর জন্য এবং ব্যবহারকারীকে নিশ্চিত করার জন্য যে তাদের উত্তর সঠিকভাবে গৃহীত হয়েছে এবং প্রক্রিয়া করা হয়েছে।
কোটলিন
// Build a new notification, which informs the user that the system
// handled their interaction with the previous notification.
val repliedNotification = Notification.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_message)
.setContentText(getString(R.string.replied))
.build()
// Issue the new notification.
NotificationManagerCompat.from(this).apply {
notificationManager.notify(notificationId, repliedNotification)
}
জাভা
// Build a new notification, which informs the user that the system
// handled their interaction with the previous notification.
Notification repliedNotification = new Notification.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_message)
.setContentText(getString(R.string.replied))
.build();
// Issue the new notification.
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(notificationId, repliedNotification);
অন্যান্য তথ্য পুনরুদ্ধার করুন
অন্যান্য ডেটা টাইপ পরিচালনা করা RemoteInput এর মতোই কাজ করে। নিম্নলিখিত উদাহরণে ইনপুট হিসেবে image ব্যবহার করা হয়েছে।
কোটলিন
// Key for the data that's delivered in the action's intent.
private val KEY_REPLY = "key_reply"
var replyLabel: String = resources.getString(R.string.reply_label)
var 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 কল করুন এবং সংশ্লিষ্ট ডেটা বের করুন।
কোটলিন
import android.app.RemoteInput;
import android.content.Intent;
import android.os.Bundle;
class ReplyReceiver: BroadcastReceiver() {
public static final String KEY_DATA = "key_data";
public static void handleRemoteInput(Intent intent) {
Bundle dataResults = RemoteInput.getDataResultsFromIntent(intent, KEY_DATA);
val imageUri: Uri? = dataResults.values.firstOrNull()
if (imageUri != null) {
// Extract the image
try {
val inputStream = context.contentResolver.openInputStream(imageUri)
val bitmap = BitmapFactory.decodeStream(inputStream)
// Display the image
// ...
} catch (e: Exception) {
Log.e("ReplyReceiver", "Failed to process image URI", e)
}
}
}
এই নতুন বিজ্ঞপ্তিটি নিয়ে কাজ করার সময়, রিসিভারের onReceive() পদ্ধতিতে প্রেরিত প্রসঙ্গটি ব্যবহার করুন।
setRemoteInputHistory() কল করে বিজ্ঞপ্তির নীচে উত্তরটি যুক্ত করুন। তবে, যদি আপনি একটি মেসেজিং অ্যাপ তৈরি করেন, তাহলে একটি মেসেজিং-স্টাইল বিজ্ঞপ্তি তৈরি করুন এবং কথোপকথনে নতুন বার্তাটি যুক্ত করুন।
মেসেজিং অ্যাপ থেকে বিজ্ঞপ্তি সম্পর্কে আরও পরামর্শের জন্য, মেসেজিং অ্যাপের জন্য সেরা অনুশীলন সম্পর্কে বিভাগটি দেখুন।
একটি জরুরি বার্তা দেখান
আপনার অ্যাপটিকে একটি জরুরি, সময়-সংবেদনশীল বার্তা প্রদর্শনের প্রয়োজন হতে পারে, যেমন একটি ইনকামিং ফোন কল বা রিংিং অ্যালার্ম। এই পরিস্থিতিতে, আপনি আপনার বিজ্ঞপ্তির সাথে একটি পূর্ণ-স্ক্রিন ইন্টেন্ট যুক্ত করতে পারেন।
যখন বিজ্ঞপ্তিটি আহ্বান করা হয়, তখন ব্যবহারকারীরা ডিভাইসের লক স্ট্যাটাসের উপর নির্ভর করে নিম্নলিখিতগুলির মধ্যে একটি দেখতে পান:
- যদি ব্যবহারকারীর ডিভাইস লক থাকে, তাহলে লকস্ক্রিনটি ঢেকে একটি পূর্ণ-স্ক্রিন কার্যকলাপ প্রদর্শিত হবে।
- যদি ব্যবহারকারীর ডিভাইস আনলক করা থাকে, তাহলে বিজ্ঞপ্তিটি একটি প্রসারিত আকারে প্রদর্শিত হবে যার মধ্যে বিজ্ঞপ্তিটি পরিচালনা বা খারিজ করার বিকল্পগুলি অন্তর্ভুক্ত থাকবে।
নিম্নলিখিত কোড স্নিপেটটি দেখায় যে কীভাবে আপনার বিজ্ঞপ্তিটিকে একটি পূর্ণ-স্ক্রিন ইনটেন্টের সাথে যুক্ত করবেন:
কোটলিন
val fullScreenIntent = Intent(this, ImportantActivity::class.java)
val fullScreenPendingIntent = PendingIntent.getActivity(this, 0,
fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT)
var builder = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
<b>.setFullScreenIntent(fullScreenPendingIntent, true)</b>
জাভা
Intent fullScreenIntent = new Intent(this, ImportantActivity.class);
PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0,
fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
<b>.setFullScreenIntent(fullScreenPendingIntent, true);</b>
লক স্ক্রিনের দৃশ্যমানতা সেট করুন
লক স্ক্রিন থেকে বিজ্ঞপ্তিতে দৃশ্যমান বিশদের স্তর নিয়ন্ত্রণ করতে, setVisibility() কল করুন এবং নিম্নলিখিত মানগুলির মধ্যে একটি নির্দিষ্ট করুন:
VISIBILITY_PUBLIC: বিজ্ঞপ্তির সম্পূর্ণ বিষয়বস্তু লক স্ক্রিনে প্রদর্শিত হবে।VISIBILITY_SECRET: বিজ্ঞপ্তির কোনও অংশ লক স্ক্রিনে দেখা যাচ্ছে না।VISIBILITY_PRIVATE: লক স্ক্রিনে শুধুমাত্র মৌলিক তথ্য, যেমন বিজ্ঞপ্তির আইকন এবং বিষয়বস্তুর শিরোনাম, প্রদর্শিত হয়। বিজ্ঞপ্তির সম্পূর্ণ বিষয়বস্তু প্রদর্শিত হয় না।
যখন আপনি VISIBILITY_PRIVATE সেট করেন, তখন আপনি বিজ্ঞপ্তি সামগ্রীর একটি বিকল্প সংস্করণও প্রদান করতে পারেন যা নির্দিষ্ট বিবরণ লুকায়। উদাহরণস্বরূপ, একটি SMS অ্যাপ এমন একটি বিজ্ঞপ্তি প্রদর্শন করতে পারে যা "আপনার কাছে 3টি নতুন টেক্সট বার্তা আছে" দেখায়, কিন্তু বার্তা সামগ্রী এবং প্রেরকদের লুকিয়ে রাখে। এই বিকল্প বিজ্ঞপ্তি প্রদান করতে, প্রথমে যথারীতি NotificationCompat.Builder ব্যবহার করে বিকল্প বিজ্ঞপ্তি তৈরি করুন। তারপর, setPublicVersion() ব্যবহার করে সাধারণ বিজ্ঞপ্তির সাথে বিকল্প বিজ্ঞপ্তি সংযুক্ত করুন।
মনে রাখবেন যে ব্যবহারকারীর সর্বদা তাদের বিজ্ঞপ্তিগুলি লক স্ক্রিনে দৃশ্যমান কিনা তার উপর চূড়ান্ত নিয়ন্ত্রণ থাকে এবং আপনার অ্যাপের বিজ্ঞপ্তি চ্যানেলের উপর ভিত্তি করে সেগুলি নিয়ন্ত্রণ করতে পারে।
একটি বিজ্ঞপ্তি আপডেট করুন
কোনও বিজ্ঞপ্তি জারি করার পরে তা আপডেট করতে, NotificationManagerCompat.notify() আবার কল করুন, আপনার ব্যবহৃত আইডিটি একইভাবে পাস করুন। যদি পূর্ববর্তী বিজ্ঞপ্তিটি বাতিল করা হয়, তাহলে পরিবর্তে একটি নতুন বিজ্ঞপ্তি তৈরি করা হবে।
আপনি ঐচ্ছিকভাবে setOnlyAlertOnce() কল করতে পারেন যাতে আপনার বিজ্ঞপ্তি ব্যবহারকারীকে বাধাগ্রস্ত করে—শুধুমাত্র প্রথমবার বিজ্ঞপ্তিটি প্রদর্শিত হলে—শব্দ, কম্পন বা ভিজ্যুয়াল সংকেতের মাধ্যমে—পরবর্তী আপডেটের জন্য নয়।
একটি বিজ্ঞপ্তি সরান
নিম্নলিখিতগুলির মধ্যে একটি না হওয়া পর্যন্ত বিজ্ঞপ্তিগুলি দৃশ্যমান থাকে:
- ব্যবহারকারী বিজ্ঞপ্তিটি খারিজ করে দেন।
- আপনি যদি বিজ্ঞপ্তি তৈরি করার সময়
setAutoCancel()কল করেন, তাহলে ব্যবহারকারী বিজ্ঞপ্তিটি ট্যাপ করবে। - আপনি একটি নির্দিষ্ট বিজ্ঞপ্তি আইডির জন্য
cancel()কল করেন। এই পদ্ধতিটি চলমান বিজ্ঞপ্তিগুলিও মুছে ফেলে। - আপনি
cancelAll()কল করেন, যা আপনার পূর্বে জারি করা সমস্ত বিজ্ঞপ্তি মুছে ফেলে। -
setTimeoutAfter()ব্যবহার করে যদি আপনি বিজ্ঞপ্তি তৈরি করার সময় একটি টাইমআউট সেট করেন, তাহলে নির্দিষ্ট সময়কাল অতিক্রান্ত হয়ে যাবে। প্রয়োজনে, নির্দিষ্ট টাইমআউট সময়কাল অতিক্রান্ত হওয়ার আগে আপনি একটি বিজ্ঞপ্তি বাতিল করতে পারেন।
মেসেজিং অ্যাপের জন্য সেরা পদ্ধতি
আপনার মেসেজিং এবং চ্যাট অ্যাপের জন্য বিজ্ঞপ্তি তৈরি করার সময় এখানে তালিকাভুক্ত সেরা অনুশীলনগুলি বিবেচনা করুন।
মেসেজিং স্টাইল ব্যবহার করুন
অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) থেকে শুরু করে, অ্যান্ড্রয়েড বিশেষভাবে মেসেজিং কন্টেন্টের জন্য একটি নোটিফিকেশন স্টাইল টেমপ্লেট প্রদান করে। NotificationCompat.MessagingStyle ক্লাস ব্যবহার করে, আপনি বিজ্ঞপ্তিতে প্রদর্শিত বেশ কয়েকটি লেবেল পরিবর্তন করতে পারেন, যার মধ্যে কথোপকথনের শিরোনাম, অতিরিক্ত বার্তা এবং বিজ্ঞপ্তির কন্টেন্ট ভিউ অন্তর্ভুক্ত রয়েছে।
নিম্নলিখিত কোড স্নিপেটটি MessagingStyle ক্লাস ব্যবহার করে একটি বিজ্ঞপ্তির স্টাইল কীভাবে কাস্টমাইজ করতে হয় তা দেখায়।
কোটলিন
val user = Person.Builder()
.setIcon(userIcon)
.setName(userName)
.build()
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("2 new messages with $sender")
.setContentText(subject)
.setSmallIcon(R.drawable.new_message)
.setStyle(NotificationCompat.MessagingStyle(user)
.addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson())
.addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson())
)
.build()
জাভা
Person user = new Person.Builder()
.setIcon(userIcon)
.setName(userName)
.build();
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("2 new messages with " + sender)
.setContentText(subject)
.setSmallIcon(R.drawable.new_message)
.setStyle(new NotificationCompat.MessagingStyle(user)
.addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson())
.addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson())
)
.build();
অ্যান্ড্রয়েড ৯.০ (এপিআই লেভেল ২৮) থেকে শুরু করে, বিজ্ঞপ্তি এবং এর অবতারগুলির সর্বোত্তম রেন্ডারিং পেতে Person শ্রেণী ব্যবহার করাও প্রয়োজন।
NotificationCompat.MessagingStyle ব্যবহার করার সময়, নিম্নলিখিতগুলি করুন:
- দুইজনের বেশি লোকের গ্রুপ চ্যাটের জন্য একটি শিরোনাম সেট করতে
MessagingStyle.setConversationTitle()এ কল করুন। একটি ভালো কথোপকথনের শিরোনাম হতে পারে গ্রুপ চ্যাটের নাম অথবা, যদি নাম না থাকে, তাহলে কথোপকথনে অংশগ্রহণকারীদের একটি তালিকা। এটি ছাড়া, বার্তাটি কথোপকথনের সাম্প্রতিকতম বার্তা প্রেরকের সাথে এক-এক কথোপকথনের অংশ বলে ভুল হতে পারে। - ছবির মতো মিডিয়া বার্তা অন্তর্ভুক্ত করতে
MessagingStyle.setData()পদ্ধতি ব্যবহার করুন। MIME ধরণের প্যাটার্ন image/* সমর্থিত।
সরাসরি উত্তর ব্যবহার করুন
ডাইরেক্ট রিপ্লাই ব্যবহারকারীকে একটি বার্তার ইনলাইন উত্তর দিতে দেয়।
- ব্যবহারকারী ইনলাইন রিপ্লাই অ্যাকশনের মাধ্যমে উত্তর দেওয়ার পর,
MessagingStyle.addMessage()ব্যবহার করেMessagingStyleবিজ্ঞপ্তিটি আপডেট করুন এবং বিজ্ঞপ্তিটি প্রত্যাহার বা বাতিল করবেন না। বিজ্ঞপ্তি বাতিল না করলে ব্যবহারকারী বিজ্ঞপ্তি থেকে একাধিক উত্তর পাঠাতে পারবেন। - ইনলাইন রিপ্লাই অ্যাকশনটিকে Wear OS এর সাথে সামঞ্জস্যপূর্ণ করতে,
Action.WearableExtender.setHintDisplayInlineAction(true)কল করুন। -
addHistoricMessage()পদ্ধতি ব্যবহার করে বিজ্ঞপ্তিতে ঐতিহাসিক বার্তা যোগ করে সরাসরি উত্তর কথোপকথনের প্রসঙ্গ প্রদান করুন।
স্মার্ট উত্তর সক্ষম করুন
- স্মার্ট রিপ্লাই সক্ষম করতে, রিপ্লাই অ্যাকশনে
setAllowGeneratedResponses(true)কল করুন। এর ফলে যখন বিজ্ঞপ্তিটি Wear OS ডিভাইসে ব্রিজ করা হয় তখন ব্যবহারকারীরা স্মার্ট রিপ্লাই প্রতিক্রিয়াগুলি উপলব্ধ করে।NotificationCompat.MessagingStyleবিজ্ঞপ্তি দ্বারা প্রদত্ত প্রেক্ষাপট ব্যবহার করে একটি সম্পূর্ণ অন-ওয়াচ মেশিন লার্নিং মডেল দ্বারা স্মার্ট রিপ্লাই প্রতিক্রিয়া তৈরি করা হয় এবং প্রতিক্রিয়াগুলি তৈরি করার জন্য কোনও ডেটা ইন্টারনেটে আপলোড করা হয় না।
বিজ্ঞপ্তি মেটাডেটা যোগ করুন
- ডিভাইসটি যখন
Do Not Disturb modeথাকে তখন আপনার অ্যাপের বিজ্ঞপ্তিগুলি কীভাবে পরিচালনা করতে হয় তা সিস্টেমকে জানানোর জন্য বিজ্ঞপ্তি মেটাডেটা বরাদ্দ করুন। উদাহরণস্বরূপ, ডু নট ডিস্টার্ব ওভাররাইড করতেaddPerson()অথবাsetCategory(Notification.CATEGORY_MESSAGE)পদ্ধতি ব্যবহার করুন।