Android नोटिफ़िकेशन का उपयोग करके

यह कोडलैब, Kotlin में बेहतर Android का हिस्सा है. अगर आप कोडलैब के क्रम में काम करते हैं, लेकिन यह ज़रूरी नहीं है, तो आपको इस कोर्स का पूरा फ़ायदा मिलेगा. सभी कोर्स कोडलैब Kotlin कोडलैब के लैंडिंग पेज पर बेहतर Android पेज पर दिए गए हैं.

परिचय

'सूचनाएं' ऐसे मैसेज होती हैं जो उपयोगकर्ता को आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) के बाहर दिखती हैं. अगर डिवाइस अनलॉक है, तो सूचनाएं स्क्रीन पर सबसे ऊपर दिखती हैं. इसके अलावा, डिवाइस के लॉक होने पर, सुरक्षा सेटिंग के आधार पर भी ये सूचनाएं दिखती हैं.

एक सामान्य सूचना में शीर्षक, ब्यौरा, और एक आइकॉन होता है. सूचना में क्लिक करने लायक कार्रवाइयां, फटाफट जवाब, बढ़ाई जा सकने वाली सामग्री, और इमेज भी हो सकती हैं.

सूचनाओं से समय पर कॉन्टेंट मिल सकता है. साथ ही, इनमें बटन भी हो सकते हैं, ताकि उपयोगकर्ता तुरंत कार्रवाई कर सकें, जैसे कि जवाब भेजना या अलार्म को स्नूज़ करना. किसी सूचना पर क्लिक करने पर, उपयोगकर्ता आपके ऐप्लिकेशन में सूचना से जुड़े कॉन्टेंट से जुड़े व्यू पर पहुंच जाता है.

सूचनाओं से, उपयोगकर्ताओं को किसी ज़रूरी टास्क के बारे में याद दिलाने में मदद मिलती है. साथ ही, उन्हें यह बताया जा सकता है कि कुछ काम हुआ है या ऐप्लिकेशन के बैकग्राउंड में होने के तुरंत बाद, उन्हें ज़रूरी जानकारी दें. सूचनाओं का कम इस्तेमाल करें. यह न सिर्फ़ उपयोगकर्ताओं का सम्मान करता है, बल्कि इस बात की संभावना भी बढ़ाता है कि आपके ऐप्लिकेशन की सूचना पर ध्यान दिया जाए.

इस कोडलैब में आप Android ऐप्लिकेशन में सूचनाएं बनाने और उनका इस्तेमाल करने का तरीका जानेंगे.

आपको क्या पता होना चाहिए

आपको इनके बारे में पता होना चाहिए:

  • Kotlin में Android ऐप्लिकेशन बनाने का तरीका. खास तौर पर, Android SDK टूल के साथ काम करें.
  • आर्किटेक्चर कॉम्पोनेंट और डेटा बाइंडिंग का इस्तेमाल करके ऐप्लिकेशन बनाने का तरीका.
  • BroadcastRecipients के बारे में बुनियादी जानकारी
  • AlarmManager की बुनियादी जानकारी

आप इन चीज़ों के बारे में जानेंगे

  • सूचना बनाने, शैली बनाने और उसे भेजने का तरीका.
  • सूचनाएं रद्द करने का तरीका.
  • सूचना के चैनल बनाने का तरीका.
  • सूचनाओं में तेज़ कार्रवाइयां जोड़ने का तरीका.
  • ऐप्लिकेशन आइकॉन पर सूचना वाले बैज दिखाने का तरीका.

आप क्या कर पाएंगे!

  • स्टार्टर ऐप्लिकेशन में सूचना जोड़ें.
  • पहले भेजी गई सूचना रद्द करें.
  • अलग-अलग तरह की सूचनाओं के लिए चैनल बनाएं.
  • स्टार्टर ऐप्लिकेशन में, पसंद के मुताबिक सूचनाएं पाएं.
  • अपनी सूचना को इंटरैक्टिव बनाने के लिए, क्विक ऐक्शन जोड़ें.
  • सूचना वाले बैज की सुविधा बंद करें.

अंडे बनाना आसान है, लेकिन अगर आप समय ट्रैक नहीं कर पाते, तो यह एक चुनौती भरा काम हो सकता है. इस कोडलैब में आप अंडों के टाइमर वाले ऐप्लिकेशन पर काम कर पाएंगे और उसे अपने आने वाले अंडों की तरह शानदार बना पाएंगे. शुरुआत करने के लिए, आप अंडों के टाइमर सेट करने वाले ऐप्लिकेशन का इस्तेमाल कर सकते हैं. इससे उपयोगकर्ता, खाना बनाने के अलग-अलग समय के लिए अलग-अलग समय सेट कर सकते हैं. टाइमर, चुने गए समय अंतराल पर काउंट डाउन करता है और अंडे तैयार होने पर टोस्ट मैसेज दिखाता है.

हो सकता है कि यह सुविधा काम की लगे, लेकिन यह पूरी तरह से सही नहीं है और उपयोगकर्ताओं के लिए आसान नहीं है. शुरू करने के लिए, टोस्ट मैसेज सिर्फ़ कुछ समय के लिए दिखाया जाता है. इसलिए, यह आसानी से नहीं मिल पाता. साथ ही, अगर ऐप्लिकेशन फ़ोरग्राउंड में नहीं है या डिवाइस लॉक है, तो टोस्ट मैसेज गायब होने का टाइमर और #39; का स्टेटस नहीं दिखता.

आम तौर पर, अंडे का टाइमर इस्तेमाल करने पर उपयोगकर्ताओं को समय की जानकारी देने के लिए, सूचनाओं का इस्तेमाल करना चाहिए. उपयोगकर्ता को वाकई में यह जानने की ज़रूरत होती है कि अंडे तुरंत तैयार हो गए हैं, नहीं तो अंडे साफ़ हो जाएंगे! सूचनाएं देखने में आसान हैं और इनमें आवाज़ों के साथ-साथ डिवाइस में वाइब्रेशन भी हो सकता है—उपयोगकर्ता के ध्यान खींचने के सभी तरीके! इस तरह, आप बढ़िया अंडे पा सकते हैं और उपयोगकर्ताओं को खुश रख सकते हैं.

ऐप्लिकेशन का नमूना लेने के लिए, इनमें से कोई एक काम करें:

GitHub से डेटा स्टोर करने की जगह क्लोन करें और स्टार्टर ब्रांच पर स्विच करें.

$  git clone https://github.com/googlecodelabs/android-kotlin-notifications


इसके अलावा, आप रिपॉज़िटरी को एक ZIP फ़ाइल के रूप में डाउनलोड कर सकते हैं, इसे अनज़िप कर सकते हैं, और इसे Android Studio में खोल सकते हैं.

पिन डाउनलोड करें

  1. Android Studio में ऐप्लिकेशन खोलें और चलाएं.

