सूचनाओं से आपके ऐप्लिकेशन में होने वाले इवेंट के बारे में, कम समय में कम समय में जानकारी दी जाती है. हालांकि, ऐसा तब होता है, जब इवेंट का इस्तेमाल न किया जा रहा हो. इस दस्तावेज़ में अलग-अलग सुविधाओं के साथ सूचना बनाने का तरीका बताया गया है. Android पर सूचनाएं दिखने के तरीके के बारे में जानने के लिए, सूचनाओं की खास जानकारी देखें. सूचनाओं का इस्तेमाल करने वाले सैंपल कोड के लिए, GitHub पर People sample देखें.
इस पेज पर मौजूद कोड, AndroidX लाइब्रेरी के NotificationCompat
एपीआई का इस्तेमाल करता है. इन एपीआई की मदद से, Android के नए वर्शन में ही उपलब्ध सुविधाएं जोड़ी जा सकती हैं. साथ ही, ये Android 9 (एपीआई लेवल 28) के साथ भी काम करते हैं. हालांकि, इनलाइन जवाब की कार्रवाई जैसी कुछ सुविधाओं की वजह से, पुराने वर्शन पर कोई कार्रवाई नहीं की जाती.
AndroidX कोर लाइब्रेरी जोड़ना
Android Studio में बनाए गए ज़्यादातर प्रोजेक्ट में, NotificationCompat
का इस्तेमाल करने के लिए ज़रूरी डिपेंडेंसी शामिल होती हैं. हालांकि, पक्का करें कि आपके मॉड्यूल-लेवल की build.gradle
फ़ाइल में यह डिपेंडेंसी शामिल हो:
Groovy
dependencies { implementation "androidx.core:core:2.2.0" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:2.2.0") }
बुनियादी सूचना बनाना
अपने सबसे सामान्य और संक्षिप्त रूप में मिलने वाली सूचना—जिसे छोटा किया गया फ़ॉर्म भी कहा जाता है—इसमें आइकॉन, शीर्षक, और कुछ टेक्स्ट कॉन्टेंट दिखता है. इस सेक्शन में, ऐसी सूचना बनाने का तरीका बताया गया है जिस पर टैप करके उपयोगकर्ता आपके ऐप्लिकेशन में कोई गतिविधि शुरू कर सके.
किसी सूचना के हर हिस्से के बारे में ज़्यादा जानकारी के लिए, सूचना के बारे में अलग-अलग जानकारी पढ़ें.
रनटाइम की अनुमति का एलान करना
Android 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 और उसके बाद के वर्शन के लिए, चैनल की अहमियत को अगले सेक्शन में दिखाए गए तरीके से सेट करें.
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle(textTitle) .setContentText(textContent) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
Java
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 (एपीआई लेवल 26) और उसके बाद के वर्शन के साथ काम करने के लिए ज़रूरी है. हालांकि, यह सुविधा Android के पुराने वर्शन पर काम नहीं करती.
डिफ़ॉल्ट रूप से, सूचना के टेक्स्ट कॉन्टेंट को एक लाइन में फ़िट करने के लिए छोटा कर दिया जाता है. बड़ी की जा सकने वाली सूचना बनाकर, ज़्यादा जानकारी दिखाई जा सकती है.
अगर आपको अपनी सूचना लंबी करनी है, तो setStyle()
के साथ स्टाइल टेंप्लेट जोड़कर, बड़ा किए जा सकने वाली सूचना चालू की जा सकती है.
उदाहरण के लिए, नीचे दिया गया कोड, टेक्स्ट एरिया का बड़ा हिस्सा बनाता है:
Kotlin
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)
Java
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 और उसके बाद के वर्शन पर सूचना डिलीवर करने से पहले, NotificationChannel
को createNotificationChannel()
पर एक इंस्टेंस पास करके, अपने ऐप्लिकेशन के सूचना चैनल को सिस्टम के साथ रजिस्टर करें.
नीचे दिया गया कोड, SDK_INT
वर्शन पर लागू होने वाली शर्त की वजह से ब्लॉक किया गया है:
Kotlin
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) } }
Java
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()
के साथ priority सेट करें. जैसा कि पिछले उदाहरण में दिखाया गया है.
हालांकि, यहां दिए गए उदाहरण के मुताबिक, आपको सूचना की अहमियत या प्राथमिकता सेट करनी होगी. हालांकि, सिस्टम आपको मिलने वाली सूचना के व्यवहार की गारंटी नहीं देता. कुछ मामलों में, सिस्टम अन्य फ़ैक्टर के आधार पर अहमियत का लेवल बदल सकता है. साथ ही, उपयोगकर्ता किसी चैनल के लिए अहमियत का लेवल कभी भी फिर से तय कर सकता है.
अलग-अलग लेवल के मतलब के बारे में ज़्यादा जानने के लिए, सूचना के अहमियत के लेवल के बारे में पढ़ें.
सूचना पर टैप करने पर होने वाली कार्रवाई सेट करना
हर सूचना को एक टैप का जवाब देना होगा. आम तौर पर, ऐसा आपके ऐप्लिकेशन में उस गतिविधि को खोलने के लिए होता है जो सूचना से जुड़ी होती है. ऐसा करने के लिए, PendingIntent
ऑब्जेक्ट के साथ तय किया गया कॉन्टेंट इंटेंट तय करें और उसे setContentIntent()
को पास करें.
नीचे दिए गए स्निपेट में, उपयोगकर्ता के सूचना पर टैप करने पर कोई गतिविधि खोलने के लिए बुनियादी इंटेंट बनाने का तरीका बताया गया है:
Kotlin
// 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)
Java
// 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()
का नतीजा दें.
यह नीचे दिए गए उदाहरण में दिखाया गया है:
Kotlin
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()) }
Java
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 और इसके बाद के वर्शन पर चल रहे डिवाइसों पर बुनियादी सूचनाओं की जांच करने के लिए, सूचनाएं मैन्युअल तरीके से चालू करें या सूचनाओं का अनुरोध करने के लिए डायलॉग बॉक्स बनाएं.
ऐक्शन बटन जोड़ना
किसी सूचना में ज़्यादा से ज़्यादा तीन ऐक्शन बटन हो सकते हैं. इनकी मदद से, उपयोगकर्ता तुरंत जवाब दे सकता है. जैसे, रिमाइंडर को स्नूज़ करना या किसी मैसेज का जवाब देना. हालांकि, इन ऐक्शन बटन से सूचना पर टैप करने पर की जाने वाली कार्रवाई का डुप्लीकेट नहीं होना चाहिए.
ऐक्शन बटन जोड़ने के लिए, addAction()
के तरीके में PendingIntent
पास करें. यह सूचना पर टैप करने की डिफ़ॉल्ट कार्रवाई सेट अप करने जैसा ही है. हालांकि, इसमें किसी गतिविधि को लॉन्च करने के बजाय, कुछ और काम किए जा सकते हैं. जैसे, कोई ऐसा BroadcastReceiver
शुरू करना जो बैकग्राउंड में काम करता है, ताकि कार्रवाई से पहले से खुले ऐप्लिकेशन में रुकावट न आए.
उदाहरण के लिए, नीचे दिए गए कोड में किसी खास रिसीवर को ब्रॉडकास्ट भेजने का तरीका बताया गया है:
Kotlin
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)
Java
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
बनाने के बारे में ज़्यादा जानकारी के लिए, ब्रॉडकास्ट की खास जानकारी देखें.
अगर आपको ट्रैक को रोकने या स्किप करने जैसे मीडिया प्लेबैक बटन का इस्तेमाल करके सूचना बनानी है, तो मीडिया कंट्रोल की मदद से सूचना बनाने का तरीका देखें.
सीधे जवाब देने की कार्रवाई जोड़ें
Android 7.0 (एपीआई लेवल 24) में शुरू की गई, सीधे जवाब देने की कार्रवाई की मदद से उपयोगकर्ता, सीधे सूचना में टेक्स्ट डाल सकते हैं. इसके बाद, टेक्स्ट को किसी गतिविधि को खोले बिना आपके ऐप्लिकेशन पर डिलीवर किया जाता है. उदाहरण के लिए, सीधे जवाब देने की सुविधा का इस्तेमाल करके, उपयोगकर्ताओं को सूचना में ही टेक्स्ट मैसेज का जवाब देने या टास्क की सूचियों को अपडेट करने की अनुमति दी जा सकती है.
सीधे जवाब देने की सुविधा, सूचना में एक अतिरिक्त बटन के तौर पर दिखती है. इस बटन पर क्लिक करने से, टेक्स्ट इनपुट बॉक्स खुलता है. जब उपयोगकर्ता टाइप करना बंद कर देता है, तो सिस्टम उस टेक्स्ट रिस्पॉन्स को, सूचना ऐक्शन के लिए तय किए गए इंटेंट से जोड़ देता है. साथ ही, उस इंटेंट को आपके ऐप्लिकेशन पर भेज देता है.
'जवाब दें' बटन जोड़ें
सीधे जवाब देने की सुविधा वाली सूचना कार्रवाई बनाने के लिए, यह तरीका अपनाएं:
RemoteInput.Builder
का एक इंस्टेंस बनाएं, जिसे सूचना ऐक्शन में जोड़ा जा सकता है. इस क्लास का कंस्ट्रक्टर, ऐसी स्ट्रिंग को स्वीकार करता है जिसका इस्तेमाल सिस्टम, टेक्स्ट इनपुट के लिए कुंजी के तौर पर करता है. आपका ऐप्लिकेशन बाद में, इनपुट के टेक्स्ट को वापस पाने के लिए उस कुंजी का इस्तेमाल करता है.Kotlin
// 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() }
Java
// 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();
- जवाब देने से जुड़ी कार्रवाई के लिए,
PendingIntent
बनाएं.Kotlin
// Build a PendingIntent for the reply action to trigger. var replyPendingIntent: PendingIntent = PendingIntent.getBroadcast(applicationContext, conversation.getConversationId(), getMessageReplyIntent(conversation.getConversationId()), PendingIntent.FLAG_UPDATE_CURRENT)
Java
// Build a PendingIntent for the reply action to trigger. PendingIntent replyPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), conversation.getConversationId(), getMessageReplyIntent(conversation.getConversationId()), PendingIntent.FLAG_UPDATE_CURRENT);
addRemoteInput()
का इस्तेमाल करके,RemoteInput
ऑब्जेक्ट को किसी ऐक्शन से अटैच करें.Kotlin
// 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()
Java
// 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();
- सूचना पर कार्रवाई लागू करें और सूचना जारी करें.
Kotlin
// 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) }
Java
// 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);
जब उपयोगकर्ता सूचना ऐक्शन को ट्रिगर करता है, तो सिस्टम उसे जवाब देने के लिए कहता है, जैसा कि चौथी इमेज में दिखाया गया है.
जवाब से उपयोगकर्ता का इनपुट फिर से पाएं
सूचना के जवाब वाले यूज़र इंटरफ़ेस (यूआई) से उपयोगकर्ता का इनपुट पाने के लिए, RemoteInput.getResultsFromIntent()
को कॉल करें. साथ ही, BroadcastReceiver
से मिला Intent
पास करें:
Kotlin
private fun getMessageText(intent: Intent): CharSequence? { return RemoteInput.getResultsFromIntent(intent)?.getCharSequence(KEY_TEXT_REPLY) }
Java
private CharSequence getMessageText(Intent intent) { Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); if (remoteInput != null) { return remoteInput.getCharSequence(KEY_TEXT_REPLY); } return null; }
टेक्स्ट को प्रोसेस करने के बाद, सूचना को अपडेट करें. इसके लिए, उसी आईडी और टैग के साथ NotificationManagerCompat.notify()
को कॉल करें जिसका इस्तेमाल किया गया है. सीधे जवाब देने की सुविधा का यूज़र इंटरफ़ेस (यूआई) छिपाने और उपयोगकर्ता को यह बताने के लिए यह ज़रूरी है कि उसका जवाब मिल गया है और उसे सही तरीके से प्रोसेस किया जा रहा है.
Kotlin
// 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) }
Java
// 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()
को कॉल करके, जवाब को सूचना के सबसे नीचे जोड़ें.
हालांकि, अगर कोई मैसेजिंग ऐप्लिकेशन बनाया जा रहा है, तो मैसेजिंग स्टाइल वाली सूचना बनाएं और बातचीत में नया मैसेज जोड़ें.
मैसेजिंग ऐप्लिकेशन से सूचनाएं पाने के बारे में ज़्यादा सलाह पाने के लिए, मैसेजिंग ऐप्लिकेशन के लिए सबसे सही तरीके सेक्शन देखें.
प्रोग्रेस बार जोड़ना
सूचनाओं में, कार्रवाई की स्थिति दिखाने वाला ऐनिमेटेड इंडिकेटर शामिल हो सकता है. इससे, उपयोगकर्ताओं को पता चलता है कि फ़िलहाल कोई कार्रवाई चल रही है या नहीं.
किसी भी समय यह अनुमान लगाने के लिए कि कितनी कार्रवाई पूरी हो चुकी है, इंंडिकेटर के "तय करें" फ़ॉर्म का इस्तेमाल करें. यह फ़ॉर्म, पांचवीं इमेज में दिखाया गया है. इसके लिए, setProgress(max, progress,
false)
को कॉल करें.
पहले पैरामीटर में "complete" वैल्यू होती है, जैसे कि 100. दूसरा, कितनी जानकारी पूरी हो गई है. आखिरी से पता चलता है कि यह एक तय प्रोग्रेस बार है.
जैसे-जैसे आपका ऑपरेशन आगे बढ़ता है, progress
की अपडेट की गई वैल्यू के साथ setProgress(max, progress,
false)
को लगातार कॉल करें और सूचना फिर से जारी करें, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है.
Kotlin
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()) }
Java
... 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()
को सही कैटगरी भेजकर, इसकी जानकारी दें:
Kotlin
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)
Java
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
में बताई गई किसी कैटगरी से मैच करती हों.
ज़रूरी मैसेज दिखाना
आपके ऐप्लिकेशन को ज़रूरी और समय-सीमा से जुड़ा मैसेज दिखाना पड़ सकता है. जैसे, आने वाला फ़ोन कॉल या बजता हुआ अलार्म. ऐसे मामलों में, अपनी सूचना के साथ फ़ुल-स्क्रीन इंटेंट जोड़ा जा सकता है.
जब सूचना शुरू की जाती है, तो डिवाइस के लॉक की स्थिति के आधार पर, उपयोगकर्ताओं को इनमें से कोई एक चीज़ दिखती है:
- अगर उपयोगकर्ता का डिवाइस लॉक है, तो लॉकस्क्रीन को एक फ़ुल-स्क्रीन पर दिखने वाली गतिविधि दिखेगी.
- अगर उपयोगकर्ता का डिवाइस अनलॉक है, तो सूचना बड़े किए गए फ़ॉर्मैट में दिखती है. इसमें सूचना को मैनेज करने या खारिज करने के विकल्प होते हैं.
यहां दिए गए कोड स्निपेट में, सूचना को फ़ुल-स्क्रीन इंटेंट से जोड़ने का तरीका बताया गया है:
Kotlin
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)
Java
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
को सेट करने पर, आपको सूचना वाले कॉन्टेंट का ऐसा दूसरा वर्शन भी दिया जा सकता है जिसमें कुछ जानकारी छिपी होती है. उदाहरण के लिए, एसएमएस ऐप्लिकेशन में "आपके पास तीन नए मैसेज हैं" वाली सूचना दिख सकती है. हालांकि, इसमें मैसेज का कॉन्टेंट और मैसेज भेजने वाले का नाम नहीं दिखता. यह वैकल्पिक सूचना देने के लिए, पहले NotificationCompat.Builder
के साथ वैकल्पिक सूचना बनाएं. इसके बाद, setPublicVersion()
का इस्तेमाल करके, सामान्य सूचना के साथ वैकल्पिक सूचना अटैच करें.
ध्यान रखें कि उपयोगकर्ता के पास यह कंट्रोल करने का विकल्प होता है कि उसकी सूचनाएं लॉक स्क्रीन पर दिखें या नहीं. साथ ही, वह आपके ऐप्लिकेशन के सूचना चैनलों के आधार पर भी उन्हें कंट्रोल कर सकता है.
सूचना अपडेट करना
कोई सूचना जारी करने के बाद उसे अपडेट करने के लिए, NotificationManagerCompat.notify()
पर दोबारा कॉल करें. साथ ही, उसे वही आईडी दें जिसे आपने पहले इस्तेमाल किया था. अगर पिछली सूचना खारिज कर दी जाती है, तो उसकी जगह एक नई सूचना बनाई जाती है.
आपके पास setOnlyAlertOnce()
को कॉल करने का विकल्प है, ताकि सूचना पहली बार दिखने पर ही उपयोगकर्ता को आवाज़, वाइब्रेशन या विज़ुअल के ज़रिए सूचना दी जाए. बाद में होने वाले अपडेट के लिए, ऐसा नहीं किया जाएगा.
सूचना हटाना
सूचनाएं तब तक दिखती हैं, जब तक इनमें से कोई एक स्थिति न हो:
- उपयोगकर्ता, सूचना को खारिज कर देता है.
- सूचना बनाते समय
setAutoCancel()
को कॉल करने पर, उपयोगकर्ता सूचना पर टैप करता है. - किसी खास सूचना आईडी के लिए,
cancel()
को कॉल किया जाता है. इस तरीके से, चल रही सूचनाएं भी मिट जाती हैं. cancelAll()
को कॉल किया जा सकता है. इससे, पहले जारी की गई सभी सूचनाएं हट जाएंगी.- अगर सूचना बनाते समय,
setTimeoutAfter()
का इस्तेमाल करके कोई टाइम आउट सेट किया जाता है, तो तय की गई अवधि खत्म हो जाती है. ज़रूरत पड़ने पर, तय किए गए टाइम आउट की अवधि खत्म होने से पहले ही सूचना रद्द की जा सकती है.
मैसेजिंग ऐप्लिकेशन के लिए सबसे सही तरीके
अपनी मैसेज सेवा और चैट ऐप्लिकेशन के लिए सूचनाएं तैयार करते समय, यहां दिए गए सबसे सही तरीकों को ध्यान में रखें.
MessagingStyle का इस्तेमाल करना
Android 7.0 (एपीआई लेवल 24) से, Android खास तौर पर मैसेज कॉन्टेंट के लिए, सूचना के स्टाइल का टेंप्लेट उपलब्ध कराता है. NotificationCompat.MessagingStyle
क्लास का इस्तेमाल करके, सूचना पर दिखने वाले कई लेबल बदले जा सकते हैं. इनमें बातचीत का टाइटल, अतिरिक्त मैसेज, और सूचना के लिए कॉन्टेंट व्यू शामिल हैं.
यहां दिए गए कोड स्निपेट में, MessagingStyle
क्लास का इस्तेमाल करके सूचना की स्टाइल को पसंद के मुताबिक बनाने का तरीका बताया गया है.
Kotlin
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()
Java
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 (एपीआई लेवल 28) से, सूचना और उसके अवतार को बेहतर तरीके से रेंडर करने के लिए, Person
क्लास का इस्तेमाल करना भी ज़रूरी है.
NotificationCompat.MessagingStyle
का इस्तेमाल करते समय, ये काम करें:
- दो से ज़्यादा लोगों वाली ग्रुप चैट का टाइटल सेट करने के लिए,
MessagingStyle.setConversationTitle()
पर कॉल करें. बातचीत का अच्छा टाइटल, ग्रुप चैट का नाम हो सकता है. अगर चैट का कोई नाम नहीं है, तो बातचीत में शामिल लोगों की सूची को टाइटल के तौर पर इस्तेमाल किया जा सकता है. इसके बिना, मैसेज को गलती से ऐसा समझा जा सकता है कि वह बातचीत में सबसे हाल ही का मैसेज भेजने वाले के साथ वन-टू-वन बातचीत का हिस्सा है. - इमेज जैसे मीडिया मैसेज को शामिल करने के लिए,
MessagingStyle.setData()
तरीके का इस्तेमाल करें. पैटर्न के एमआईएमई टाइप, image/* काम करते हैं.
सीधे जवाब देने की सुविधा का इस्तेमाल करना
डायरेक्ट रिप्लाई की सुविधा की मदद से, उपयोगकर्ता किसी मैसेज का इनलाइन जवाब दे सकता है.
- जब कोई उपयोगकर्ता इनलाइन जवाब देने की कार्रवाई से जवाब देता है, तो
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)
का इस्तेमाल करें.