Android की सूचनाएं पाने की सुविधा का इस्तेमाल करना

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

परिचय

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

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

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

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

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

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

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

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

आपको क्या सीखने को मिलेगा

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

आपको क्या करना होगा

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

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

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

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

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

GitHub से रिपॉज़िटरी का क्लोन बनाएं और starter ब्रांच पर स्विच करें.

$  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. इसके बाद, आपको अपनी सूचना के लिए यूनीक आईडी और बिल्डर से मिले notify() ऑब्जेक्ट के साथ notify() को कॉल करना होगा.Notification

यह आईडी, सूचना के मौजूदा इंस्टेंस को दिखाता है. इस सूचना को अपडेट करने या रद्द करने के लिए, इसकी ज़रूरत होती है. आपके ऐप्लिकेशन में एक समय पर सिर्फ़ एक सूचना चालू होगी. इसलिए, सभी सूचनाओं के लिए एक ही आईडी का इस्तेमाल किया जा सकता है. इसके लिए, आपको 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)

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

  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. सेटिंग की सूची में जाकर, सूचनाएं को चुनें. आपको सूचनाएं दिखाएं सेटिंग के ठीक नीचे, Egg नाम का एक नया चैनल दिखेगा.

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

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

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

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

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

  1. AlarmReceiver.kt खोलें, NotificationManager का एक इंस्टेंस खोलें, और मैसेज के टेक्स्ट और कॉन्टेक्स्ट पैरामीटर के साथ 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 खोलें और पहले चरण के लिए सूचना कोड हटाएं.
// 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 और लॉन्च की जाने वाली गतिविधि, MainActivity::class.java के साथ Intent बनाएं.
// 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 को ऐक्सेस करने वाले ऐप्लिकेशन की प्रोसेस बंद हो जाती है, तब भी PendingIntent का इस्तेमाल उन दूसरी प्रोसेस से किया जा सकेगा जिनके लिए इसे ऐक्सेस करने की अनुमति दी गई है. इस मामले में, सिस्टम आपकी ओर से ऐप्लिकेशन खोलने के लिए, लंबित इंटेंट का इस्तेमाल करेगा. इससे कोई फ़र्क़ नहीं पड़ता कि टाइमर ऐप्लिकेशन चल रहा है या नहीं.

  1. applicationContext, NOTIFICATION_ID, पिछले चरण में बनाया गया contentIntent, और PendingIntent फ़्लैग का इस्तेमाल करके PendingIntent बनाएं. PendingIntent फ़्लैग, नया PendingIntent बनाने या किसी मौजूदा PendingIntent का इस्तेमाल करने का विकल्प तय करता है. आपको फ़्लैग के तौर पर PendingIntent.FLAG_UPDATE_CURRENT सेट करना होगा, क्योंकि अगर कोई सूचना पहले से मौजूद है, तो आपको नई सूचना नहीं बनानी है. इस तरह, आपको मौजूदा PendingIntent में बदलाव करना होगा. यह 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. resources से इमेज लोड करके शुरू करें. इसके लिए, BitmapFactory का इस्तेमाल करें.
// 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 में मौजूद कोड, एक नया अलार्म बनाएगा. इससे एक मिनट बाद नई सूचना भेजी जाएगी. onReceive फ़ंक्शन के सबसे नीचे तक स्क्रोल करें. सिस्टम से notificationManager का इंस्टेंस पाएं और 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() तरीके को कॉल करके, एक पेंडिंग इंटेंट बनाएं. इसके लिए, आपको यहां दिए गए चरणों में पैरामीटर देने होंगे. इस PendingIntent का इस्तेमाल सिस्टम, नया अलार्म सेट अप करने के लिए करेगा. इससे उपयोगकर्ता के स्नूज़ बटन पर टैप करने के 60 सेकंड बाद, नई सूचना पोस्ट की जा सकेगी.
  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

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

पहले चरण में सूचना बनाते समय, अंडे के टाइमर को कम प्राथमिकता वाली सूचनाएं भेजने के लिए सेट किया गया था.ऐसा इसलिए किया गया था, ताकि उपयोगकर्ता को सूचनाओं से परेशान न किया जाए. हालांकि, अंडे के ज़्यादा पकने से पहले उपयोगकर्ता का ध्यान खींचना बेहतर हो सकता है. सूचना के अहमियत के लेवल को बदलने के लिए, चैनल की सेटिंग से शुरुआत करें. चैनल की अहमियत से, चैनल में पोस्ट की गई सभी सूचनाओं के इंटरप्शन लेवल पर असर पड़ता है. इसे 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() को कॉल करना होगा. इसके लिए, 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. ऐप्लिकेशन को फिर से चलाएं, टाइमर शुरू करें, और ऐप्लिकेशन के आइकॉन पर नज़र रखें. आपको ऐप्लिकेशन के आइकॉन पर कोई बैज नहीं दिखेगा.

सोल्यूशन कोड, डाउनलोड किए गए कोड की मास्टर ब्रांच में मौजूद होता है.

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

Udacity का कोर्स:

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

इस कोर्स में मौजूद अन्य कोडलैब के लिंक के लिए, Advanced Android in Kotlin कोडलैब का लैंडिंग पेज देखें.