आपको अंडे की इमेज और एक ड्रॉप-डाउन मेन्यू दिखेगा, जिसमें अंडे को पकाने के लिए पहले से तय समय अंतरालों की सूची होगी. सॉफ़्ट बॉयल्ड ड्रॉप-डाउन मेन्यू के त्रिभुज पर क्लिक करें. सूची में पहला विकल्प टेस्टिंग उद्देश्यों के लिए दिया गया है और यह अलार्म को सिर्फ़ 10 सेकंड के लिए सेट करता है. सूची के आगे एक स्विच होता है जो एग टाइमर शुरू करता है. इस स्विच को आप कभी भी अंडे का टाइमर शुरू करने या रोकने के लिए इस्तेमाल कर सकते हैं. स्टार्टर कोड पूरी तरह से काम करता है, इसका मतलब है कि आप अंडे टाइमर सेट कर सकते हैं और उसे 0 तक गिनकर देख सकते हैं. टाइमर पूरा हो जाने पर, टोस्ट मैसेज दिखता है, जैसा कि नीचे दिखाया गया है.

  1. सोर्स कोड की जांच करें. स्टार्टर ऐप्लिकेशन में सिर्फ़ MainActivity गतिविधि शामिल है. receiver, ui, और util नाम के तीन सब-पैकेज हैं.

  • /receiverreceiver पैकेज में AlarmReceiver और SnoozeReceiver नाम के दो ब्रॉडकास्ट रिसीवर हैं. AlarmReceiver उपयोगकर्ता के तय किए गए टाइमर के पूरा होने पर, सूचना भेजने के लिए AlarmManager ट्रिगर होता है. SnoozeReceiver, उपयोगकर्ता को क्लिक करने की सूचना देता है, ताकि वह सूचना स्नूज़ (थोड़ी देर के लिए बंद) कर सके.
  • /ui—इसमें EggTimerFragment है, जो ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) का हिस्सा है. EggTimerViewModel, टाइमर को शुरू और रद्द करने और लाइफ़साइकल से जुड़े दूसरे ऐप्लिकेशन टास्क के लिए ज़िम्मेदार है.
  • /util—इस पैकेज में दो फ़ाइलें हैं. BindingUtils.kt में ऐप्लिकेशन अडैप्टर और ViewModel के बीच डेटा बाइंडिंग चालू करने के लिए बाइंडिंग अडैप्टर हैं. NotificationUtils.kt में NotificationManager पर एक्सटेंशन के तरीके उपलब्ध हैं.

सूचनाओं का इस्तेमाल करके, अपने ऐप्लिकेशन की ओर लोगों का ध्यान खींचा जा सकता है. चाहे आपका ऐप्लिकेशन न चल रहा हो या फ़ोरग्राउंड में चल रहा हो, सूचनाओं के लिए स्क्रीन पर एक पॉप-अप विंडो दिखेगी. इसमें, आवाज़ या वाइब्रेशन शामिल हो सकता है. सूचना बनाने के लिए, आपको सूचना बिल्डर का इस्तेमाल करना होगा. साथ ही, शीर्षक टेक्स्ट, कॉन्टेंट टेक्स्ट, और आइकॉन उपलब्ध कराना होगा. बिल्डर के पास सभी ज़रूरी फ़ील्ड होने के बाद, NotificationManager एक सिस्टम सेवा होती है. इससे आपको इस कॉन्टेंट को सूचना के तौर पर दिखाने में मदद मिलती है. सूचना भेजने, उसके कॉन्टेंट को अपडेट करने, और सूचना रद्द करने की ज़िम्मेदारी NotificationManager की है. नीचे दिए गए तरीके में, NotificationManager में एक्सटेंशन के तरीके जोड़े जाएंगे. इस तरह, हर बार आपको NotificationManager का इस्तेमाल करने के लिए इन एक्सटेंशन के फ़ंक्शन का इस्तेमाल करने के साथ-साथ, वे सुविधाएं भी मिल सकती हैं जिनका आप इस्तेमाल करना चाहते हैं.

पहला चरण: बुनियादी सूचना बनाना

इस टास्क में, आप एक नई सूचना बना रहे हैं, अपने उपयोगकर्ता के लिए मैसेज सेट कर रहे हैं, और सूचना भेज रहे हैं.

  1. NotificationUtils.kt क्लास खोलें और TODO: Step 1.1 को ढूंढें. आपको इस कोडलैब और ऐप्लिकेशन कोड में मेल खाने वाली काम की सूची मिलेगी.
  2. दिए गए sendNotification() फ़ंक्शन की जांच करें. सूचनाएं भेजने के लिए, आप इस एक्सटेंशन फ़ंक्शन को NotificationManager तक बढ़ाएंगे.
//NotificationUtils.kt
// TODO: Step 1.1 extension function to send messages (GIVEN)
/**
 * Builds and delivers a notification.
 *
 * @param messageBody, notification text.
 * @param context, activity context.
 */
