একটি বিজ্ঞপ্তি তৈরি করুন

বিজ্ঞপ্তিগুলি আপনার অ্যাপের ইভেন্টগুলি সম্পর্কে সংক্ষিপ্ত, সময়োপযোগী তথ্য প্রদান করে যখন এটি ব্যবহার করা হয় না। এই নথিটি আপনাকে দেখায় কিভাবে বিভিন্ন বৈশিষ্ট্য সহ একটি বিজ্ঞপ্তি তৈরি করতে হয়। Android-এ বিজ্ঞপ্তিগুলি কীভাবে প্রদর্শিত হয় তার একটি ভূমিকার জন্য, বিজ্ঞপ্তিগুলির ওভারভিউ দেখুন৷ বিজ্ঞপ্তি ব্যবহার করে এমন নমুনা কোডের জন্য, GitHub-এ মানুষের নমুনা দেখুন।

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

AndroidX কোর লাইব্রেরি যোগ করুন

যদিও অ্যান্ড্রয়েড স্টুডিওর সাথে তৈরি বেশিরভাগ প্রকল্পে NotificationCompat ব্যবহার করার জন্য প্রয়োজনীয় নির্ভরতা রয়েছে, যাচাই করুন যে আপনার মডিউল-স্তরের build.gradle ফাইলে নিম্নলিখিত নির্ভরতা রয়েছে:

গ্রোভি

dependencies {
    implementation "androidx.core:core:2.2.0"
}

কোটলিন

dependencies {
    implementation("androidx.core:core-ktx:2.2.0")
}

একটি মৌলিক বিজ্ঞপ্তি তৈরি করুন

একটি বিজ্ঞপ্তি তার সবচেয়ে মৌলিক এবং কম্প্যাক্ট আকারে—এছাড়াও ভেঙে পড়া ফর্ম নামে পরিচিত—একটি আইকন, একটি শিরোনাম এবং অল্প পরিমাণ পাঠ্য সামগ্রী প্রদর্শন করে৷ এই বিভাগটি দেখায় কিভাবে একটি বিজ্ঞপ্তি তৈরি করতে হয় যা ব্যবহারকারী আপনার অ্যাপে একটি কার্যকলাপ চালু করতে ট্যাপ করতে পারে।

চিত্র 1. একটি আইকন, একটি শিরোনাম এবং কিছু পাঠ্য সহ একটি বিজ্ঞপ্তি৷

একটি বিজ্ঞপ্তির প্রতিটি অংশ সম্পর্কে আরও বিশদ বিবরণের জন্য, বিজ্ঞপ্তি শারীরস্থান সম্পর্কে পড়ুন।

রানটাইম অনুমতি ঘোষণা করুন

অ্যান্ড্রয়েড 13 (এপিআই লেভেল 33) এবং উচ্চতর কোনো অ্যাপ থেকে অ-মুক্ত (ফোরগ্রাউন্ড সার্ভিসেস (এফজিএস) সহ) বিজ্ঞপ্তি পোস্ট করার জন্য রানটাইম অনুমতি সমর্থন করে।

আপনার অ্যাপের ম্যানিফেস্ট ফাইলে আপনাকে যে অনুমতিটি ঘোষণা করতে হবে তা নিম্নলিখিত কোড স্নিপেটে প্রদর্শিত হবে:

<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) এবং পরবর্তী সংস্করণগুলির সাথে সামঞ্জস্যের জন্য প্রয়োজন, কিন্তু পূর্ববর্তী সংস্করণগুলি দ্বারা উপেক্ষা করা হয়৷

ডিফল্টরূপে, বিজ্ঞপ্তির পাঠ্য বিষয়বস্তু এক লাইনে ফিট করার জন্য ছাঁটাই করা হয়। আপনি একটি প্রসারণযোগ্য বিজ্ঞপ্তি তৈরি করে অতিরিক্ত তথ্য দেখাতে পারেন।

চিত্র 2. একটি সম্প্রসারণযোগ্য বিজ্ঞপ্তি এটির ভেঙে পড়া এবং প্রসারিত আকারে।

আপনি যদি আপনার বিজ্ঞপ্তিটি দীর্ঘতর করতে চান, আপনি 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...")
        .setStyle(NotificationCompat.BigTextStyle()
                .bigText("Much longer text that cannot fit one line..."))
        .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...")
        .setStyle(new NotificationCompat.BigTextStyle()
                .bigText("Much longer text that cannot fit one line..."))
        .setPriority(NotificationCompat.PRIORITY_DEFAULT);

একটি ইমেজ এবং মিডিয়া প্লেব্যাক কন্ট্রোল কিভাবে যোগ করতে হয় সহ অন্যান্য বড় বিজ্ঞপ্তি শৈলী সম্পর্কে আরও তথ্যের জন্য, একটি প্রসারণযোগ্য বিজ্ঞপ্তি তৈরি করুন দেখুন।

একটি চ্যানেল তৈরি করুন এবং গুরুত্ব নির্ধারণ করুন

আপনি Android 8.0 এবং পরবর্তীতে বিজ্ঞপ্তি বিতরণ করার আগে, createNotificationChannel()NotificationChannel এর একটি উদাহরণ পাস করে সিস্টেমের সাথে আপনার অ্যাপের বিজ্ঞপ্তি চ্যানেল নিবন্ধন করুন৷ নিম্নলিখিত কোডটি 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);
    }
}

কারণ Android 8.0 এবং পরবর্তীতে কোনো বিজ্ঞপ্তি পোস্ট করার আগে আপনাকে অবশ্যই বিজ্ঞপ্তি চ্যানেল তৈরি করতে হবে, আপনার অ্যাপ শুরু হওয়ার সাথে সাথে এই কোডটি কার্যকর করুন। এটি বারবার কল করা নিরাপদ, কারণ একটি বিদ্যমান বিজ্ঞপ্তি চ্যানেল তৈরি করা কোন কাজ করে না।

NotificationChannel কনস্ট্রাক্টরের জন্য একটি importance প্রয়োজন, NotificationManager ক্লাসের একটি ধ্রুবক ব্যবহার করে। এই প্যারামিটারটি এই চ্যানেলের অন্তর্গত যেকোন বিজ্ঞপ্তির জন্য ব্যবহারকারীকে কীভাবে বাধা দিতে হবে তা নির্ধারণ করে। Android 7.1 এবং তার আগের সংস্করণ সমর্থন করতে setPriority() দিয়ে অগ্রাধিকার সেট করুন, যেমনটি পূর্ববর্তী উদাহরণে দেখানো হয়েছে।

যদিও আপনাকে নিম্নলিখিত উদাহরণে দেখানো হিসাবে বিজ্ঞপ্তির গুরুত্ব বা অগ্রাধিকার সেট করতে হবে, সিস্টেমটি আপনি যে সতর্কতামূলক আচরণ পাবেন তার নিশ্চয়তা দেয় না। কিছু ক্ষেত্রে, সিস্টেম অন্যান্য কারণের উপর ভিত্তি করে গুরুত্বের স্তর পরিবর্তন করতে পারে এবং ব্যবহারকারী সর্বদা একটি প্রদত্ত চ্যানেলের জন্য গুরুত্বের স্তরটি পুনরায় সংজ্ঞায়িত করতে পারে।

বিভিন্ন স্তরের অর্থ কী সে সম্পর্কে আরও তথ্যের জন্য, বিজ্ঞপ্তির গুরুত্বের স্তরগুলি সম্পর্কে পড়ুন।

বিজ্ঞপ্তির ট্যাপ অ্যাকশন সেট করুন

প্রতিটি বিজ্ঞপ্তিকে অবশ্যই একটি ট্যাপে সাড়া দিতে হবে, সাধারণত আপনার অ্যাপে বিজ্ঞপ্তির সাথে সামঞ্জস্যপূর্ণ একটি কার্যকলাপ খুলতে। এটি করার জন্য, একটি PendingIntent অবজেক্টের সাথে সংজ্ঞায়িত একটি বিষয়বস্তু অভিপ্রায় উল্লেখ করুন এবং এটি setContentIntent() এ পাস করুন।

নিম্নলিখিত স্নিপেটটি দেখায় যে ব্যবহারকারী যখন বিজ্ঞপ্তিতে ট্যাপ করেন তখন একটি কার্যকলাপ খোলার জন্য একটি মৌলিক অভিপ্রায় তৈরি করতে হয়:

কোটলিন