fun NotificationManager.sendNotification(messageBody: String, applicationContext: Context) {
  1. सूचना बिल्डर का एक उदाहरण पाएं, ऐप्लिकेशन के कॉन्टेक्स्ट और चैनल आईडी में पास करें. चैनल आईडी, चैनल के लिए एक स्ट्रिंग वैल्यू होती है.

सूचना चैनल, सूचनाओं का ग्रुप बनाने का एक तरीका है. एक ही तरह की सूचना को एक साथ ग्रुप में रखने से, डेवलपर और उपयोगकर्ता चैनल में सभी सूचनाओं को नियंत्रित कर सकते हैं. चैनल बन जाने के बाद, कितनी भी सूचनाएं दी जा सकती हैं.

//NotificationUtils.kt
// TODO: Step 1.2 get an instance of NotificationCompat.Builder
val builder = NotificationCompat.Builder(
        applicationContext,
        applicationContext.getString(R.string.egg_notification_channel_id)
)
  1. आप अपने ऐप्लिकेशन, शीर्षक, और कॉन्टेंट टेक्स्ट के बारे में बताने के लिए, सूचना आइकॉन सेट कर सकते हैं. आपकी कोडलैब (कोड बनाना सीखना) में अपनी पसंद के मुताबिक ज़्यादा विकल्प देखने के लिए, आपको कई विकल्प दिखेंगे. हालांकि, सूचना भेजने के लिए, आपको कम से कम इतने डेटा को सेट करना होगा.
//NotificationUtils.kt
   // TODO: Step 1.3 set title, text and icon to builder
   .setSmallIcon(R.drawable.cooked_egg)
   .setContentTitle(applicationContext.getString(R.string.notification_title))
   .setContentText(messageBody)
  1. इसके बाद, आपको कॉल करने के लिए अपने यूनीक आईडी और Notification के ऑब्जेक्ट के साथ, notify() को एक यूनीक आईडी देना होगा.

यह आईडी, मौजूदा सूचना इंस्टेंस को दिखाता है. साथ ही, इस सूचना को अपडेट करने या रद्द करने के लिए, यह आईडी ज़रूरी है. फ़िलहाल, आपके ऐप्लिकेशन में किसी एक समय पर सिर्फ़ एक सूचना है, इसलिए आप सभी सूचनाओं के लिए एक ही आईडी का इस्तेमाल कर सकते हैं. आपको NotificationUtils.kt में NOTIFICATION_ID के नाम से पहले ही एक कॉन्सटेंट दिया जा चुका है. ध्यान दें कि आप notify() को सीधे कॉल कर सकते हैं, क्योंकि आप एक ही क्लास में किसी एक्सटेंशन फ़ंक्शन से कॉल कर रहे हैं.

//NotificationUtils.kt
   // TODO: Step 1.4 call notify to send the notification
    // Deliver the notification
    notify(NOTIFICATION_ID, builder.build())
  1. ui/EggTimerViewModel.kt खोलें और startTimer() फ़ंक्शन को ढूंढें. जब उपयोगकर्ता एग टाइमर को चालू करता है, तो यह फ़ंक्शन चुने गए समय अंतराल पर अलार्म बनाता है.
  2. जब उपयोगकर्ता टाइमर शुरू करेगा, तो इस फ़ंक्शन में एक सूचना ट्रिगर होगी. आपने जो sendNotification() फ़ंक्शन पहले लागू किया है उसे कॉल करने के लिए, आपके पास NotificationManager का इंस्टेंस होना ज़रूरी है. NotificationManager एक सिस्टम सेवा है. यह सूचना एपीआई के लिए दिखाए गए सभी फ़ंक्शन उपलब्ध कराती है. इसमें आपके जोड़े गए एक्सटेंशन फ़ंक्शन भी शामिल हैं. आप जब भी सिस्टम से NotificationManager के इंस्टेंस का अनुरोध करने के लिए सूचना भेजना, रद्द करना या अपडेट करना चाहते हैं. sendNotification()|फ़ंक्शन को सूचना संदेश और संदर्भ के साथ कॉल करें.
// EggTimerViewModel.kt
// TODO: Step 1.5 get an instance of NotificationManager 
// and call sendNotification

val notificationManager = ContextCompat.getSystemService(
    app, 
    NotificationManager::class.java
) as NotificationManager
                notificationManager.sendNotification(app.getString(R.string.timer_running), app)

आपका काम करीब-करीब पूरा हो गया है. हालांकि, अगर आप अभी अपना ऐप्लिकेशन चलाते हैं और टाइमर सेट करते हैं, तो आपको सूचना नहीं मिलेगी #39.

  1. logcat खोलें और "No Channel found" को खोजें. आपको गड़बड़ी का मैसेज दिखेगा कि egg_channel मौजूद नहीं है. इन तरीकों में, सूचना चैनलों के बारे में ज़्यादा जानें और इसे ठीक करें.

दूसरा चरण: सूचना के चैनल

एपीआई लेवल 26 से, सभी सूचनाएं किसी चैनल को असाइन करनी होंगी. अगर आप ऐप्लिकेशन लॉन्चर आइकॉन पर टैप करके रखते हैं, ऐप्लिकेशन की जानकारी चुनें, और सूचनाएं पर टैप करते हैं, तो आपको ऐप्लिकेशन से जुड़े सूचना चैनल की सूची दिखेगी. फ़िलहाल, सूची खाली है, क्योंकि आपके ऐप्लिकेशन ने कोई चैनल नहीं बनाया है.

चैनल, सूचना के &? के उदाहरण को दिखाते हैं—उदाहरण के लिए, अंडे का टाइमर, अंडे पकाए जाने पर सूचना भेज सकता है. साथ ही, रोज़ाना सूचना भेजने के लिए एक और चैनल का इस्तेमाल करके, आपको याद दिला सकता है कि नाश्ते में आपके बच्चे शामिल होने चाहिए. किसी चैनल की सभी सूचनाओं को एक साथ रखा जाता है. साथ ही, उपयोगकर्ता पूरे चैनल के लिए सूचना सेटिंग को कॉन्फ़िगर कर सकते हैं. ऐसा करने से, उपयोगकर्ता अपनी पसंद की सूचना के मुताबिक, सूचना पाने की सेटिंग को अपने हिसाब से बना सकते हैं. उदाहरण के लिए, आपके उपयोगकर्ता नाश्ते की सूचनाओं को बंद कर सकते हैं. हालांकि, वे टाइमर की सूचनाएं देखना चुन सकते हैं.

डेवलपर, चैनल की सभी सूचनाओं पर लागू होने के लिए, शुरुआती सेटिंग, अहमियत, और व्यवहार सेट करते हैं. शुरुआती सेटिंग सेट करने के बाद, उपयोगकर्ता इन सेटिंग को बदल सकते हैं.

पहले चरण में आपने egg_notification_channel_id का इस्तेमाल, सूचना चैनल के तौर पर किया था. इसलिए, अब आपको इस चैनल के लिए सूचना सेटिंग और व्यवहार बनाना होगा. साथ ही, उन्हें अपने हिसाब से बनाना होगा.

  1. EggTimerFragment.kt खोलें और createChannel() फ़ंक्शन को ढूंढें.
  2. NotificationChannel के कंस्ट्रक्टर को यूनीक चैनल आईडी पास करें.
  3. सूचना चैनल का नाम पास करें. उपयोगकर्ताओं को यह नाम उनकी सेटिंग स्क्रीन में भी दिखेगा.
  4. आखिरी पैरामीटर के तौर पर, सूचना चैनल के लिए अहमियत का लेवल पास करें. इस कोडलैब में बाद में ज़रूरी लेवल शामिल किए जाएंगे, इसलिए अभी आप NotificationManager.IMPORTANCE_LOW का इस्तेमाल कर सकते हैं.
  5. notificationChannel ऑब्जेक्ट पर enableLights को 'सही' पर सेट करें. इस सेटिंग के चालू होने पर, सूचनाएं दिखने पर लाइटें चालू हो जाएंगी.
  6. किसी ऑब्जेक्ट के दिखने पर लाल रंग की लाइट दिखाने के लिए, notificationChannel ऑब्जेक्ट पर lightColor को लाल पर सेट करें.
  7. वाइब्रेशन चालू करने के लिए, notificationChannel ऑब्जेक्ट पर enableVibration को 'सही' पर सेट करें.
  8. notificationChannel ऑब्जेक्ट पर, चैनल की जानकारी ‘Time for breakfast' पर सेट करें.
  9. getSystemService() को कॉल करके, NotificationManager का इंस्टेंस पाएं.
  10. NotificationManager पर createNotificationChannel() को कॉल करें और notificationChannel ऑब्जेक्ट पास करें जिसे आपने पिछले चरण में बनाया था.
//EggTimerFragment.kt
private fun createChannel(channelId: String, channelName: String) {
    // TODO: Step 1.6 START create a channel
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val notificationChannel = NotificationChannel(
            channelId,
            channelName,
            // TODO: Step 2.4 change importance
            NotificationManager.IMPORTANCE_LOW
        )
        // TODO: Step 2.6 disable badges for this channel

        notificationChannel.enableLights(true)
        notificationChannel.lightColor = Color.RED
        notificationChannel.enableVibration(true)
        notificationChannel.description = "Time for breakfast"

        val notificationManager = requireActivity().getSystemService(
            NotificationManager::class.java
        )
        notificationManager.createNotificationChannel(notificationChannel)
    }
    // TODO: Step 1.6 END create channel
}
  1. इसके बाद, चैनल बनाने के लिए, आपको अभी-अभी लिखे गए createChannel() फ़ंक्शन को कॉल करना होगा (चरण 1.7). यह फ़ंक्शन दो पैरामीटर लेता है, चैनल आईडी और चैनल का नाम. आपको अपने प्रोजेक्ट में दिए गए स्ट्रिंग रिसॉर्स से अपना चैनल आईडी और चैनल नाम खोजना होगा.
// EggTimerFragment.kt
    // TODO: Step 1.7 call createChannel
    createChannel(
          getString(R.string.egg_notification_channel_id),
          getString(R.string.egg_notification_channel_name)
    )
  1. आपको सूचना बिल्डर में चैनल आईडी पास करना होगा. आपने चरण 1.2 में पहले ही ऐसा कर लिया है. चैनल आईडी के तौर पर गलत वैल्यू सेट करने पर, सूचना नहीं मिल पाएगी. आपने पहले जो चैनल आईडी डाला है वह सही है या नहीं, इसकी पुष्टि करने के लिए NotificationUtils.kt खोलें.
// NotificationUtils.kt
val builder = NotificationCompat.Builder(
        applicationContext,
       // TODO: Step 1.8 verify the notification channel name
        applicationContext.getString(R.string.egg_notification_channel_id)
)
  1. ऐप्लिकेशन चलाएं और जब भी आप टाइमर शुरू करेंगे, तब आपको ऐप्लिकेशन से सूचना मिलेगी.
  2. स्टेटस बार को देखें और देखें कि सूचना का शीर्षक, कॉन्टेंट, और आइकॉन पिछले चरणों में सेट कर दिए गए हैं.
  3. नए बनाए गए चैनल की पुष्टि करने के लिए, ऐप्लिकेशन बंद करें और ऐप्लिकेशन आइकॉन ढूंढें. ऐप्लिकेशन आइकॉन पर लंबे समय तक टैप करें और ऐप्लिकेशन की जानकारी चुनें.

  1. सेटिंग की सूची में से सूचनाएं चुनें. आपको सूचना दिखाएं सेटिंग के ठीक नीचे एग नाम का एक नया चैनल दिखेगा.

जब आप ऐप्लिकेशन चलाते हैं, तो अब सूचना दिखती है. ऐप्लिकेशन डेवलपर के तौर पर और आपके उपयोगकर्ता, इस चैनल पर भेजी जाने वाली सभी सूचनाओं की सेटिंग और व्यवहार को अपनी पसंद के मुताबिक बना सकते हैं. बधाई हो, आपने सूचना भेज दी है!

तीसरा चरण: अपने ऐप्लिकेशन में सूचनाएं जोड़ना

अभी तक यह सूचना एपीआई के बुनियादी इस्तेमाल की जानकारी देती है, लेकिन टाइमर शुरू करने के तुरंत बाद सूचना भेजना एक मतलब है. उपयोगकर्ता शायद अंडे के तैयार होने पर सूचना पाना चाहेंगे. कोडलैब के नीचे वाले हिस्से में, आप इस समस्या को ठीक करेंगे और टोस्ट मैसेज को सूचना में बदल देंगे.

आप पहले ही सूचना भेज चुके हैं और यह देख चुके हैं कि वह उपयोगकर्ताओं को कैसी दिखती है. हालांकि, बेहतरीन सूचनाएं पाने का यह सिर्फ़ पहला कदम था. इस चरण में, आप सूचना को ज़्यादा सही समय पर भेजने का विकल्प बदलेंगे.

आपका ऐप्लिकेशन, अलार्म सेट अप करने के लिए AlarmManager का इस्तेमाल करता है. AlarmManager से संबंधित कोड पहले से ही स्टार्टर कोड में दिया गया है और टोस्ट संदेश दिखाने के लिए उपयोग किया जाता है. AlarmManager की मदद से, चुने गए समय पर नज़र रखी जाती है और समय पूरा होने पर AlarmReceiver.kt का onReceive() फ़ंक्शन ट्रिगर होता है. अगर आप AlarmReceiver.kt खोलते हैं और onReceive() पर नेविगेट करते हैं, तो हर बार अंडे का टाइमर सेट अप करने पर टोस्ट मैसेज दिखेगा.

  1. NotificationManager के इंस्टेंस AlarmReceiver.kt को खोलें और मैसेज टेक्स्ट और कॉन्टेक्स्ट पैरामीटर के साथ sendNotification() फ़ंक्शन को कॉल करें.
// AlarmReceiver.kt
   // TODO: Step 1.9 add call to sendNotification
   val notificationManager = ContextCompat.getSystemService(
       context, 
       NotificationManager::class.java
   ) as NotificationManager
             
   notificationManager.sendNotification(
       context.getText(R.string.eggs_ready).toString(), 
       context
   )
  1. इसके अलावा, टोस्ट हटाएं, क्योंकि टाइमर चालू होने पर आपका ऐप्लिकेशन एक सूचना भेजेगा.
// AlarmReceiver.kt
     // TODO: Step 1.10 [Optional] remove toast
//   Toast.makeText(
//       context, 
//       context.getText(R.string.eggs_ready),
//       Toast.LENGTH_SHORT
//   ).show()
  1. अपना ऐप्लिकेशन चलाएं . जब भी आप टाइमर शुरू करेंगे और हर बार टाइमर पूरा होगा, तब आपको इसकी सूचना दिखेगी.

यह बिल्कुल सही नहीं है. आप अपने उपयोगकर्ताओं को बहुत ज़्यादा सूचनाएं नहीं भेजना चाहते. जब उपयोगकर्ता टाइमर शुरू करता है, तो आप पहली सूचना को हटा सकते हैं.

  1. EggTimerFragment.kt खोलें और चरण 1.5 के लिए सूचना कोड हटाएं.
// EggTimeViewModel.kt

// TODO: Step 1.5 get an instance of NotificationManager 
// and call sendNotification
// val notificationManager = ContextCompat.getSystemService(
//      app,
//      NotificationManager::class.java
// ) as NotificationManager
// notificationManager.sendNotification(app.getString(R.string.eggs_ready), app)
  1. अपना ऐप्लिकेशन फिर से चलाएं.
  2. टाइमर सेट करें, इसे बैकग्राउंड में रखें, और पूरा होने के लिए इंतज़ार करें. आपको एक सूचना दिखेगी. यह सूचना काफ़ी काम की है.