// Create an explicit intent for an Activity in your app.
val intent = Intent(this, AlertDetails::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
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.
        .setContentIntent(pendingIntent)
        .setAutoCancel(true)

জাভা

// Create an explicit intent for an Activity in your app.
Intent intent = new Intent(this, AlertDetails.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
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.
        .setContentIntent(pendingIntent)
        .setAutoCancel(true);

এই কোডটি কল করে setAutoCancel() , যা ব্যবহারকারী যখন এটিতে ট্যাপ করে তখন স্বয়ংক্রিয়ভাবে বিজ্ঞপ্তিটি সরিয়ে দেয়

পূর্ববর্তী উদাহরণে দেখানো setFlags() পদ্ধতিটি ব্যবহারকারীর প্রত্যাশিত নেভিগেশন অভিজ্ঞতা সংরক্ষণ করে যখন তারা বিজ্ঞপ্তি ব্যবহার করে আপনার অ্যাপ খুলবে। আপনি যে ধরনের কার্যকলাপ শুরু করছেন তার উপর নির্ভর করে আপনি এটি ব্যবহার করতে চাইতে পারেন, যা নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:

  • বিজ্ঞপ্তির প্রতিক্রিয়ার জন্য একচেটিয়াভাবে বিদ্যমান একটি কার্যকলাপ। সাধারণ অ্যাপ ব্যবহারের সময় ব্যবহারকারীর এই ক্রিয়াকলাপে নেভিগেট করার কোনও কারণ নেই, তাই কার্যকলাপটি আপনার অ্যাপের বিদ্যমান টাস্ক এবং ব্যাক স্ট্যাকে যোগ করার পরিবর্তে একটি নতুন টাস্ক শুরু করে। এটি পূর্ববর্তী নমুনায় তৈরি অভিপ্রায়ের ধরন।

  • আপনার অ্যাপের নিয়মিত অ্যাপ প্রবাহে বিদ্যমান একটি কার্যকলাপ। এই ক্ষেত্রে, কার্যকলাপ শুরু করা একটি ব্যাক স্ট্যাক তৈরি করে যাতে ব্যাক এবং আপ বোতামগুলির জন্য ব্যবহারকারীর প্রত্যাশাগুলি সংরক্ষণ করা হয়।

আপনার বিজ্ঞপ্তির উদ্দেশ্য কনফিগার করার বিভিন্ন উপায় সম্পর্কে আরও জানতে, একটি বিজ্ঞপ্তি থেকে একটি কার্যকলাপ শুরু করুন দেখুন।

বিজ্ঞপ্তি দেখান

বিজ্ঞপ্তিটি প্রদর্শিত করতে, 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())
}

জাভা

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 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
   }
   // notificationId is a unique int for each notification that you must define.
   notify(NOTIFICATION_ID, builder.build())
}

আপনি NotificationManagerCompat.notify() এ পাস করা বিজ্ঞপ্তি আইডিটি সংরক্ষণ করুন, কারণ আপনি যখন বিজ্ঞপ্তি আপডেট করতে বা সরাতে চান তখন আপনার এটির প্রয়োজন হয়।

উপরন্তু, Android 13 এবং উচ্চতর সংস্করণে চলমান ডিভাইসগুলিতে প্রাথমিক বিজ্ঞপ্তিগুলি পরীক্ষা করার জন্য, ম্যানুয়ালি বিজ্ঞপ্তিগুলি চালু করুন বা বিজ্ঞপ্তিগুলির অনুরোধ করার জন্য একটি ডায়ালগ তৈরি করুন৷

অ্যাকশন বোতাম যোগ করুন

একটি বিজ্ঞপ্তি তিনটি অ্যাকশন বোতাম অফার করতে পারে যা ব্যবহারকারীকে দ্রুত প্রতিক্রিয়া জানাতে দেয়, যেমন একটি অনুস্মারক স্নুজ করা বা একটি পাঠ্য বার্তার উত্তর দিতে। কিন্তু ব্যবহারকারী যখন বিজ্ঞপ্তিতে ট্যাপ করে তখন এই অ্যাকশন বোতামগুলি সম্পাদিত অ্যাকশনের ডুপ্লিকেট করা উচিত নয়।

চিত্র 3. একটি অ্যাকশন বোতাম সহ একটি বিজ্ঞপ্তি।

একটি অ্যাকশন বোতাম যোগ করতে, addAction() পদ্ধতিতে একটি PendingIntent পাস করুন। এটি বিজ্ঞপ্তির ডিফল্ট ট্যাপ অ্যাকশন সেট আপ করার মতো, কোনও অ্যাক্টিভিটি চালু করার পরিবর্তে, আপনি অন্য কিছু করতে পারেন যেমন একটি BroadcastReceiver শুরু করা যা ব্যাকগ্রাউন্ডে একটি কাজ করে যাতে অ্যাকশনটি ইতিমধ্যে খোলা অ্যাপটিকে বাধা না দেয়।

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি দেখায় কিভাবে একটি নির্দিষ্ট রিসিভারকে একটি সম্প্রচার পাঠাতে হয়:

কোটলিন

val ACTION_SNOOZE = "snooze"

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)
val builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setContentIntent(pendingIntent)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent)

জাভা

String ACTION_SNOOZE = "snooze"

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);

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)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent);

ব্যাকগ্রাউন্ডের কাজ চালানোর জন্য একটি BroadcastReceiver তৈরি সম্পর্কে আরও তথ্যের জন্য, সম্প্রচার ওভারভিউ দেখুন।

আপনি যদি এর পরিবর্তে মিডিয়া প্লেব্যাক বোতামগুলির সাহায্যে একটি বিজ্ঞপ্তি তৈরি করার চেষ্টা করেন, যেমন ট্র্যাকগুলিকে বিরতি দেওয়া এবং এড়িয়ে যাওয়া, তাহলে মিডিয়া নিয়ন্ত্রণগুলির সাথে কীভাবে একটি বিজ্ঞপ্তি তৈরি করবেন তা দেখুন৷

একটি সরাসরি উত্তর কর্ম যোগ করুন

অ্যান্ড্রয়েড 7.0 (API লেভেল 24) এ প্রবর্তিত ডাইরেক্ট রিপ্লাই অ্যাকশন ব্যবহারকারীদের সরাসরি নোটিফিকেশনে টেক্সট লিখতে দেয়। টেক্সট তারপর একটি কার্যকলাপ খোলা ছাড়া আপনার অ্যাপে বিতরণ করা হয়. উদাহরণস্বরূপ, আপনি ব্যবহারকারীদের টেক্সট বার্তার উত্তর দিতে বা বিজ্ঞপ্তির মধ্যে থেকে টাস্ক তালিকা আপডেট করতে সরাসরি উত্তর ক্রিয়া ব্যবহার করতে পারেন।

চিত্র 4. "উত্তর দিন" বোতামটি আলতো চাপলে পাঠ্য ইনপুট খোলে।

সরাসরি উত্তর ক্রিয়াটি বিজ্ঞপ্তিতে একটি অতিরিক্ত বোতাম হিসাবে উপস্থিত হয় যা একটি পাঠ্য ইনপুট খোলে। যখন ব্যবহারকারী টাইপ করা শেষ করে, তখন সিস্টেমটি বিজ্ঞপ্তির ক্রিয়াকলাপের জন্য আপনার নির্দিষ্ট করা অভিপ্রায়ে পাঠ্য প্রতিক্রিয়া সংযুক্ত করে এবং আপনার অ্যাপে অভিপ্রায় পাঠায়।

উত্তর বোতাম যোগ করুন

সরাসরি উত্তর সমর্থন করে এমন একটি বিজ্ঞপ্তি ক্রিয়া তৈরি করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. RemoteInput.Builder এর একটি উদাহরণ তৈরি করুন যা আপনি আপনার বিজ্ঞপ্তি অ্যাকশনে যোগ করতে পারেন। এই ক্লাসের কনস্ট্রাক্টর একটি স্ট্রিং গ্রহণ করে যা সিস্টেম পাঠ্য ইনপুটের জন্য কী হিসাবে ব্যবহার করে। আপনার অ্যাপ পরে ইনপুটের পাঠ্য পুনরুদ্ধার করতে সেই কী ব্যবহার করে।

    কোটলিন

      // Key for the string that's delivered in the action's intent.
      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()
      }
      

    জাভা

      // Key for the string that's delivered in the action's intent.
      private static final String KEY_TEXT_REPLY = "key_text_reply";
    
      String replyLabel = getResources().getString(R.string.reply_label);
      RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
              .setLabel(replyLabel)
              .build();
      
  2. উত্তর কর্মের জন্য একটি PendingIntent তৈরি করুন।

    কোটলিন

      // Build a PendingIntent for the reply action to trigger.
      var replyPendingIntent: PendingIntent =
          PendingIntent.getBroadcast(applicationContext,
              conversation.getConversationId(),
              getMessageReplyIntent(conversation.getConversationId()),
              PendingIntent.FLAG_UPDATE_CURRENT)
      

    জাভা

      // Build a PendingIntent for the reply action to trigger.
      PendingIntent replyPendingIntent =
              PendingIntent.getBroadcast(getApplicationContext(),
                      conversation.getConversationId(),
                      getMessageReplyIntent(conversation.getConversationId()),
                      PendingIntent.FLAG_UPDATE_CURRENT);
      
  3. addRemoteInput() ব্যবহার করে একটি কর্মের সাথে RemoteInput অবজেক্ট সংযুক্ত করুন।

    কোটলিন

      // Create the reply action and add the remote input.
      var action: NotificationCompat.Action =
          NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
              getString(R.string.label), replyPendingIntent)
              .addRemoteInput(remoteInput)
              .build()
      

    জাভা

      // Create the reply action and add the remote input.
      NotificationCompat.Action action =
              new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
                      getString(R.string.label), replyPendingIntent)
                      .addRemoteInput(remoteInput)
                      .build();
      
  4. একটি বিজ্ঞপ্তিতে ক্রিয়াটি প্রয়োগ করুন এবং বিজ্ঞপ্তি জারি করুন।

    কোটলিন

      // Build the notification and add the action.
      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()
    
      // Issue the notification.
      with(NotificationManagerCompat.from(this)) {
          notificationManager.notify(notificationId, newMessageNotification)
      }
      

    জাভা

      // Build the notification and add the action.
      Notification newMessageNotification = new Notification.Builder(context, CHANNEL_ID)
              .setSmallIcon(R.drawable.ic_message)
              .setContentTitle(getString(R.string.title))
              .setContentText(getString(R.string.content))
              .addAction(action)
              .build();
    
      // Issue the notification.
      NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
      notificationManager.notify(notificationId, newMessageNotification);
      