चौथा चरण: कॉन्टेंट का इंटेंट जोड़ना

  1. अगर ऐप्लिकेशन पहले से नहीं चल रहा है, तो इसे फिर से चलाएं.
  2. सूचना पर क्लिक करें. कुछ नहीं हुआ!

सूचना दिखाना और उपयोगकर्ता को इस बात की जानकारी देना बहुत अच्छा होता है, लेकिन जब कोई उपयोगकर्ता सूचना पर क्लिक करता है, तो वह इससे जुड़े ऐप्लिकेशन पर वापस जाने की उम्मीद करता है. कोडलैब के इस हिस्से में, आपको अपनी सूचना में इंटेंट जोड़नी होगी, ताकि उपयोगकर्ता, टाइमर की स्क्रीन पर वापस आ जाए.

Intent एक मैसेज सेवा ऑब्जेक्ट है, जिसका इस्तेमाल करके आप किसी दूसरे ऐप्लिकेशन कॉम्पोनेंट से कार्रवाई का अनुरोध कर सकते हैं. इंटेंट का इस्तेमाल किसी गतिविधि, सेवा को शुरू करने या ब्रॉडकास्ट डिलीवर करने के लिए किया जा सकता है. ऐसे मामले में, इस इंटेंट का इस्तेमाल सिस्टम को यह बताने के लिए किया जाता है कि जब उपयोगकर्ता सूचना पर टैप करता है, तो उसे MainActivity खोला जाता है. आपके ऐप्लिकेशन में सिर्फ़ एक व्यू है, इसलिए आपके पास यहां ज़्यादा विकल्प नहीं हैं. हालांकि, किसी बड़े ऐप्लिकेशन में, उपयोगकर्ता को बिना किसी रुकावट के स्क्रीन पर ले जाने के लिए, सूचना बिना किसी रुकावट के चाहिए. साथ ही, इससे उपयोगकर्ता को सूचना के साथ इंटरैक्ट करने पर भी फ़ायदा मिलता है.

  1. NotificationUtils.kt खोलें और sendNotification() एक्सटेंशन फ़ंक्शन ढूंढें.
  2. अपनी applicationContext और गतिविधि लॉन्च करने के लिए, Intent के साथ MainActivity::class.java बनाएं.
// NotificationUtils.kt

fun NotificationManager.sendNotification(messageBody: String, applicationContext: Context) {
    // Create the content intent for the notification, which launches
    // this activity
   // TODO: Step 1.11 create intent
    val contentIntent = Intent(applicationContext, MainActivity::class.java)

आपने इंटेंट बनाया है, लेकिन इसकी सूचना आपके ऐप्लिकेशन के बाहर दिखाई देती है. अपने ऐप्लिकेशन के बाहर कोई इंटेंट काम करने के लिए, आपको एक नया PendingIntent बनाना होगा.

PendingIntent आपके ऐप्लिकेशन की ओर से कार्रवाई करने के लिए किसी दूसरे ऐप्लिकेशन या सिस्टम को अधिकार देता है. PendingIntent सिर्फ़ एक टोकन का रेफ़रंस होता है, जिसका रखरखाव सिस्टम, रखरखाव के समय इस्तेमाल किए जाने वाले मूल डेटा की जानकारी देने के लिए करता है. इसका मतलब यह है कि मालिकाना हक वाला ऐप्लिकेशन PendingIntent इस मामले में, सिस्टम आपकी ओर से ऐप्लिकेशन खोलने के लिए बिना मंज़ूरी वाले इंटेंट का इस्तेमाल करेगा, भले ही टाइमर ऐप्लिकेशन चल रहा हो या नहीं.

  1. applicationContext, NOTIFICATION_ID, पिछले चरण में बनाया गया contentIntent, और PendingIntent फ़्लैग वाला PendingIntent बनाएं. PendingIntent का फ़्लैग, नया PendingIntent बनाने या मौजूदा का इस्तेमाल करने का विकल्प बताता है. आपको PendingIntent.FLAG_UPDATE_CURRENT को फ़्लैग के तौर पर सेट करना होगा, क्योंकि अगर कोई मौजूदा सूचना है, तो आप उसे नहीं बनाना चाहते. इस तरह आप मौजूदा PendingIntent को बदल देंगे, जो आपके दिए गए इंटेंट से जुड़ा है.
// NotificationUtils.kt
   // TODO: Step 1.12 create PendingIntent
    val contentPendingIntent = PendingIntent.getActivity(
        applicationContext, 
        NOTIFICATION_ID,
        contentIntent,
        PendingIntent.FLAG_UPDATE_CURRENT
    )
  1. अपनी सूचना में PendingIntent को भेजें. आप NotificationBuilder पर setContentIntent() को कॉल करके ऐसा करते हैं. अब, सूचना पर क्लिक करने पर PendingIntent ट्रिगर हो जाएगा, जो आपका MainActivity खोलेगा.
  2. साथ ही, setAutoCancel() को true पर भी सेट करें, ताकि जब उपयोगकर्ता सूचना पर टैप करे, तो वह खुद को ऐप्लिकेशन पर ले जाए.
// NotificationUtils.kt
    // TODO: Step 1.13 set content intent
    .setContentIntent(contentPendingIntent)
    .setAutoCancel(true)
  1. ऐप्लिकेशन फिर से चलाएं.
  2. टाइमर सेट करें, ऐप्लिकेशन को बैकग्राउंड में रखें, और सूचना दिखने का इंतज़ार करें.
  3. सूचना देखने के बाद, स्टेटस बार को खींचकर और यह देखें कि ऐप्लिकेशन को फ़ोरग्राउंड में कैसे लाया जाता है. इसके बाद, सूचना पर क्लिक करें.

पांचवां चरण: सूचना रद्द करना

आपके पास ज़रूरी जानकारी वाला अंडे का टाइमर है, लेकिन उसमें एक समस्या आ रही है. अगर आपने टाइमर सेट किया है, तो सूचना पाने के साथ-साथ टाइमर को फिर से सेट किया है, तो 'नया टाइमर' के चालू होने के दौरान पिछली सूचना आपको स्टेटस बार पर दिखेगी. अगर ऐप्लिकेशन बैकग्राउंड में है, तो इससे उपयोगकर्ता उलझन में पड़ सकते हैं. इसकी वजह से हो सकता है कि कुकी सही तरीके से न खुलें.

इस समस्या को ठीक करने के लिए, नया टाइमर शुरू करते समय आपको पिछली सूचना मिटानी होगी. अपने NotificationUtils.kt में एक और एक्सटेंशन फ़ंक्शन बनाकर शुरुआत करें. NotificationManager में cancelAll() नाम की सभी चालू सूचनाओं को रद्द करने के लिए, एपीआई है.

  1. NotificationsUtil.kt खोलें.
  2. NotificationManager पर एक एक्सटेंशन फ़ंक्शन जोड़ें, जो cancelAll() को कॉल करता हो.
// NotificationUtils.kt

// TODO: Step 1.14 Cancel all notifications
/**
 * Cancels all notifications.
 *
 */
fun NotificationManager.cancelNotifications() {
    cancelAll()
}
  1. EggTimerViewModel.kt खोलें और startTimer() फ़ंक्शन पर जाएं.
  2. startTimer() के अंदर, सिस्टम से NotificationManager का इंस्टेंस पाएं और cancelNotifications() को कॉल करें.
//  EggTimerViewModel.kt
   //TODO Step 1.15 call cancel notification
    val notificationManager =
       ContextCompat.getSystemService(
            app,
            NotificationManager::class.java
        ) as NotificationManager
    notificationManager.cancelNotifications()       
  1. ऐप्लिकेशन चलाएं और टाइमर शुरू करें.
  2. सूचना दिखने के बाद, टाइमर को फिर से चालू करें और देखें कि हमारा ऐप्लिकेशन किस तरह स्टेटस बार से पिछली सूचना को अपने-आप मिटाता है.

सूचना फ़्रेमवर्क, डेवलपर के लिए मनमुताबिक कार्रवाइयों को सेट करने और उनकी सूचनाओं को ज़रूरत के मुताबिक शैली में बदलाव करने के कई विकल्प देता है. इस काम के दौरान, आप जान जाएंगे कि अंडे से जुड़ी टाइमर वाली सूचनाओं को कैसे पसंद के मुताबिक बनाना है.

पहला चरण: अपनी सूचना को स्टाइल में बदलना

अपनी ज़रूरतों के हिसाब से सूचना और स्टाइल और सूचनाएं पाने की सुविधा चालू करने से, आपकी सूचनाएं सबसे अलग नज़र आएंगी और वे आपके ऐप्लिकेशन के एक्सटेंशन की तरह दिखेंगी. सूचना फ़्रेमवर्क कई बिल्ट-इन शैलियों के साथ आता है, और आप जब चाहें अपना खुद का स्टाइल बना सकते हैं.

NotificationCompat इन प्रॉडक्ट में बिल्ट-इन स्टाइल देता है:

  • BigTextStyle, जो बड़े पैमाने पर टेक्स्ट दिखाता है, जैसे कि ईमेल का कॉन्टेंट बड़ा करके दिखाने पर.
  • BigPictureStyle, जो बड़े फ़ॉर्मैट की सूचनाएं दिखाता है. इनमें इमेज का बड़ा अटैचमेंट शामिल होता है.
  • InboxStyle, जो बातचीत की स्टाइल वाले टेक्स्ट कॉन्टेंट को दिखाता है.
  • MediaStyle, जो मीडिया चलाने के कंट्रोल दिखाता है.
  • MessagingStyle, जो बड़ी संख्या में ऐसी सूचनाएं दिखाता है जिनमें किसी भी संख्या में कई मैसेज शामिल हों.

बड़ा करने लायक सूचना बनाएं के दस्तावेज़ में आपको दूसरी शैलियों के बारे में ज़्यादा जानकारी मिल सकती है. इस चरण में, आप NotificationCompat.BigPictureStyle का इस्तेमाल करके बड़ी की जा सकने वाली सूचना बनाएंगे. यह सूचना बड़ी करने पर अंडे की बड़ी इमेज दिखाएगी.

  1. NotificationUtils.kt खोलें और sendNotification() फ़ंक्शन को ढूंढें.
  2. BitmapFactory का इस्तेमाल करके, resources से किसी इमेज को लोड करके शुरू करें.
// NotificationUtils.kt

// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
     applicationContext.resources, 
     R.drawable.cooked_egg
)
  1. एक नया BigPictureStyle बनाएं और अपनी इमेज सेट करें.
  2. bigLargeIcon() को null पर सेट करें, ताकि सूचना बड़ा किए जाने पर बड़े आइकॉन का हट जाए.
// NotificationUtils.kt

// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
     applicationContext.resources, 
     R.drawable.cooked_egg
)
val bigPicStyle = NotificationCompat.BigPictureStyle()
        .bigPicture(eggImage)
        .bigLargeIcon(null)
  1. setStyle() के साथ स्टाइल को bigPicStyle पर सेट करें.
  2. setLargeIcon() के साथ बड़े आइकॉन को eggImage पर सेट करें, ताकि सूचना को छोटा करने पर इमेज एक छोटे आइकॉन के तौर पर दिखे.
// NotificationUtils.kt
// TODO: Step 2.1 add style to builder
.setStyle(bigPicStyle)
.setLargeIcon(eggImage)
  1. ऐप्लिकेशन चलाएं और टाइमर सेट करें. जब सूचना पहली बार दिखाई जाती है, तो यह सूचना पैनल में छोटे रूप में होती है. अगर आप सूचना को बड़ा करते हैं, तो सूचना वाली बड़ी जगह में एक बड़ी इमेज दिखती है.

दूसरा चरण: सूचना से जुड़ी कार्रवाइयां

सूचना की कार्रवाइयां, पसंद के मुताबिक बनाने की एक और सुविधा है. आप इसे अपनी सूचनाओं में जोड़ सकते हैं. जब उपयोगकर्ता आपके ऐप्लिकेशन पर क्लिक करते हैं, तो फ़िलहाल आपकी सूचनाएं उनके ऐप्लिकेशन पर रीडायरेक्ट होती हैं. सूचना की इस डिफ़ॉल्ट कार्रवाई के अलावा, आप कार्रवाई से जुड़े ऐसे बटन भी जोड़ सकते हैं जो सूचना से ऐप्लिकेशन के काम को पूरा करते हों.

सूचना, ज़्यादा से ज़्यादा तीन कार्रवाई बटन दिखा सकती है. इनकी मदद से, उपयोगकर्ता तेज़ी से जवाब दे सकते हैं, जैसे कि रिमाइंडर को स्नूज़ करना या किसी मैसेज का जवाब देना. कार्रवाई के ये बटन उस समय डुप्लीकेट नहीं होने चाहिए जब उपयोगकर्ता ने सूचना पर टैप किया हो.

ऐक्शन बटन जोड़ने के लिए, बिल्डर पर addAction() फ़ंक्शन के लिए PendingIntent पास करें. यह setContentIntent() के कॉल की डिफ़ॉल्ट टैप कार्रवाई को सेट अप करने जैसा ही है. हालांकि, कोई गतिविधि लॉन्च करने के बजाय, आप कई दूसरी चीज़ें कर सकते हैं. उदाहरण के लिए, BroadcastReceiver में कोई ऐसा काम शुरू करें जो बैकग्राउंड में काम करता है, ताकि कार्रवाई उस ऐप्लिकेशन के काम में रुकावट न डाले जो पहले से खुला हुआ है.