সিস্টেমটি ব্যবহারকারীকে একটি প্রতিক্রিয়া ইনপুট করতে অনুরোধ করে যখন তারা বিজ্ঞপ্তি ক্রিয়া ট্রিগার করে, যেমন চিত্র 4 এ দেখানো হয়েছে।

উত্তর থেকে ব্যবহারকারীর ইনপুট পুনরুদ্ধার করুন

বিজ্ঞপ্তির উত্তর 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;
 }

আপনি পাঠ্যটি প্রক্রিয়া করার পরে, একই ID এবং ট্যাগ ব্যবহার করা হলে 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);

এই নতুন বিজ্ঞপ্তির সাথে কাজ করার সময়, প্রাপকের onReceive() পদ্ধতিতে পাস করা প্রসঙ্গটি ব্যবহার করুন।

setRemoteInputHistory() কল করে বিজ্ঞপ্তির নীচে উত্তর যোগ করুন। যাইহোক, আপনি যদি একটি মেসেজিং অ্যাপ তৈরি করেন, একটি মেসেজিং-স্টাইলের বিজ্ঞপ্তি তৈরি করুন এবং কথোপকথনে নতুন বার্তা যুক্ত করুন।

একটি বার্তাপ্রেরণ অ্যাপ্লিকেশন থেকে বিজ্ঞপ্তির জন্য আরও পরামর্শের জন্য, বার্তাপ্রেরণ অ্যাপ্লিকেশনগুলির জন্য সেরা অনুশীলন সম্পর্কে বিভাগটি দেখুন৷

একটি অগ্রগতি বার যোগ করুন

বিজ্ঞপ্তিতে একটি অ্যানিমেটেড অগ্রগতি সূচক অন্তর্ভুক্ত থাকতে পারে যা ব্যবহারকারীদের একটি চলমান অপারেশনের স্থিতি দেখায়।

চিত্র 5. একটি অপারেশন চলাকালীন অগ্রগতি বার।

আপনি যদি অনুমান করতে পারেন যে কোন সময়ে কতটা অপারেশন সম্পূর্ণ হয়েছে, তাহলে সূচকটির "নির্ধারিত" ফর্মটি ব্যবহার করুন - যেমন চিত্র 5-এ দেখানো হয়েছে - setProgress(max, progress, false) কল করে। প্রথম প্যারামিটারটি হল "সম্পূর্ণ" মানটি কী, যেমন 100৷ দ্বিতীয়টি হল কতটা সম্পূর্ণ৷ শেষটি নির্দেশ করে যে এটি একটি নির্ধারিত অগ্রগতি বার।

আপনার ক্রিয়াকলাপ এগিয়ে যাওয়ার সাথে সাথে, progress জন্য একটি আপডেট মান সহ setProgress(max, progress, false) ক্রমাগত কল করুন এবং বিজ্ঞপ্তিটি পুনরায় জারি করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে।

কোটলিন

val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
    setContentTitle("Picture Download")
    setContentText("Download in progress")
    setSmallIcon(R.drawable.ic_notification)
    setPriority(NotificationCompat.PRIORITY_LOW)
}
val PROGRESS_MAX = 100
val PROGRESS_CURRENT = 0
NotificationManagerCompat.from(this).apply {
    // Issue the initial notification with zero progress.
    builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false)
    notify(notificationId, builder.build())

    // Do the job that tracks the progress here.
    // Usually, this is in a worker thread.
    // To show progress, update PROGRESS_CURRENT and update the notification with:
    // builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
    // notificationManager.notify(notificationId, builder.build());

    // When done, update the notification once more to remove the progress bar.
    builder.setContentText("Download complete")
            .setProgress(0, 0, false)
    notify(notificationId, builder.build())
}

জাভা

...
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setContentTitle("Picture Download")
        .setContentText("Download in progress")
        .setSmallIcon(R.drawable.ic_notification)
        .setPriority(NotificationCompat.PRIORITY_LOW);

// Issue the initial notification with zero progress.
int PROGRESS_MAX = 100;
int PROGRESS_CURRENT = 0;
builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
notificationManager.notify(notificationId, builder.build());

// Do the job that tracks the progress here.
// Usually, this is in a worker thread.
// To show progress, update PROGRESS_CURRENT and update the notification with:
// builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
// notificationManager.notify(notificationId, builder.build());

// When done, update the notification once more to remove the progress bar.
builder.setContentText("Download complete")
        .setProgress(0,0,false);
notificationManager.notify(notificationId, builder.build());

অপারেশন শেষে, progress max সমান হতে হবে। অপারেশনটি সম্পন্ন হয়েছে বা এটি অপসারণ করতে আপনি অগ্রগতি বারটি ছেড়ে যেতে পারেন। উভয় ক্ষেত্রেই, অপারেশন সম্পূর্ণ হয়েছে তা দেখানোর জন্য বিজ্ঞপ্তি পাঠ্য আপডেট করুন। অগ্রগতি বার সরাতে, setProgress(0, 0, false) কল করুন।

একটি অনির্দিষ্ট অগ্রগতি বার প্রদর্শন করতে (একটি বার যা সম্পূর্ণতা শতাংশ নির্দেশ করে না), setProgress(0, 0, true) কল করুন। ফলাফল হল একটি সূচক যা পূর্ববর্তী অগ্রগতি বারের মতো একই শৈলী রয়েছে, এটি একটি অবিচ্ছিন্ন অ্যানিমেশন যা সম্পূর্ণতা নির্দেশ করে না। আপনি setProgress(0, 0, false) কল না করা পর্যন্ত অগ্রগতি অ্যানিমেশন চলে এবং তারপর কার্যকলাপ সূচকটি সরানোর জন্য বিজ্ঞপ্তি আপডেট করুন।

অপারেশন সম্পূর্ণ হয়েছে তা নির্দেশ করতে বিজ্ঞপ্তি পাঠ্য পরিবর্তন করতে ভুলবেন না।

একটি সিস্টেম-ব্যাপী বিভাগ সেট করুন

ব্যবহারকারী ডু নট ডিস্টার্ব মোড সক্ষম করলে প্রদত্ত বিজ্ঞপ্তির মাধ্যমে ব্যবহারকারীকে বিরক্ত করতে হবে কিনা তা নির্ধারণ করতে Android পূর্বনির্ধারিত সিস্টেম-ব্যাপী বিভাগগুলি ব্যবহার করে৷

যদি আপনার বিজ্ঞপ্তিটি NotificationCompat এ সংজ্ঞায়িত বিজ্ঞপ্তি বিভাগগুলির মধ্যে একটির মধ্যে পড়ে — যেমন CATEGORY_ALARM , CATEGORY_REMINDER , CATEGORY_EVENT , বা CATEGORY_CALL —সেটক্যাটেগরি setCategory() এ উপযুক্ত বিভাগ পাস করে এটিকে ঘোষণা করুন :

কোটলিন

var builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setCategory(NotificationCompat.CATEGORY_MESSAGE)

জাভা

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setCategory(NotificationCompat.CATEGORY_MESSAGE);

ডিভাইসটি বিরক্ত না করার ক্ষেত্রে আপনার বিজ্ঞপ্তি প্রদর্শনের বিষয়ে সিদ্ধান্ত নিতে সিস্টেমটি আপনার বিজ্ঞপ্তি বিভাগ সম্পর্কে এই তথ্য ব্যবহার করে। যাইহোক, আপনাকে একটি সিস্টেম-ব্যাপী বিভাগ সেট করতে হবে না। শুধুমাত্র যদি আপনার বিজ্ঞপ্তিগুলি NotificationCompat দ্বারা সংজ্ঞায়িত বিভাগগুলির একটির সাথে মেলে তবেই তা করুন৷

একটি জরুরী বার্তা দেখান

আপনার অ্যাপটিকে একটি জরুরি, সময়-সংবেদনশীল বার্তা প্রদর্শন করতে হতে পারে, যেমন একটি ইনকামিং ফোন কল বা একটি রিং বাজানো অ্যালার্ম৷ এই পরিস্থিতিতে, আপনি আপনার বিজ্ঞপ্তির সাথে একটি পূর্ণ-স্ক্রীন অভিপ্রায় যুক্ত করতে পারেন।

যখন বিজ্ঞপ্তিটি আহ্বান করা হয়, ব্যবহারকারীরা ডিভাইসের লক অবস্থার উপর নির্ভর করে নিম্নলিখিতগুলির মধ্যে একটি দেখতে পান:

  • ব্যবহারকারীর ডিভাইসটি লক করা থাকলে, একটি পূর্ণ-স্ক্রীন কার্যকলাপ প্রদর্শিত হবে, যা লকস্ক্রিনকে আচ্ছাদিত করে।
  • ব্যবহারকারীর ডিভাইসটি আনলক করা থাকলে, বিজ্ঞপ্তিটি একটি প্রসারিত আকারে প্রদর্শিত হয় যাতে বিজ্ঞপ্তিটি পরিচালনা বা খারিজ করার বিকল্পগুলি অন্তর্ভুক্ত থাকে।

নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে আপনার বিজ্ঞপ্তিকে একটি পূর্ণ-স্ক্রীন অভিপ্রায়ের সাথে সংযুক্ত করতে হয়:

কোটলিন

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)
        .setFullScreenIntent(fullScreenPendingIntent, true)

জাভা

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)
        .setFullScreenIntent(fullScreenPendingIntent, true);

লক স্ক্রীন দৃশ্যমানতা সেট করুন

লক স্ক্রীন থেকে বিজ্ঞপ্তিতে দৃশ্যমান বিশদ স্তর নিয়ন্ত্রণ করতে, setVisibility() কল করুন এবং নিম্নলিখিত মানগুলির মধ্যে একটি নির্দিষ্ট করুন:

  • VISIBILITY_PUBLIC : বিজ্ঞপ্তির সম্পূর্ণ বিষয়বস্তু লক স্ক্রিনে দেখায়৷

  • VISIBILITY_SECRET : বিজ্ঞপ্তির কোনো অংশ লক স্ক্রিনে দেখায় না।

  • VISIBILITY_PRIVATE : শুধুমাত্র প্রাথমিক তথ্য, যেমন বিজ্ঞপ্তির আইকন এবং বিষয়বস্তুর শিরোনাম, লক স্ক্রিনে দেখায়৷ বিজ্ঞপ্তির সম্পূর্ণ বিষয়বস্তু দেখা যাচ্ছে না।

আপনি যখন VISIBILITY_PRIVATE সেট করেন, তখন আপনি বিজ্ঞপ্তি সামগ্রীর একটি বিকল্প সংস্করণও প্রদান করতে পারেন যা নির্দিষ্ট বিশদ বিবরণ লুকিয়ে রাখে৷ উদাহরণস্বরূপ, একটি এসএমএস অ্যাপ একটি বিজ্ঞপ্তি প্রদর্শন করতে পারে যা দেখায় যে "আপনার কাছে 3টি নতুন পাঠ্য বার্তা রয়েছে" কিন্তু বার্তার বিষয়বস্তু এবং প্রেরকদের লুকিয়ে রাখে৷ এই বিকল্প বিজ্ঞপ্তি প্রদান করতে, প্রথমে স্বাভাবিক হিসাবে NotificationCompat.Builder দিয়ে বিকল্প বিজ্ঞপ্তি তৈরি করুন। তারপরে, setPublicVersion() দিয়ে স্বাভাবিক বিজ্ঞপ্তির সাথে বিকল্প বিজ্ঞপ্তি সংযুক্ত করুন।

মনে রাখবেন যে ব্যবহারকারীর সর্বদা তাদের বিজ্ঞপ্তিগুলি লক স্ক্রিনে দৃশ্যমান কিনা এবং আপনার অ্যাপের বিজ্ঞপ্তি চ্যানেলগুলির উপর ভিত্তি করে সেগুলি নিয়ন্ত্রণ করতে পারে কিনা তার উপর চূড়ান্ত নিয়ন্ত্রণ থাকে৷

একটি বিজ্ঞপ্তি আপডেট করুন

আপনি একটি বিজ্ঞপ্তি ইস্যু করার পরে এটি আপডেট করতে, NotificationManagerCompat.notify() আবার কল করুন, আপনি আগে যে আইডি ব্যবহার করেছিলেন সেটি পাস করে। পূর্ববর্তী বিজ্ঞপ্তি খারিজ হলে, পরিবর্তে একটি নতুন বিজ্ঞপ্তি তৈরি করা হয়।

আপনি ঐচ্ছিকভাবে setOnlyAlertOnce() কল করতে পারেন যাতে আপনার বিজ্ঞপ্তি ব্যবহারকারীকে বাধা দেয়—শব্দ, কম্পন, বা ভিজ্যুয়াল ক্লু দিয়ে—শুধুমাত্র প্রথমবার বিজ্ঞপ্তিটি প্রদর্শিত হয় এবং পরবর্তী আপডেটের জন্য নয়।

একটি বিজ্ঞপ্তি সরান

নিম্নলিখিতগুলির মধ্যে একটি না হওয়া পর্যন্ত বিজ্ঞপ্তিগুলি দৃশ্যমান থাকে:

  • ব্যবহারকারী বিজ্ঞপ্তি খারিজ.
  • আপনি বিজ্ঞপ্তি তৈরি করার সময় setAutoCancel() কল করলে ব্যবহারকারী বিজ্ঞপ্তিতে ট্যাপ করে।
  • আপনি একটি নির্দিষ্ট বিজ্ঞপ্তি আইডির জন্য cancel() কল করুন। এই পদ্ধতিটি চলমান বিজ্ঞপ্তিগুলিও মুছে দেয়।
  • আপনি cancelAll() কল করুন, যা আপনার পূর্বে জারি করা সমস্ত বিজ্ঞপ্তি সরিয়ে দেয়।
  • নির্দিষ্ট সময়কাল শেষ হয়ে যায়, যদি আপনি বিজ্ঞপ্তি তৈরি করার সময় একটি সময়সীমা সেট করেন, setTimeoutAfter() ব্যবহার করে। প্রয়োজন হলে, নির্দিষ্ট সময়সীমা শেষ হওয়ার আগে আপনি একটি বিজ্ঞপ্তি বাতিল করতে পারেন।

মেসেজিং অ্যাপের জন্য সেরা অনুশীলন

আপনার মেসেজিং এবং চ্যাট অ্যাপের জন্য বিজ্ঞপ্তি তৈরি করার সময় এখানে তালিকাভুক্ত সেরা অনুশীলনগুলি বিবেচনা করুন।

মেসেজিং স্টাইল ব্যবহার করুন

অ্যান্ড্রয়েড 7.0 (API লেভেল 24) থেকে শুরু করে, Android বিশেষভাবে মেসেজিং কন্টেন্টের জন্য একটি বিজ্ঞপ্তি শৈলী টেমপ্লেট প্রদান করে। 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();

Android 9.0 (API স্তর 28) থেকে শুরু করে, বিজ্ঞপ্তি এবং এর অবতারগুলির একটি সর্বোত্তম রেন্ডারিং পেতে Person শ্রেণীটি ব্যবহার করাও প্রয়োজন৷