इस कोडलैब में आपको BoadcastReceiver नाम SnoozeReceiver दिया गया है. उपयोगकर्ता को सूचना की कार्रवाई पर क्लिक करने के लिए, SnoozeReceiver का इस्तेमाल किया जाएगा. जब आप उपयोगकर्ता को स्नूज़ करने के लिए बटन पर क्लिक करेंगे, तो आप इन चरणों में कोड को जोड़कर, 60 सेकंड के लिए अंडे के टाइमर की सूचना को स्नूज़ करेंगे. जब स्नूज़ कार्रवाई पर क्लिक किया जाएगा, तो SnoozeReceiver को एक इंटेंट मिलेगा और 60 सेकंड के बाद नई सूचना भेजने के लिए एक नया अलार्म बनाएगा.

  1. SnoozeReceiver.kt खोलें. यह क्लास, AlarmReceiver से मिलती-जुलती है, जिसका इस्तेमाल आप पहले कर चुके हैं. नीचे दिए गए चरणों में आप ऐसा कोड जोड़ेंगे जो SnoozeReceiver के onReceive() फ़ंक्शन को ट्रिगर करेगा. कम शब्दों में कहें, तो SnoozeReceiver में मौजूद कोड एक नया अलार्म बनाएगा, जो एक मिनट के बाद नई सूचना भेजेगा. onGet फ़ंक्शन में सबसे नीचे तक स्क्रोल करें, सिस्टम से नोटिफ़िकेशन मैनेजर का इंस्टेंस पाएं औरcancelAll को कॉल करें.
// SnoozeReceiver.kt
        val notificationManager = ContextCompat.getSystemService(
            context,
            NotificationManager::class.java
        ) as NotificationManager
        notificationManager.cancelAll()
  1. SnoozeReceiver का इस्तेमाल करने के लिए, NotificationUtils.kt खोलें.
  2. sendNotification() फ़ंक्शन में स्टाइल के ठीक बाद, SnoozeReceiver के लिए एक नया Intent snoozeIntent बनाएं.
  3. PendingIntent पर getBroadcast() तरीके को कॉल करके, इंटेंट बनाएं. ऐसा करने के लिए, नीचे दिए गए तरीके में पैरामीटर का इस्तेमाल करें. उपयोगकर्ता स्नूज़ बटन पर टैप करने के 60 सेकंड बाद, नई सूचना पोस्ट करने के लिए, सिस्टम उस PendingIntent का इस्तेमाल करेगा, जिसके लिए नया अलार्म सेट अप किया जाएगा.
  4. पहला पैरामीटर, ऐप्लिकेशन का वह संदर्भ होता है जिसमें PendingIntent को गतिविधि शुरू करनी चाहिए.
  5. दूसरा पैरामीटर अनुरोध कोड है, जो इस लंबित इंटेंट के लिए अनुरोध कोड है. अगर आपको इस लंबित इंटेंट को अपडेट या रद्द करना है, तो आपको इस कोड का उपयोग लंबित इंटेंट तक पहुंचने के लिए करना होगा.
  6. इसके बाद, snoozeIntent ऑब्जेक्ट जोड़ें, जो लॉन्च की जाने वाली गतिविधि का इंटेंट होता है.
  7. आखिर में, #FLAG_ONE_SHOT का फ़्लैग वैल्यू जोड़ें, क्योंकि इंटेंट का इस्तेमाल सिर्फ़ एक बार किया जाएगा. पहली बार टैप करने के बाद, तेज़ कार्रवाई और सूचना नहीं दिखेगी. इस वजह से, इंटेंट का इस्तेमाल सिर्फ़ एक बार किया जा सकता है.
// NotificationUtils.kt

// TODO: Step 2.2 add snooze action
val snoozeIntent = Intent(applicationContext, SnoozeReceiver::class.java)
val snoozePendingIntent: PendingIntent = PendingIntent.getBroadcast(
    applicationContext, 
    REQUEST_CODE, 
    snoozeIntent, 
    FLAGS
)
  1. इसके बाद, notificationBuilder पर addAction() फ़ंक्शन को कॉल करें. इस फ़ंक्शन में, उपयोगकर्ता को आपकी कार्रवाई के बारे में बताने के लिए एक आइकॉन और टेक्स्ट होना चाहिए. आपको snoozeIntent को भी जोड़ना होगा. आपकी कार्रवाई पर क्लिक होने के बाद, इस इंटेंट का इस्तेमाल boadcastReceiver को ट्रिगर करने के लिए किया जाएगा.
// NotificationUtils.kt
// TODO: Step 2.3 add snooze action
.addAction(
    R.drawable.egg_icon, 
    applicationContext.getString(R.string.snooze),
    snoozePendingIntent
)
  1. स्नूज़ करने की कार्रवाई को आज़माने के लिए, अंडे टाइमर ऐप्लिकेशन चलाएं.
  2. टाइमर चलाएं और ऐप्लिकेशन को बैकग्राउंड में रखें. टाइमर के पूरी हो जाने के बाद, सूचना को बड़ा करें और आपको दिखेगा कि सूचना में 'स्नूज़ करें' बटन है, जिससे अंडे टाइमर को अगले मिनट के लिए स्नूज़ कर दिया जाता है.

तीसरा चरण: सूचना की अहमियत

ज़रूरी जानकारी से यह तय होता है कि उपयोगकर्ता को देखने और सुनने में रुकावट कितनी आनी चाहिए. ज़्यादा ज़रूरी सूचनाएं, उपयोगकर्ताओं के काम में रुकावट डालती हैं.

आपको NotificationChannel कंस्ट्रक्टर में ज़रूरी लेवल बताना होगा. आपने शुरुआत में अंडे का टाइमर ऐप्लिकेशन के लिए कम अहमियत सेट की है. आप IMPORTANCE_NONE(0) से IMPORTANCE_HIGH(4) तक के पांच अहमियत लेवल में से एक का इस्तेमाल कर सकते हैं. आप किसी चैनल को जो अहमियत असाइन करते हैं वह उन सभी सूचना मैसेज पर लागू होती है जिन्हें आप चैनल पर पोस्ट करते हैं.

चैनल की अहमियत के लेवल

उपयोगकर्ता को दिखने वाला अहम लेवल

अहम जानकारी (Android 8.0 और इसके बाद वाले वर्शन)

प्राथमिकता (Android 7.1 और इससे पहले वाले वर्शन)

आवाज़ करता है और सावधान रहने की सूचना के तौर पर दिखता है (स्क्रीन पर सबसे ऊपर पॉप-अप होता है)

IMPORTANCE_HIGH

PRIORITY_HIGH / PRIORITY_MAX

आवाज़ होती है

IMPORTANCE_Default

PRIORITY_Default

कोई आवाज़ नहीं

IMPORTANCE_LOW

PRIORITY_LOW

कोई आवाज़ नहीं. रिकॉर्डिंग, स्टेटस बार में नहीं दिखती

IMPORTANCE_MIN

PRIORITY_MIN

सही प्राथमिकता लेवल चुनने के बारे में जानकारी के लिए, सूचनाएं डिज़ाइन करने की गाइड में जाकर, कोटेशन के प्राथमिकता लेवल &कोटेशन देखें. अपने ऐप्लिकेशन में सूचनाओं के लिए ज़रूरी लेवल चुनते समय आपको सावधान रहना चाहिए. चैनल की अहमियत को उपयोगकर्ता के समय और ध्यान को ध्यान में रखकर चुना जाना चाहिए. जब कोई ज़रूरी सूचना तुरंत नहीं दी जाती, तो इससे बेवजह अलार्म बन सकता है और आपका ध्यान भटक सकता है. उपयोगकर्ताओं के पास अपनी सूचनाओं के महत्व के स्तर पर पूरा नियंत्रण होता है, इसलिए अगर आप किसी परेशान करने वाली सूचना को बनाते हैं, तो वे आपके सूचना चैनल को पूरी तरह से बंद कर सकते हैं.

जब आपने पहली बार 1.6 चरण में सूचना बनाई, तो एग टाइमर को कम प्राथमिकता वाली सूचनाएं भेजने के लिए सेट किया गया, क्योंकि इसे उपयोगकर्ताओं को सूचनाओं से परेशान न करने के लिए डिज़ाइन किया गया था. हालांकि, अंडे को ज़्यादा संकेत देने से पहले उपयोगकर्ता का ध्यान आकर्षित करना एक अच्छा आइडिया है. सूचना की अहमियत बदलने के लिए, चैनल की सेटिंग से शुरुआत करें. चैनल ज़रूरी होने से, चैनल में पोस्ट की गई सभी सूचनाओं की रुकावट के लेवल पर असर पड़ता है और इसकी जानकारी NotificationChannel कंस्ट्रक्टर में दी जानी चाहिए.

  1. अपने ऐप्लिकेशन के सूचना चैनल का अहमियत लेवल बदलने के लिए, EggTimerFragment.kt खोलें और createChannel() पर जाएं. अहमियत के लेवल को IMPORTANCE_LOW से बदलकर IMPORTANCE_HIGH करें.
// EggTimerFragment.kt
    val notificationChannel = NotificationChannel(
        channelId,
        channelName,
        // TODO: Step 2.4 change importance
        NotificationManager.IMPORTANCE_HIGH
    )

Android 7.1 (एपीआई लेवल 25) या इससे पहले के वर्शन पर चल रहे डिवाइस के साथ काम करने के लिए, आपको हर सूचना के लिए, setPriority() पर कॉल करना होगा. इसके लिए, आपको NotificationCompat क्लास में प्राथमिकता स्थिर मान का इस्तेमाल करना होगा.

  1. NotificationUtils.kt खोलें और सूचना बिल्डर ऑब्जेक्ट में ये चीज़ें जोड़ें.
// NotificationUtils.kt
   .addAction(
       R.drawable.common_google_signin_btn_icon_dark,
       applicationContext.getString(R.string.snooze),
       snoozePendingIntent
    )
   // TODO: Step 2.5 set priority
    .setPriority(NotificationCompat.PRIORITY_HIGH)
  1. ऐप्लिकेशन चलाने से पहले, अपने डिवाइस या एम्युलेटर पर मौजूद ऐप्लिकेशन के आइकॉन पर क्लिक करके रखें. इसके बाद, 'अनइंस्टॉल करें' को चुनें और चैनल की पिछली सेटिंग मिटाएं. अगर आप ऐप्लिकेशन को अनइंस्टॉल नहीं करते हैं, तो चैनल की प्राथमिकता सेटिंग नहीं बदलेगी. साथ ही, सूचना पोस्ट होने के बाद व्यवहार में कोई बदलाव नहीं होगा.
  2. अब ऐप्लिकेशन फिर से चलाएं और टाइमर चालू करें. इस बार, जब सूचना डिलीवर की जाती है, तो आपको स्क्रीन पर सबसे ऊपर एक पॉप-अप दिखेगा. भले ही, आपका ऐप्लिकेशन फ़ोरग्राउंड में चल रहा हो या बैकग्राउंड में.

चौथा चरण: सूचना वाले बैज

सूचना वाले बैज, किसी भी ऐप्लिकेशन से जुड़ी सूचना आने पर, जुड़े हुए ऐप्लिकेशन के लॉन्चर आइकॉन पर दिखते हैं. सूचनाएं देखने के लिए, उपयोगकर्ता ऐप्लिकेशन आइकॉन को दबाकर रख सकते हैं.

ये डॉट डिफ़ॉल्ट रूप से बैज कहते हैं और ये आपके ऐप्लिकेशन के लिए ज़रूरी नहीं हैं. हालांकि, ऐसी स्थितियां भी हो सकती हैं जिनमें बैज आपकी सूचनाओं के मुताबिक न हो. इसलिए, आप इन्हें अपने NotificationChannel ऑब्जेक्ट पर setShowBadge(false) में कॉल करके हर चैनल के हिसाब से बंद कर सकते हैं. एग टाइमर में एक समय पर सिर्फ़ एक ही सूचना होती है, इसलिए आपके ऐप्लिकेशन के आइकॉन पर मौजूद बैज से आपके उपयोगकर्ताओं को कोई फ़ायदा नहीं होता. नीचे दिए गए चरणों में आप बैज बंद कर देंगे और सिर्फ़ अंडे के टाइमर की सूचना दिखाएंगे.

  1. एग टाइमर के लिए चैनल बनाने वाले कोड में setShowBadge(false) जोड़ें, ताकि बैज पाने की सुविधा बंद हो सके.
// EggTimerFragment.kt

    ).apply {
        // TODO: Step 2.6 disable badges for this channel
        setShowBadge(false)
    }
  1. ऐप्लिकेशन को फिर से चलाएं, टाइमर शुरू करें, और ऐप्लिकेशन आइकॉन को देखें. आपको ऐप्लिकेशन आइकॉन पर कोई बैज नहीं दिखेगा.

सॉल्यूशन कोड, आपके डाउनलोड किए गए कोड के मास्टर ब्रांच में होता है.

  • इसका इस्तेमाल करके सूचना बनाने, भेजने, अपडेट करने, और रद्द करने के लिए, NotificationsManager क्लास का इस्तेमाल करें.
  • सूचना के लिए चैनल सेट करने के लिए, createNotificationChannel तरीके के साथ, सूचना चैनल ऑब्जेक्ट का इस्तेमाल करें.
  • सूचना में तुरंत कार्रवाइयां जोड़ने के लिए, addAction() का इस्तेमाल करें.
  • बैज चालू या बंद करने के लिए, setShowBadge() का इस्तेमाल करें.
  • सूचना.शैली से बढ़ाई जाने वाली शैलियों का इस्तेमाल करके अपनी सूचनाओं की शैली बनाएं
  • NotificationsChannel.setImportance() से अहमियत लेवल सेट करें

Udcity कोर्स:

Android डेवलपर दस्तावेज़:

इस कोर्स में दिए गए दूसरे कोडलैब के लिंक के लिए, Kotlin कोडलैब के लैंडिंग पेज में ऐडवांस्ड Android देखें.