NotificationCompat.MessagingStyle ব্যবহার করার সময়, নিম্নলিখিতগুলি করুন:

  • দুইজনের বেশি লোকের সাথে গ্রুপ চ্যাটের জন্য একটি শিরোনাম সেট করতে MessagingStyle.setConversationTitle() এ কল করুন। একটি ভাল কথোপকথনের শিরোনাম হতে পারে গ্রুপ চ্যাটের নাম বা, যদি এটির নাম না থাকে তবে কথোপকথনে অংশগ্রহণকারীদের একটি তালিকা। এটি ছাড়া, বার্তাটিকে কথোপকথনের সাম্প্রতিকতম বার্তা প্রেরকের সাথে এক-একটি কথোপকথনের অন্তর্গত বলে ভুল হতে পারে৷
  • ছবিগুলির মতো মিডিয়া বার্তাগুলি অন্তর্ভুক্ত করতে MessagingStyle.setData() পদ্ধতি ব্যবহার করুন৷ প্যাটার্ন ইমেজের MIME প্রকার/* সমর্থিত।

সরাসরি উত্তর ব্যবহার করুন

সরাসরি উত্তর একজন ব্যবহারকারীকে একটি বার্তার ইনলাইনে উত্তর দিতে দেয়।

  • একজন ব্যবহারকারী ইনলাইন উত্তর অ্যাকশনের সাথে উত্তর দেওয়ার পরে, MessagingStyle বিজ্ঞপ্তি আপডেট করতে MessagingStyle.addMessage() ব্যবহার করুন এবং বিজ্ঞপ্তিটি প্রত্যাহার বা বাতিল করবেন না। বিজ্ঞপ্তি বাতিল না করা ব্যবহারকারীকে বিজ্ঞপ্তি থেকে একাধিক উত্তর পাঠাতে দেয়।
  • ইনলাইন রিপ্লাই অ্যাকশনকে Wear OS-এর সাথে সামঞ্জস্যপূর্ণ করতে, Action.WearableExtender.setHintDisplayInlineAction(true) কল করুন।
  • বিজ্ঞপ্তিতে ঐতিহাসিক বার্তা যোগ করে সরাসরি উত্তর কথোপকথনের প্রসঙ্গ প্রদান করতে addHistoricMessage() পদ্ধতি ব্যবহার করুন।

স্মার্ট উত্তর সক্ষম করুন

  • স্মার্ট উত্তর সক্ষম করতে, উত্তর অ্যাকশনে setAllowGeneratedResponses(true) এ কল করুন। এটি একটি Wear OS ডিভাইসে বিজ্ঞপ্তিটি ব্রিজ করা হলে ব্যবহারকারীদের কাছে স্মার্ট উত্তরের প্রতিক্রিয়া উপলব্ধ করা হয়। NotificationCompat.MessagingStyle বিজ্ঞপ্তি দ্বারা প্রদত্ত প্রসঙ্গ ব্যবহার করে একটি সম্পূর্ণ অন-ওয়াচ মেশিন লার্নিং মডেলের মাধ্যমে স্মার্ট উত্তরের প্রতিক্রিয়া তৈরি করা হয় এবং প্রতিক্রিয়া তৈরি করতে ইন্টারনেটে কোনো ডেটা আপলোড করা হয় না।

বিজ্ঞপ্তি মেটাডেটা যোগ করুন

  • যখন ডিভাইসটি Do Not Disturb mode থাকে তখন কীভাবে আপনার অ্যাপের বিজ্ঞপ্তিগুলি পরিচালনা করবেন তা সিস্টেমকে জানাতে বিজ্ঞপ্তি মেটাডেটা বরাদ্দ করুন৷ উদাহরণস্বরূপ, বিরক্ত করবেন না ওভাররাইড করতে addPerson() বা setCategory(Notification.CATEGORY_MESSAGE) পদ্ধতি ব্যবহার করুন।
,

বিজ্ঞপ্তিগুলি আপনার অ্যাপের ইভেন্টগুলি সম্পর্কে সংক্ষিপ্ত, সময়োপযোগী তথ্য প্রদান করে যখন এটি ব্যবহার করা হয় না। এই নথিটি আপনাকে দেখায় কিভাবে বিভিন্ন বৈশিষ্ট্য সহ একটি বিজ্ঞপ্তি তৈরি করতে হয়। Android-এ বিজ্ঞপ্তিগুলি কীভাবে প্রদর্শিত হয় তার একটি ভূমিকার জন্য, বিজ্ঞপ্তিগুলির ওভারভিউ দেখুন৷ বিজ্ঞপ্তি ব্যবহার করে এমন নমুনা কোডের জন্য, GitHub-এ মানুষের নমুনা দেখুন।

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

AndroidX কোর লাইব্রেরি যোগ করুন

যদিও অ্যান্ড্রয়েড স্টুডিওর সাথে তৈরি বেশিরভাগ প্রকল্পে NotificationCompat ব্যবহার করার জন্য প্রয়োজনীয় নির্ভরতা রয়েছে, যাচাই করুন যে আপনার মডিউল-স্তরের build.gradle ফাইলে নিম্নলিখিত নির্ভরতা রয়েছে:

গ্রোভি

dependencies {
    implementation "androidx.core:core:2.2.0"
}

কোটলিন

dependencies {
    implementation("androidx.core:core-ktx:2.2.0")
}

একটি মৌলিক বিজ্ঞপ্তি তৈরি করুন

একটি বিজ্ঞপ্তি তার সবচেয়ে মৌলিক এবং কম্প্যাক্ট আকারে—এছাড়াও ভেঙে পড়া ফর্ম নামে পরিচিত—একটি আইকন, একটি শিরোনাম এবং অল্প পরিমাণ পাঠ্য সামগ্রী প্রদর্শন করে৷ এই বিভাগটি দেখায় কিভাবে একটি বিজ্ঞপ্তি তৈরি করতে হয় যা ব্যবহারকারী আপনার অ্যাপে একটি কার্যকলাপ চালু করতে ট্যাপ করতে পারে।

চিত্র 1. একটি আইকন, একটি শিরোনাম এবং কিছু পাঠ্য সহ একটি বিজ্ঞপ্তি৷

একটি বিজ্ঞপ্তির প্রতিটি অংশ সম্পর্কে আরও বিশদ বিবরণের জন্য, বিজ্ঞপ্তি শারীরস্থান সম্পর্কে পড়ুন।

রানটাইম অনুমতি ঘোষণা করুন

অ্যান্ড্রয়েড 13 (এপিআই লেভেল 33) এবং উচ্চতর কোনো অ্যাপ থেকে অ-মুক্ত (ফোরগ্রাউন্ড সার্ভিসেস (এফজিএস) সহ) বিজ্ঞপ্তি পোস্ট করার জন্য রানটাইম অনুমতি সমর্থন করে।

আপনার অ্যাপের ম্যানিফেস্ট ফাইলে আপনাকে যে অনুমতিটি ঘোষণা করতে হবে তা নিম্নলিখিত কোড স্নিপেটে প্রদর্শিত হবে:

<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) এবং পরবর্তী সংস্করণগুলির সাথে সামঞ্জস্যের জন্য প্রয়োজন, কিন্তু পূর্ববর্তী সংস্করণগুলি দ্বারা উপেক্ষা করা হয়৷

ডিফল্টরূপে, বিজ্ঞপ্তির পাঠ্য বিষয়বস্তু এক লাইনে ফিট করার জন্য ছাঁটাই করা হয়। আপনি একটি প্রসারণযোগ্য বিজ্ঞপ্তি তৈরি করে অতিরিক্ত তথ্য দেখাতে পারেন।

চিত্র 2. একটি সম্প্রসারণযোগ্য বিজ্ঞপ্তি এটির ভেঙে পড়া এবং প্রসারিত আকারে।

আপনি যদি আপনার বিজ্ঞপ্তিটি দীর্ঘতর করতে চান, আপনি 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...")
        .setStyle(NotificationCompat.BigTextStyle()
                .bigText("Much longer text that cannot fit one line..."))
        .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...")
        .setStyle(new NotificationCompat.BigTextStyle()
                .bigText("Much longer text that cannot fit one line..."))
        .setPriority(NotificationCompat.PRIORITY_DEFAULT);

একটি ইমেজ এবং মিডিয়া প্লেব্যাক কন্ট্রোল কিভাবে যোগ করতে হয় সহ অন্যান্য বড় বিজ্ঞপ্তি শৈলী সম্পর্কে আরও তথ্যের জন্য, একটি প্রসারণযোগ্য বিজ্ঞপ্তি তৈরি করুন দেখুন।

একটি চ্যানেল তৈরি করুন এবং গুরুত্ব নির্ধারণ করুন

আপনি Android 8.0 এবং পরবর্তীতে বিজ্ঞপ্তি বিতরণ করার আগে, createNotificationChannel()NotificationChannel এর একটি উদাহরণ পাস করে সিস্টেমের সাথে আপনার অ্যাপের বিজ্ঞপ্তি চ্যানেল নিবন্ধন করুন৷ নিম্নলিখিত কোডটি 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);
    }
}

কারণ Android 8.0 এবং পরবর্তীতে কোনো বিজ্ঞপ্তি পোস্ট করার আগে আপনাকে অবশ্যই বিজ্ঞপ্তি চ্যানেল তৈরি করতে হবে, আপনার অ্যাপ শুরু হওয়ার সাথে সাথে এই কোডটি কার্যকর করুন। এটি বারবার কল করা নিরাপদ, কারণ একটি বিদ্যমান বিজ্ঞপ্তি চ্যানেল তৈরি করা কোন কাজ করে না।

NotificationChannel কনস্ট্রাক্টরের জন্য একটি importance প্রয়োজন, NotificationManager ক্লাসের একটি ধ্রুবক ব্যবহার করে। এই প্যারামিটারটি এই চ্যানেলের অন্তর্গত যেকোন বিজ্ঞপ্তির জন্য ব্যবহারকারীকে কীভাবে বাধা দিতে হবে তা নির্ধারণ করে। Android 7.1 এবং তার আগের সংস্করণ সমর্থন করতে setPriority() দিয়ে অগ্রাধিকার সেট করুন, যেমনটি পূর্ববর্তী উদাহরণে দেখানো হয়েছে।

যদিও আপনাকে নিম্নলিখিত উদাহরণে দেখানো হিসাবে বিজ্ঞপ্তির গুরুত্ব বা অগ্রাধিকার সেট করতে হবে, সিস্টেমটি আপনি যে সতর্কতামূলক আচরণ পাবেন তার নিশ্চয়তা দেয় না। কিছু ক্ষেত্রে, সিস্টেম অন্যান্য কারণের উপর ভিত্তি করে গুরুত্বের স্তর পরিবর্তন করতে পারে এবং ব্যবহারকারী সর্বদা একটি প্রদত্ত চ্যানেলের জন্য গুরুত্বের স্তরটি পুনরায় সংজ্ঞায়িত করতে পারে।

বিভিন্ন স্তরের অর্থ কী সে সম্পর্কে আরও তথ্যের জন্য, বিজ্ঞপ্তির গুরুত্বের স্তরগুলি সম্পর্কে পড়ুন।

বিজ্ঞপ্তির ট্যাপ অ্যাকশন সেট করুন

প্রতিটি বিজ্ঞপ্তিকে অবশ্যই একটি ট্যাপে সাড়া দিতে হবে, সাধারণত আপনার অ্যাপে বিজ্ঞপ্তির সাথে সামঞ্জস্যপূর্ণ একটি কার্যকলাপ খুলতে। এটি করার জন্য, একটি PendingIntent অবজেক্টের সাথে সংজ্ঞায়িত একটি বিষয়বস্তু অভিপ্রায় উল্লেখ করুন এবং এটি setContentIntent() এ পাস করুন।

নিম্নলিখিত স্নিপেটটি দেখায় যে ব্যবহারকারী যখন বিজ্ঞপ্তিতে ট্যাপ করেন তখন একটি কার্যকলাপ খোলার জন্য একটি মৌলিক অভিপ্রায় তৈরি করতে হয়:

কোটলিন

// Create an explicit intent for an Activity in your app.
val intent = Intent(this, AlertDetails::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
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.
        .setContentIntent(pendingIntent)
        .setAutoCancel(true)

জাভা

// Create an explicit intent for an Activity in your app.
Intent intent = new Intent(this, AlertDetails.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
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.
        .setContentIntent(pendingIntent)
        .setAutoCancel(true);

এই কোডটি কল করে setAutoCancel() , যা ব্যবহারকারী যখন এটিতে ট্যাপ করে তখন স্বয়ংক্রিয়ভাবে বিজ্ঞপ্তিটি সরিয়ে দেয়

পূর্ববর্তী উদাহরণে দেখানো setFlags() পদ্ধতিটি ব্যবহারকারীর প্রত্যাশিত নেভিগেশন অভিজ্ঞতা সংরক্ষণ করে যখন তারা বিজ্ঞপ্তি ব্যবহার করে আপনার অ্যাপ খুলবে। আপনি যে ধরনের কার্যকলাপ শুরু করছেন তার উপর নির্ভর করে আপনি এটি ব্যবহার করতে চাইতে পারেন, যা নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:

  • বিজ্ঞপ্তির প্রতিক্রিয়ার জন্য একচেটিয়াভাবে বিদ্যমান একটি কার্যকলাপ। সাধারণ অ্যাপ ব্যবহারের সময় ব্যবহারকারীর এই ক্রিয়াকলাপে নেভিগেট করার কোনও কারণ নেই, তাই কার্যকলাপটি আপনার অ্যাপের বিদ্যমান টাস্ক এবং ব্যাক স্ট্যাকে যোগ করার পরিবর্তে একটি নতুন টাস্ক শুরু করে। এটি পূর্ববর্তী নমুনায় তৈরি অভিপ্রায়ের ধরন।

  • আপনার অ্যাপের নিয়মিত অ্যাপ প্রবাহে বিদ্যমান একটি কার্যকলাপ। এই ক্ষেত্রে, কার্যকলাপ শুরু করা একটি ব্যাক স্ট্যাক তৈরি করে যাতে ব্যাক এবং আপ বোতামগুলির জন্য ব্যবহারকারীর প্রত্যাশাগুলি সংরক্ষণ করা হয়।

আপনার বিজ্ঞপ্তির উদ্দেশ্য কনফিগার করার বিভিন্ন উপায় সম্পর্কে আরও জানতে, একটি বিজ্ঞপ্তি থেকে একটি কার্যকলাপ শুরু করুন দেখুন।

বিজ্ঞপ্তি দেখান

বিজ্ঞপ্তিটি প্রদর্শিত করতে, 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())
}

জাভা

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 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
   }
   // notificationId is a unique int for each notification that you must define.
   notify(NOTIFICATION_ID, builder.build())
}

আপনি NotificationManagerCompat.notify() এ পাস করা বিজ্ঞপ্তি আইডিটি সংরক্ষণ করুন, কারণ আপনি যখন বিজ্ঞপ্তি আপডেট করতে বা সরাতে চান তখন আপনার এটির প্রয়োজন হয়।

উপরন্তু, Android 13 এবং উচ্চতর সংস্করণে চলমান ডিভাইসগুলিতে প্রাথমিক বিজ্ঞপ্তিগুলি পরীক্ষা করার জন্য, ম্যানুয়ালি বিজ্ঞপ্তিগুলি চালু করুন বা বিজ্ঞপ্তিগুলির অনুরোধ করার জন্য একটি ডায়ালগ তৈরি করুন৷

অ্যাকশন বোতাম যোগ করুন

একটি বিজ্ঞপ্তি তিনটি অ্যাকশন বোতাম অফার করতে পারে যা ব্যবহারকারীকে দ্রুত প্রতিক্রিয়া জানাতে দেয়, যেমন একটি অনুস্মারক স্নুজ করা বা একটি পাঠ্য বার্তার উত্তর দিতে। কিন্তু ব্যবহারকারী যখন বিজ্ঞপ্তিতে ট্যাপ করে তখন এই অ্যাকশন বোতামগুলি সম্পাদিত অ্যাকশনের ডুপ্লিকেট করা উচিত নয়।

চিত্র 3. একটি অ্যাকশন বোতাম সহ একটি বিজ্ঞপ্তি।

একটি অ্যাকশন বোতাম যোগ করতে, addAction() পদ্ধতিতে একটি PendingIntent পাস করুন। এটি বিজ্ঞপ্তির ডিফল্ট ট্যাপ অ্যাকশন সেট আপ করার মতো, কোনও অ্যাক্টিভিটি চালু করার পরিবর্তে, আপনি অন্য কিছু করতে পারেন যেমন একটি BroadcastReceiver শুরু করা যা ব্যাকগ্রাউন্ডে একটি কাজ করে যাতে অ্যাকশনটি ইতিমধ্যে খোলা অ্যাপটিকে বাধা না দেয়।

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি দেখায় কিভাবে একটি নির্দিষ্ট রিসিভারকে একটি সম্প্রচার পাঠাতে হয়:

কোটলিন

val ACTION_SNOOZE = "snooze"

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)
val builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setContentIntent(pendingIntent)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent)

জাভা

String ACTION_SNOOZE = "snooze"

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);

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)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent);

ব্যাকগ্রাউন্ডের কাজ চালানোর জন্য একটি BroadcastReceiver তৈরি সম্পর্কে আরও তথ্যের জন্য, সম্প্রচার ওভারভিউ দেখুন।

আপনি যদি এর পরিবর্তে মিডিয়া প্লেব্যাক বোতামগুলির সাহায্যে একটি বিজ্ঞপ্তি তৈরি করার চেষ্টা করেন, যেমন ট্র্যাকগুলিকে বিরতি দেওয়া এবং এড়িয়ে যাওয়া, তাহলে মিডিয়া নিয়ন্ত্রণগুলির সাথে কীভাবে একটি বিজ্ঞপ্তি তৈরি করবেন তা দেখুন৷

একটি সরাসরি উত্তর কর্ম যোগ করুন

অ্যান্ড্রয়েড 7.0 (API লেভেল 24) এ প্রবর্তিত ডাইরেক্ট রিপ্লাই অ্যাকশন ব্যবহারকারীদের সরাসরি নোটিফিকেশনে টেক্সট লিখতে দেয়। টেক্সট তারপর একটি কার্যকলাপ খোলা ছাড়া আপনার অ্যাপে বিতরণ করা হয়. উদাহরণস্বরূপ, আপনি ব্যবহারকারীদের টেক্সট বার্তার উত্তর দিতে বা বিজ্ঞপ্তির মধ্যে থেকে টাস্ক তালিকা আপডেট করতে সরাসরি উত্তর ক্রিয়া ব্যবহার করতে পারেন।

চিত্র 4. "উত্তর দিন" বোতামটি আলতো চাপলে পাঠ্য ইনপুট খোলে।

সরাসরি উত্তর ক্রিয়াটি বিজ্ঞপ্তিতে একটি অতিরিক্ত বোতাম হিসাবে উপস্থিত হয় যা একটি পাঠ্য ইনপুট খোলে। যখন ব্যবহারকারী টাইপ করা শেষ করে, তখন সিস্টেমটি বিজ্ঞপ্তির ক্রিয়াকলাপের জন্য আপনার নির্দিষ্ট করা অভিপ্রায়ে পাঠ্য প্রতিক্রিয়া সংযুক্ত করে এবং আপনার অ্যাপে অভিপ্রায় পাঠায়।

উত্তর বোতাম যোগ করুন

সরাসরি উত্তর সমর্থন করে এমন একটি বিজ্ঞপ্তি ক্রিয়া তৈরি করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. RemoteInput.Builder এর একটি উদাহরণ তৈরি করুন যা আপনি আপনার বিজ্ঞপ্তি অ্যাকশনে যোগ করতে পারেন। এই ক্লাসের কনস্ট্রাক্টর একটি স্ট্রিং গ্রহণ করে যা সিস্টেম পাঠ্য ইনপুটের জন্য কী হিসাবে ব্যবহার করে। আপনার অ্যাপ পরে ইনপুটের পাঠ্য পুনরুদ্ধার করতে সেই কী ব্যবহার করে।

    কোটলিন

      // Key for the string that's delivered in the action's intent.
      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()
      }
      

    জাভা

      // Key for the string that's delivered in the action's intent.
      private static final String KEY_TEXT_REPLY = "key_text_reply";
    
      String replyLabel = getResources().getString(R.string.reply_label);
      RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
              .setLabel(replyLabel)
              .build();
      
  2. উত্তর কর্মের জন্য একটি PendingIntent তৈরি করুন।

    কোটলিন

      // Build a PendingIntent for the reply action to trigger.
      var replyPendingIntent: PendingIntent =
          PendingIntent.getBroadcast(applicationContext,
              conversation.getConversationId(),
              getMessageReplyIntent(conversation.getConversationId()),
              PendingIntent.FLAG_UPDATE_CURRENT)
      

    জাভা

      // Build a PendingIntent for the reply action to trigger.
      PendingIntent replyPendingIntent =
              PendingIntent.getBroadcast(getApplicationContext(),
                      conversation.getConversationId(),
                      getMessageReplyIntent(conversation.getConversationId()),
                      PendingIntent.FLAG_UPDATE_CURRENT);
      
  3. addRemoteInput() ব্যবহার করে একটি কর্মের সাথে RemoteInput অবজেক্ট সংযুক্ত করুন।

    কোটলিন

      // Create the reply action and add the remote input.
      var action: NotificationCompat.Action =
          NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
              getString(R.string.label), replyPendingIntent)
              .addRemoteInput(remoteInput)
              .build()
      

    জাভা

      // Create the reply action and add the remote input.
      NotificationCompat.Action action =
              new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
                      getString(R.string.label), replyPendingIntent)
                      .addRemoteInput(remoteInput)
                      .build();
      
  4. একটি বিজ্ঞপ্তিতে ক্রিয়াটি প্রয়োগ করুন এবং বিজ্ঞপ্তি জারি করুন।

    কোটলিন

      // Build the notification and add the action.
      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()
    
      // Issue the notification.
      with(NotificationManagerCompat.from(this)) {
          notificationManager.notify(notificationId, newMessageNotification)
      }
      

    জাভা

      // Build the notification and add the action.
      Notification newMessageNotification = new Notification.Builder(context, CHANNEL_ID)
              .setSmallIcon(R.drawable.ic_message)
              .setContentTitle(getString(R.string.title))
              .setContentText(getString(R.string.content))
              .addAction(action)
              .build();
    
      // Issue the notification.
      NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
      notificationManager.notify(notificationId, newMessageNotification);
      

সিস্টেমটি ব্যবহারকারীকে একটি প্রতিক্রিয়া ইনপুট করতে অনুরোধ করে যখন তারা বিজ্ঞপ্তি ক্রিয়া ট্রিগার করে, যেমন চিত্র 4 এ দেখানো হয়েছে।

উত্তর থেকে ব্যবহারকারীর ইনপুট পুনরুদ্ধার করুন

বিজ্ঞপ্তির উত্তর 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;
 }

আপনি পাঠ্যটি প্রক্রিয়া করার পরে, একই ID এবং ট্যাগ ব্যবহার করা হলে 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);

এই নতুন বিজ্ঞপ্তির সাথে কাজ করার সময়, প্রাপকের onReceive() পদ্ধতিতে পাস করা প্রসঙ্গটি ব্যবহার করুন।

setRemoteInputHistory() কল করে বিজ্ঞপ্তির নীচে উত্তর যোগ করুন। যাইহোক, আপনি যদি একটি মেসেজিং অ্যাপ তৈরি করেন, একটি মেসেজিং-স্টাইলের বিজ্ঞপ্তি তৈরি করুন এবং কথোপকথনে নতুন বার্তা যুক্ত করুন।

একটি বার্তাপ্রেরণ অ্যাপ্লিকেশন থেকে বিজ্ঞপ্তির জন্য আরও পরামর্শের জন্য, বার্তাপ্রেরণ অ্যাপ্লিকেশনগুলির জন্য সেরা অনুশীলন সম্পর্কে বিভাগটি দেখুন৷

একটি অগ্রগতি বার যোগ করুন

বিজ্ঞপ্তিতে একটি অ্যানিমেটেড অগ্রগতি সূচক অন্তর্ভুক্ত থাকতে পারে যা ব্যবহারকারীদের একটি চলমান অপারেশনের স্থিতি দেখায়।

চিত্র 5. একটি অপারেশন চলাকালীন অগ্রগতি বার।

আপনি যদি অনুমান করতে পারেন যে কোন সময়ে কতটা অপারেশন সম্পূর্ণ হয়েছে, তাহলে সূচকটির "নির্ধারিত" ফর্মটি ব্যবহার করুন - যেমন চিত্র 5-এ দেখানো হয়েছে - setProgress(max, progress, false) কল করে। প্রথম প্যারামিটারটি হল "সম্পূর্ণ" মানটি কী, যেমন 100৷ দ্বিতীয়টি হল কতটা সম্পূর্ণ৷ শেষটি নির্দেশ করে যে এটি একটি নির্ধারিত অগ্রগতি বার।

আপনার ক্রিয়াকলাপ এগিয়ে যাওয়ার সাথে সাথে, progress জন্য একটি আপডেট মান সহ setProgress(max, progress, false) ক্রমাগত কল করুন এবং বিজ্ঞপ্তিটি পুনরায় জারি করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে।

কোটলিন

val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
    setContentTitle("Picture Download")
    setContentText("Download in progress")
    setSmallIcon(R.drawable.ic_notification)
    setPriority(NotificationCompat.PRIORITY_LOW)
}
val PROGRESS_MAX = 100
val PROGRESS_CURRENT = 0
NotificationManagerCompat.from(this).apply {
    // Issue the initial notification with zero progress.
    builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false)
    notify(notificationId, builder.build())

    // Do the job that tracks the progress here.
    // Usually, this is in a worker thread.
    // To show progress, update PROGRESS_CURRENT and update the notification with:
    // builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
    // notificationManager.notify(notificationId, builder.build());

    // When done, update the notification once more to remove the progress bar.
    builder.setContentText("Download complete")
            .setProgress(0, 0, false)
    notify(notificationId, builder.build())
}

জাভা

...
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setContentTitle("Picture Download")
        .setContentText("Download in progress")
        .setSmallIcon(R.drawable.ic_notification)
        .setPriority(NotificationCompat.PRIORITY_LOW);

// Issue the initial notification with zero progress.
int PROGRESS_MAX = 100;
int PROGRESS_CURRENT = 0;
builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
notificationManager.notify(notificationId, builder.build());

// Do the job that tracks the progress here.
// Usually, this is in a worker thread.
// To show progress, update PROGRESS_CURRENT and update the notification with:
// builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
// notificationManager.notify(notificationId, builder.build());

// When done, update the notification once more to remove the progress bar.
builder.setContentText("Download complete")
        .setProgress(0,0,false);
notificationManager.notify(notificationId, builder.build());

অপারেশন শেষে, progress max সমান হতে হবে। অপারেশনটি সম্পন্ন হয়েছে বা এটি অপসারণ করতে আপনি অগ্রগতি বারটি ছেড়ে যেতে পারেন। উভয় ক্ষেত্রেই, অপারেশন সম্পূর্ণ হয়েছে তা দেখানোর জন্য বিজ্ঞপ্তি পাঠ্য আপডেট করুন। অগ্রগতি বার সরাতে, setProgress(0, 0, false) কল করুন।

একটি অনির্দিষ্ট অগ্রগতি বার প্রদর্শন করতে (একটি বার যা সম্পূর্ণতা শতাংশ নির্দেশ করে না), setProgress(0, 0, true) কল করুন। ফলাফল হল একটি সূচক যা পূর্ববর্তী অগ্রগতি বারের মতো একই শৈলী রয়েছে, এটি একটি অবিচ্ছিন্ন অ্যানিমেশন যা সম্পূর্ণতা নির্দেশ করে না। আপনি setProgress(0, 0, false) কল না করা পর্যন্ত অগ্রগতি অ্যানিমেশন চলে এবং তারপর কার্যকলাপ সূচকটি সরানোর জন্য বিজ্ঞপ্তি আপডেট করুন।

অপারেশন সম্পূর্ণ হয়েছে তা নির্দেশ করতে বিজ্ঞপ্তি পাঠ্য পরিবর্তন করতে ভুলবেন না।

একটি সিস্টেম-ব্যাপী বিভাগ সেট করুন

ব্যবহারকারী ডু নট ডিস্টার্ব মোড সক্ষম করলে প্রদত্ত বিজ্ঞপ্তির মাধ্যমে ব্যবহারকারীকে বিরক্ত করতে হবে কিনা তা নির্ধারণ করতে Android পূর্বনির্ধারিত সিস্টেম-ব্যাপী বিভাগগুলি ব্যবহার করে৷

যদি আপনার বিজ্ঞপ্তিটি NotificationCompat এ সংজ্ঞায়িত বিজ্ঞপ্তি বিভাগগুলির মধ্যে একটির মধ্যে পড়ে — যেমন CATEGORY_ALARM , CATEGORY_REMINDER , CATEGORY_EVENT , বা CATEGORY_CALL —সেটক্যাটেগরি setCategory() এ উপযুক্ত বিভাগ পাস করে এটিকে ঘোষণা করুন :

কোটলিন

var builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setCategory(NotificationCompat.CATEGORY_MESSAGE)

জাভা

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setCategory(NotificationCompat.CATEGORY_MESSAGE);

ডিভাইসটি বিরক্ত না করার ক্ষেত্রে আপনার বিজ্ঞপ্তি প্রদর্শনের বিষয়ে সিদ্ধান্ত নিতে সিস্টেমটি আপনার বিজ্ঞপ্তি বিভাগ সম্পর্কে এই তথ্য ব্যবহার করে। যাইহোক, আপনাকে একটি সিস্টেম-ব্যাপী বিভাগ সেট করতে হবে না। শুধুমাত্র যদি আপনার বিজ্ঞপ্তিগুলি NotificationCompat দ্বারা সংজ্ঞায়িত বিভাগগুলির একটির সাথে মেলে তবেই তা করুন৷

একটি জরুরী বার্তা দেখান

আপনার অ্যাপটিকে একটি জরুরি, সময়-সংবেদনশীল বার্তা প্রদর্শন করতে হতে পারে, যেমন একটি ইনকামিং ফোন কল বা একটি রিং বাজানো অ্যালার্ম৷ এই পরিস্থিতিতে, আপনি আপনার বিজ্ঞপ্তির সাথে একটি পূর্ণ-স্ক্রীন অভিপ্রায় যুক্ত করতে পারেন।

যখন বিজ্ঞপ্তিটি আহ্বান করা হয়, ব্যবহারকারীরা ডিভাইসের লক অবস্থার উপর নির্ভর করে নিম্নলিখিতগুলির মধ্যে একটি দেখতে পান:

  • ব্যবহারকারীর ডিভাইসটি লক করা থাকলে, একটি পূর্ণ-স্ক্রীন কার্যকলাপ প্রদর্শিত হবে, যা লকস্ক্রিনকে আচ্ছাদিত করে।
  • ব্যবহারকারীর ডিভাইসটি আনলক করা থাকলে, বিজ্ঞপ্তিটি একটি প্রসারিত আকারে প্রদর্শিত হয় যাতে বিজ্ঞপ্তিটি পরিচালনা বা খারিজ করার বিকল্পগুলি অন্তর্ভুক্ত থাকে।

নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে আপনার বিজ্ঞপ্তিকে একটি পূর্ণ-স্ক্রীন অভিপ্রায়ের সাথে সংযুক্ত করতে হয়:

কোটলিন

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)
        .setFullScreenIntent(fullScreenPendingIntent, true)

জাভা

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)
        .setFullScreenIntent(fullScreenPendingIntent, true);

লক স্ক্রীন দৃশ্যমানতা সেট করুন

লক স্ক্রীন থেকে বিজ্ঞপ্তিতে দৃশ্যমান বিশদ স্তর নিয়ন্ত্রণ করতে, setVisibility() কল করুন এবং নিম্নলিখিত মানগুলির মধ্যে একটি নির্দিষ্ট করুন:

  • VISIBILITY_PUBLIC : বিজ্ঞপ্তির সম্পূর্ণ বিষয়বস্তু লক স্ক্রিনে দেখায়৷

  • VISIBILITY_SECRET : বিজ্ঞপ্তির কোনো অংশ লক স্ক্রিনে দেখায় না।

  • VISIBILITY_PRIVATE : শুধুমাত্র প্রাথমিক তথ্য, যেমন বিজ্ঞপ্তির আইকন এবং বিষয়বস্তুর শিরোনাম, লক স্ক্রিনে দেখায়৷ বিজ্ঞপ্তির সম্পূর্ণ বিষয়বস্তু দেখা যাচ্ছে না।

আপনি যখন VISIBILITY_PRIVATE সেট করেন, তখন আপনি বিজ্ঞপ্তি সামগ্রীর একটি বিকল্প সংস্করণও প্রদান করতে পারেন যা নির্দিষ্ট বিশদ বিবরণ লুকিয়ে রাখে৷ উদাহরণস্বরূপ, একটি এসএমএস অ্যাপ একটি বিজ্ঞপ্তি প্রদর্শন করতে পারে যা দেখায় যে "আপনার কাছে 3টি নতুন পাঠ্য বার্তা রয়েছে" কিন্তু বার্তার বিষয়বস্তু এবং প্রেরকদের লুকিয়ে রাখে৷ এই বিকল্প বিজ্ঞপ্তি প্রদান করতে, প্রথমে স্বাভাবিক হিসাবে NotificationCompat.Builder দিয়ে বিকল্প বিজ্ঞপ্তি তৈরি করুন। তারপরে, setPublicVersion() দিয়ে স্বাভাবিক বিজ্ঞপ্তির সাথে বিকল্প বিজ্ঞপ্তি সংযুক্ত করুন।

মনে রাখবেন যে ব্যবহারকারীর সর্বদা তাদের বিজ্ঞপ্তিগুলি লক স্ক্রিনে দৃশ্যমান কিনা এবং আপনার অ্যাপের বিজ্ঞপ্তি চ্যানেলগুলির উপর ভিত্তি করে সেগুলি নিয়ন্ত্রণ করতে পারে কিনা তার উপর চূড়ান্ত নিয়ন্ত্রণ থাকে৷

একটি বিজ্ঞপ্তি আপডেট করুন

আপনি একটি বিজ্ঞপ্তি ইস্যু করার পরে এটি আপডেট করতে, NotificationManagerCompat.notify() আবার কল করুন, আপনি আগে যে আইডি ব্যবহার করেছিলেন সেটি পাস করে। পূর্ববর্তী বিজ্ঞপ্তি খারিজ হলে, পরিবর্তে একটি নতুন বিজ্ঞপ্তি তৈরি করা হয়।

আপনি ঐচ্ছিকভাবে setOnlyAlertOnce() কল করতে পারেন যাতে আপনার বিজ্ঞপ্তি ব্যবহারকারীকে বাধা দেয়—শব্দ, কম্পন, বা ভিজ্যুয়াল ক্লু দিয়ে—শুধুমাত্র প্রথমবার বিজ্ঞপ্তিটি প্রদর্শিত হয় এবং পরবর্তী আপডেটের জন্য নয়।

একটি বিজ্ঞপ্তি সরান

নিম্নলিখিতগুলির মধ্যে একটি না হওয়া পর্যন্ত বিজ্ঞপ্তিগুলি দৃশ্যমান থাকে:

  • ব্যবহারকারী বিজ্ঞপ্তি খারিজ.
  • আপনি বিজ্ঞপ্তি তৈরি করার সময় setAutoCancel() কল করলে ব্যবহারকারী বিজ্ঞপ্তিতে ট্যাপ করে।
  • আপনি একটি নির্দিষ্ট বিজ্ঞপ্তি আইডির জন্য cancel() কল করুন। এই পদ্ধতিটি চলমান বিজ্ঞপ্তিগুলিও মুছে দেয়।
  • আপনি cancelAll() কল করুন, যা আপনার পূর্বে জারি করা সমস্ত বিজ্ঞপ্তি সরিয়ে দেয়।
  • নির্দিষ্ট সময়কাল শেষ হয়ে যায়, যদি আপনি বিজ্ঞপ্তি তৈরি করার সময় একটি সময়সীমা সেট করেন, setTimeoutAfter() ব্যবহার করে। প্রয়োজন হলে, নির্দিষ্ট সময়সীমা শেষ হওয়ার আগে আপনি একটি বিজ্ঞপ্তি বাতিল করতে পারেন।

মেসেজিং অ্যাপের জন্য সেরা অনুশীলন

আপনার মেসেজিং এবং চ্যাট অ্যাপের জন্য বিজ্ঞপ্তি তৈরি করার সময় এখানে তালিকাভুক্ত সেরা অনুশীলনগুলি বিবেচনা করুন।

মেসেজিং স্টাইল ব্যবহার করুন

অ্যান্ড্রয়েড 7.0 (API লেভেল 24) থেকে শুরু করে, Android বিশেষভাবে মেসেজিং কন্টেন্টের জন্য একটি বিজ্ঞপ্তি শৈলী টেমপ্লেট প্রদান করে। 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();

Android 9.0 (API স্তর 28) থেকে শুরু করে, বিজ্ঞপ্তি এবং এর অবতারগুলির একটি সর্বোত্তম রেন্ডারিং পেতে Person শ্রেণীটি ব্যবহার করাও প্রয়োজন৷

NotificationCompat.MessagingStyle ব্যবহার করার সময়, নিম্নলিখিতগুলি করুন:

  • দুইজনের বেশি লোকের সাথে গ্রুপ চ্যাটের জন্য একটি শিরোনাম সেট করতে MessagingStyle.setConversationTitle() এ কল করুন। একটি ভাল কথোপকথনের শিরোনাম হতে পারে গ্রুপ চ্যাটের নাম বা, যদি এটির নাম না থাকে তবে কথোপকথনে অংশগ্রহণকারীদের একটি তালিকা। এটি ছাড়া, বার্তাটিকে কথোপকথনের সাম্প্রতিকতম বার্তা প্রেরকের সাথে এক-একটি কথোপকথনের অন্তর্গত বলে ভুল হতে পারে৷
  • ছবিগুলির মতো মিডিয়া বার্তাগুলি অন্তর্ভুক্ত করতে MessagingStyle.setData() পদ্ধতি ব্যবহার করুন৷ প্যাটার্ন ইমেজের MIME প্রকার/* সমর্থিত।

সরাসরি উত্তর ব্যবহার করুন

সরাসরি উত্তর একজন ব্যবহারকারীকে একটি বার্তার ইনলাইনে উত্তর দিতে দেয়।

  • একজন ব্যবহারকারী ইনলাইন উত্তর অ্যাকশনের সাথে উত্তর দেওয়ার পরে, MessagingStyle বিজ্ঞপ্তি আপডেট করতে MessagingStyle.addMessage() ব্যবহার করুন এবং বিজ্ঞপ্তিটি প্রত্যাহার বা বাতিল করবেন না। বিজ্ঞপ্তি বাতিল না করা ব্যবহারকারীকে বিজ্ঞপ্তি থেকে একাধিক উত্তর পাঠাতে দেয়।
  • ইনলাইন রিপ্লাই অ্যাকশনকে Wear OS-এর সাথে সামঞ্জস্যপূর্ণ করতে, Action.WearableExtender.setHintDisplayInlineAction(true) কল করুন।
  • বিজ্ঞপ্তিতে ঐতিহাসিক বার্তা যোগ করে সরাসরি উত্তর কথোপকথনের প্রসঙ্গ প্রদান করতে addHistoricMessage() পদ্ধতি ব্যবহার করুন।

স্মার্ট উত্তর সক্ষম করুন

  • স্মার্ট উত্তর সক্ষম করতে, উত্তর অ্যাকশনে setAllowGeneratedResponses(true) এ কল করুন। এটি একটি Wear OS ডিভাইসে বিজ্ঞপ্তিটি ব্রিজ করা হলে ব্যবহারকারীদের কাছে স্মার্ট উত্তরের প্রতিক্রিয়া উপলব্ধ করা হয়। NotificationCompat.MessagingStyle বিজ্ঞপ্তি দ্বারা প্রদত্ত প্রসঙ্গ ব্যবহার করে একটি সম্পূর্ণ অন-ওয়াচ মেশিন লার্নিং মডেলের মাধ্যমে স্মার্ট উত্তরের প্রতিক্রিয়া তৈরি করা হয় এবং প্রতিক্রিয়া তৈরি করতে ইন্টারনেটে কোনো ডেটা আপলোড করা হয় না।

বিজ্ঞপ্তি মেটাডেটা যোগ করুন

  • যখন ডিভাইসটি Do Not Disturb mode থাকে তখন কীভাবে আপনার অ্যাপের বিজ্ঞপ্তিগুলি পরিচালনা করবেন তা সিস্টেমকে জানাতে বিজ্ঞপ্তি মেটাডেটা বরাদ্দ করুন৷ উদাহরণস্বরূপ, বিরক্ত করবেন না ওভাররাইড করতে addPerson() বা setCategory(Notification.CATEGORY_MESSAGE) পদ্ধতি ব্যবহার করুন।