यह कोडलैब, 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 में खोला जा सकता है.
- Android Studio में ऐप्लिकेशन खोलें और चलाएं.
आपको अंडे की एक इमेज दिखेगी. साथ ही, अंडे को पकाने के लिए पहले से तय की गई समयावधि की सूची वाला एक ड्रॉपडाउन मेन्यू दिखेगा. सॉफ़्ट बॉयल ड्रॉप-डाउन मेन्यू के लिए, त्रिकोण पर क्लिक करें. सूची में पहला विकल्प, जांच के लिए दिया गया है. इससे अलार्म सिर्फ़ 10 सेकंड के लिए सेट होता है. सूची के बगल में एक स्विच होता है. इससे एग टाइमर शुरू होता है. इस स्विच का इस्तेमाल करके, जब चाहें एग टाइमर को शुरू और बंद किया जा सकता है. स्टार्टर कोड पूरी तरह से काम करता है. इसका मतलब है कि एग टाइमर सेट अप किया जा सकता है और उसे 0 तक गिनती करते हुए देखा जा सकता है. टाइमर खत्म होने के बाद, नीचे दिए गए उदाहरण की तरह एक सूचना दिखती है.
- सोर्स कोड की जांच करें. स्टार्टर ऐप्लिकेशन में,
MainActivity
नाम की एक ही ऐक्टिविटी होती है.receiver
,ui
, औरutil
नाम के तीन सब पैकेज हैं.
- /receiver—
receiver
पैकेज में दो ब्रॉडकास्ट रिसीवर हैं, जिनके नामAlarmReceiver
औरSnoozeReceiver
हैं.AlarmReceiver
कोAlarmManager
ट्रिगर करता है, ताकि उपयोगकर्ता के तय किए गए समय पर सूचना भेजी जा सके.SnoozeReceiver
कुकी, सूचना को कुछ समय के लिए बंद करने के लिए उपयोगकर्ता के क्लिक को मैनेज करती है. - /ui—इसमें
EggTimerFragment
होता है, जो ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) का हिस्सा होता है.EggTimerViewModel
, टाइमर को शुरू और बंद करने के साथ-साथ ऐप्लिकेशन के लाइफ़साइकल से जुड़े अन्य टास्क के लिए ज़िम्मेदार होता है. - /util—इस पैकेज में दो फ़ाइलें हैं.
BindingUtils.kt
में बाइंडिंग अडैप्टर होते हैं. इनकी मदद से, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) औरViewModel
के बीच डेटा बाइंडिंग की जा सकती है.NotificationUtils.kt
के पासNotificationManager
पर एक्सटेंशन के तरीके हैं.
सूचनाओं का इस्तेमाल करके, अपने ऐप्लिकेशन की ओर लोगों का ध्यान खींचना एक बेहतरीन तरीका है. भले ही, आपका ऐप्लिकेशन न चल रहा हो या फ़ोरग्राउंड में चल रहा हो, सूचना से स्क्रीन के सबसे ऊपर एक पॉप-अप विंडो दिखेगी. इसमें आवाज़ या वाइब्रेशन भी शामिल हो सकता है. सूचना बनाने के लिए, आपको सूचना बिल्डर का इस्तेमाल करना होगा. साथ ही, टाइटल टेक्स्ट, कॉन्टेंट टेक्स्ट, और आइकॉन देना होगा. बिल्डर के पास सभी ज़रूरी फ़ील्ड होने के बाद, NotificationManager
, जो कि एक सिस्टम सेवा है, इस कॉन्टेंट को सूचना के तौर पर दिखाने में आपकी मदद करती है. NotificationManager
सूचना भेजने, उसके कॉन्टेंट को अपडेट करने, और सूचना को रद्द करने के लिए ज़िम्मेदार है. यहां दिए गए चरणों में, NotificationManager
में एक्सटेंशन के तरीके जोड़े जाएंगे. इस तरह, जब भी आपको NotificationManager
का इस्तेमाल करना होगा, तब इन एक्सटेंशन फ़ंक्शन का इस्तेमाल करके, अपनी ज़रूरत के हिसाब से काम किया जा सकेगा.
पहला चरण: बुनियादी सूचना बनाना
इस टास्क में, आपको एक नई सूचना बनानी है. साथ ही, अपने उपयोगकर्ता के लिए एक मैसेज सेट करना है और सूचना भेजनी है.
NotificationUtils.kt
क्लास खोलें औरTODO: Step 1.1
ढूंढें. आपको इस कोडलैब और ऐप्लिकेशन कोड में मिलते-जुलते काम दिखेंगे.- दिए गए
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) {
- सूचना बिल्डर का एक इंस्टेंस पाएं. इसके लिए, ऐप्लिकेशन का कॉन्टेक्स्ट और चैनल आईडी पास करें. चैनल आईडी, चैनल के लिए स्ट्रिंग वैल्यू होती है.
सूचना के चैनल, सूचनाओं को ग्रुप करने का एक तरीका है. एक जैसी सूचनाओं को एक साथ ग्रुप करके, डेवलपर और उपयोगकर्ता चैनल की सभी सूचनाओं को कंट्रोल कर सकते हैं. चैनल बनाने के बाद, इसका इस्तेमाल कितनी भी सूचनाएं भेजने के लिए किया जा सकता है.
//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)
)
- अपने ऐप्लिकेशन को दिखाने के लिए सूचना आइकॉन सेट करें. साथ ही, उपयोगकर्ता को देने के लिए मैसेज का टाइटल और कॉन्टेंट टेक्स्ट सेट करें. कोड लैब में, आपको सूचना को और ज़्यादा पसंद के मुताबिक बनाने के लिए ज़्यादा विकल्प दिखेंगे. हालांकि, सूचना भेजने के लिए आपको कम से कम इतना डेटा सेट करना होगा.
//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)
- इसके बाद, आपको अपनी सूचना के लिए यूनीक आईडी और बिल्डर से मिले
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())
ui/EggTimerViewModel.kt
खोलें औरstartTimer()
फ़ंक्शन ढूंढें. जब उपयोगकर्ता एग टाइमर चालू करता है, तो यह फ़ंक्शन चुने गए समय के हिसाब से अलार्म सेट करता है.- जब उपयोगकर्ता टाइमर शुरू करे, तब इस फ़ंक्शन में सूचना ट्रिगर करें. पहले लागू किए गए
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)
आपने करीब-करीब सभी चरणों को पूरा कर लिया है. हालांकि, अगर आपने अभी ऐप्लिकेशन चालू किया और टाइमर सेट किया, तो आपको सूचना नहीं मिलेगी.
logcat
खोलें और"No Channel found"
खोजें. आपको गड़बड़ी का एक मैसेज दिखेगा, जिसमें बताया जाएगा किegg_channel
मौजूद नहीं है. यहां दिए गए चरणों में, आपको सूचना चैनलों के बारे में ज़्यादा जानकारी मिलेगी. साथ ही, इस समस्या को ठीक करने का तरीका भी बताया जाएगा.
दूसरा चरण: सूचना के चैनल
एपीआई लेवल 26 से, सभी सूचनाओं को किसी चैनल को असाइन करना ज़रूरी है. ऐप्लिकेशन लॉन्चर आइकॉन को दबाकर रखें. इसके बाद, ऐप्लिकेशन की जानकारी चुनें और सूचनाएं पर टैप करें. आपको ऐप्लिकेशन से जुड़े सूचना चैनल की सूची दिखेगी. फ़िलहाल, यह सूची खाली है, क्योंकि आपके ऐप्लिकेशन ने कोई चैनल नहीं बनाया है.
चैनल, सूचनाओं के "टाइप" को दिखाते हैं. उदाहरण के लिए, अंडे उबालने वाला टाइमर, अंडे उबल जाने पर सूचना भेज सकता है. साथ ही, रोज़ाना सुबह नाश्ते में अंडे खाने की याद दिलाने के लिए, किसी दूसरे चैनल का इस्तेमाल कर सकता है. किसी चैनल की सभी सूचनाओं को एक साथ ग्रुप किया जाता है. साथ ही, उपयोगकर्ता पूरे चैनल के लिए सूचना सेटिंग कॉन्फ़िगर कर सकते हैं. इससे उपयोगकर्ता, अपनी पसंद के हिसाब से सूचनाएं पाने के लिए सेटिंग को अपनी पसंद के मुताबिक बना सकते हैं. उदाहरण के लिए, आपके उपयोगकर्ता नाश्ते की सूचनाएं पाने की सुविधा बंद कर सकते हैं. हालांकि, वे टाइमर की सूचनाएं पाने की सुविधा चालू रख सकते हैं.
डेवलपर, चैनल में मौजूद सभी सूचनाओं पर लागू होने वाली शुरुआती सेटिंग, प्राथमिकता, और व्यवहार सेट करते हैं. शुरुआती सेटिंग सेट करने के बाद, उपयोगकर्ता इन सेटिंग को बदल सकते हैं.
पहले चरण में आपने egg_notification_channel_id
को सूचना चैनल के तौर पर इस्तेमाल किया था.इसलिए, अब आपको इस चैनल की सूचना सेटिंग और व्यवहार को अपनी पसंद के मुताबिक बनाना होगा.
EggTimerFragment.kt
खोलें औरcreateChannel()
फ़ंक्शन ढूंढें.NotificationChannel
के कंस्ट्रक्टर को यूनीक चैनल आईडी पास करें.- सूचना चैनल का नाम पास करें. यह नाम उपयोगकर्ताओं को उनकी सेटिंग स्क्रीन पर भी दिखेगा.
- आखिरी पैरामीटर के तौर पर, सूचना चैनल के लिए प्राथमिकता का लेवल पास करें. इस कोडलैब में, बाद में अहमियत के लेवल के बारे में बताया जाएगा. इसलिए, फ़िलहाल
NotificationManag
er.IMPORTANCE_LOW
का इस्तेमाल किया जा सकता है. notificationChannel
ऑब्जेक्ट पर,enableLights
को सही पर सेट करें. इस सेटिंग को चालू करने पर, सूचना दिखने पर लाइटें चालू हो जाएंगी.- सूचना दिखाए जाने पर लाल लाइट दिखाने के लिए,
notificationChannel
ऑब्जेक्ट सेटlightColor
को लाल रंग पर सेट करें. - वाइब्रेशन की सुविधा चालू करने के लिए,
notificationChannel
ऑब्जेक्ट मेंenableVibration
को सही पर सेट करें. notificationChannel
ऑब्जेक्ट पर, चैनल के ब्यौरे को‘Time for breakf
ast' पर सेट करें.getSystemService()
को कॉल करके,NotificationManager
का इंस्टेंस पाएं.-
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
}
- इसके बाद, चैनल बनाने के लिए आपको अभी लिखे गए
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.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)
)
- ऐप्लिकेशन चलाएं. आपको दिखेगा कि टाइमर शुरू करने पर, ऐप्लिकेशन हर बार एक सूचना भेजता है.
- स्टेटस बार को नीचे खींचें और देखें कि सूचना का टाइटल, कॉन्टेंट, और आइकॉन वही है जो आपने पिछले चरणों में सेट किया था.
- नए चैनल की पुष्टि करने के लिए, ऐप्लिकेशन बंद करें और ऐप्लिकेशन का आइकॉन ढूंढें. ऐप्लिकेशन के आइकॉन पर दबाकर रखें और ऐप्लिकेशन की जानकारी चुनें.
- सेटिंग की सूची में जाकर, सूचनाएं को चुनें. आपको सूचनाएं दिखाएं सेटिंग के ठीक नीचे, Egg नाम का एक नया चैनल दिखेगा.
ऐप्लिकेशन चलाने पर, अब सूचना दिखती है. ऐप्लिकेशन डेवलपर और उपयोगकर्ता, दोनों के पास इस चैनल पर भेजी जाने वाली सभी सूचनाओं की सेटिंग और उनके व्यवहार को पसंद के मुताबिक बनाने का विकल्प होता है. बधाई हो, आपने एक सूचना बना ली है!
तीसरा चरण: अपने ऐप्लिकेशन में सूचनाएं पाने की सुविधा जोड़ना
अब तक, हमने Notifications API के बुनियादी इस्तेमाल के बारे में जाना. हालांकि, टाइमर शुरू होने के तुरंत बाद सूचना भेजने का कोई मतलब नहीं है. उपयोगकर्ता शायद यह सूचना पाना चाहें कि अंडा कब तैयार होगा. कोड लैब के इस हिस्से में, इस समस्या को ठीक किया जाएगा. साथ ही, टोस्ट मैसेज को सूचना में बदला जाएगा.
आपने सूचना पहले ही भेज दी है और यह भी देख लिया है कि यह उपयोगकर्ताओं को कैसे दिखती है. हालांकि, यह बेहतरीन सूचनाएं बनाने का सिर्फ़ पहला चरण था. इस चरण में, सूचना भेजने के समय में बदलाव किया जाएगा, ताकि उसे ज़्यादा सही समय पर भेजा जा सके.
आपका ऐप्लिकेशन, अलार्म सेट अप करने के लिए AlarmManager
का इस्तेमाल करता है. AlarmManager
से जुड़ा कोड, स्टार्टर कोड में पहले से दिया गया है. इसका इस्तेमाल, सूचना वाला मैसेज दिखाने के लिए किया जाता है. AlarmManager
, चुने गए समय को ट्रैक करता है. समय पूरा होने पर, यह AlarmReceiver.kt
के onReceive()
फ़ंक्शन को ट्रिगर करेगा. AlarmReceiver.kt
खोलें और onReceive()
पर जाएं. आपको वह सूचना दिखेगी जो हर बार टाइमर सेट अप करने पर दिखती है.
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
)
- इसके अलावा, सूचना को हटाया जा सकता है, क्योंकि टाइमर खत्म होने पर आपका ऐप्लिकेशन एक सूचना भेजेगा.
// AlarmReceiver.kt
// TODO: Step 1.10 [Optional] remove toast
// Toast.makeText(
// context,
// context.getText(R.string.eggs_ready),
// Toast.LENGTH_SHORT
// ).show()
- अपना ऐप्लिकेशन चलाएं . टाइमर शुरू करने पर और टाइमर खत्म होने पर, आपको सूचना दिखनी चाहिए.
यह सही तरीका नहीं है. आपको अपने उपयोगकर्ताओं को बहुत ज़्यादा सूचनाएं नहीं भेजनी हैं. आपके पास पहली सूचना को हटाने का विकल्प होता है. यह सूचना तब भेजी जाती है, जब उपयोगकर्ता टाइमर शुरू करता है.
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)
- ऐप्लिकेशन को फिर से चलाएं.
- टाइमर सेट करें, इसे बैकग्राउंड में रखें, और टाइमर पूरा होने तक इंतज़ार करें. आपको एक सूचना दिखेगी. यह सूचना ज़्यादा काम की है.
चौथा चरण: कॉन्टेंट का मकसद जोड़ना
- अगर ऐप्लिकेशन पहले से नहीं चल रहा है, तो उसे फिर से चलाएं.
- सूचना पर क्लिक करें. कुछ नहीं होता!
सूचना दिखाना और उपयोगकर्ता को जानकारी देना अच्छी बात है. हालांकि, जब कोई उपयोगकर्ता किसी सूचना पर क्लिक करता है, तो वह उससे जुड़े ऐप्लिकेशन पर वापस जाने की उम्मीद करता है. इस कोडलैब के इस हिस्से में, अपनी सूचना में एक इंटेंट जोड़ा जाएगा, ताकि उपयोगकर्ता को टाइमर स्क्रीन पर वापस लाया जा सके.
Intent
एक मैसेजिंग ऑब्जेक्ट है. इसका इस्तेमाल किसी अन्य ऐप्लिकेशन कॉम्पोनेंट से किसी ऐक्शन का अनुरोध करने के लिए किया जा सकता है. इंटेंट का इस्तेमाल, किसी गतिविधि या सेवा को शुरू करने या ब्रॉडकास्ट करने के लिए किया जा सकता है. इस मामले में, इस इंटेंट का इस्तेमाल करके सिस्टम को यह बताया जाता है कि जब उपयोगकर्ता सूचना पर टैप करे, तो MainActivity
को खोल दिया जाए. आपके ऐप्लिकेशन में सिर्फ़ एक व्यू है. इसलिए, आपके पास यहां ज़्यादा विकल्प नहीं हैं. हालांकि, बड़े ऐप्लिकेशन में सूचना इस तरह से दिखनी चाहिए कि उपयोगकर्ता को बेहतर अनुभव मिले. इसके लिए, सूचना पर क्लिक करने के बाद उपयोगकर्ता को ऐसी स्क्रीन पर ले जाना चाहिए जो सूचना के हिसाब से सही हो.
NotificationUtils.kt
खोलें औरsendNotification()
एक्सटेंशन फ़ंक्शन ढूंढें.- अपनी
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
का इस्तेमाल उन दूसरी प्रोसेस से किया जा सकेगा जिनके लिए इसे ऐक्सेस करने की अनुमति दी गई है. इस मामले में, सिस्टम आपकी ओर से ऐप्लिकेशन खोलने के लिए, लंबित इंटेंट का इस्तेमाल करेगा. इससे कोई फ़र्क़ नहीं पड़ता कि टाइमर ऐप्लिकेशन चल रहा है या नहीं.
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
)
- अपनी सूचना में
PendingIntent
पास करें. इसके लिए,NotificationBuilder
परsetContentIntent()
को कॉल करें. अब सूचना पर क्लिक करने पर,PendingIntent
ट्रिगर हो जाएगा और आपकीMainActivity
खुल जाएगी. - साथ ही,
setAutoCancel()
कोtrue
पर सेट करें, ताकि जब उपयोगकर्ता सूचना पर टैप करे, तो उसे ऐप्लिकेशन पर ले जाया जाए और सूचना अपने-आप खारिज हो जाए.
// NotificationUtils.kt
// TODO: Step 1.13 set content intent
.setContentIntent(contentPendingIntent)
.setAutoCancel(true)
- ऐप्लिकेशन को फिर से चलाएं.
- टाइमर सेट करें, ऐप्लिकेशन को बैकग्राउंड में रखें, और सूचना दिखने का इंतज़ार करें.
- सूचना दिखने के बाद, स्टेटस बार को नीचे खींचकर सूचना पर क्लिक करें. देखें कि ऐप्लिकेशन को फ़ोरग्राउंड में कैसे लाया जाता है.
पांचवां चरण: सूचना रद्द करना
आपके पास सूचनाएं पाने की सुविधा वाला एक टाइमर है, लेकिन इसमें एक छोटी सी समस्या है. अगर आपने टाइमर सेट किया है, सूचना पाई है, और फिर से टाइमर सेट किया है, तो नया टाइमर चालू होने के दौरान, पिछली सूचना स्टेटस बार पर बनी रहती है. अगर ऐप्लिकेशन बैकग्राउंड में चल रहा है, तो इससे उपयोगकर्ता को उलझन हो सकती है. साथ ही, अंडे ठीक से नहीं पक सकते.
इस समस्या को ठीक करने के लिए, नया टाइमर शुरू करते समय पिछली सूचना को खारिज करें. सबसे पहले, अपने NotificationUtils.kt
में एक और एक्सटेंशन फ़ंक्शन बनाएं. NotificationManager
में, सभी चालू सूचनाओं को रद्द करने के लिए एक एपीआई है. इसे cancelAll
()
कहा जाता है.
NotificationsUtil.kt
खोलें.NotificationManager
पर एक एक्सटेंशन फ़ंक्शन जोड़ें, जोcancelAll()
को कॉल करता है.
// NotificationUtils.kt
// TODO: Step 1.14 Cancel all notifications
/**
* Cancels all notifications.
*
*/
fun NotificationManager.cancelNotifications() {
cancelAll()
}
EggTimerViewModel.kt
खोलें औरstartTimer()
फ़ंक्शन पर जाएं.startTimer()
के अंदर, सिस्टम सेNotificationManager
का इंस्टेंस पाएं औरcancelNotifications()
को कॉल करें.
// EggTimerViewModel.kt
//TODO Step 1.15 call cancel notification
val notificationManager =
ContextCompat.getSystemService(
app,
NotificationManager::class.java
) as NotificationManager
notificationManager.cancelNotifications()
- ऐप्लिकेशन चलाएं और टाइमर शुरू करें.
- सूचना दिखने के बाद, टाइमर को फिर से शुरू करें. देखें कि हमारा ऐप्लिकेशन, स्टेटस बार से पिछली सूचना को अपने-आप कैसे मिटा देता है.
सूचना फ़्रेमवर्क, डेवलपर को कई तरह के विकल्पों के ज़रिए सूचनाओं को पसंद के मुताबिक बनाने की सुविधा देता है. इससे डेवलपर, अपनी ज़रूरत के हिसाब से कस्टम ऐक्शन सेट कर सकते हैं और सूचनाओं को स्टाइल कर सकते हैं. इस टास्क के दौरान, आपको एग टाइमर की सूचनाओं को अपनी पसंद के मुताबिक बनाने का तरीका बताया जाएगा.
पहला चरण: सूचना को स्टाइल करना
अपनी ज़रूरतों और सूचना के कॉन्टेंट के हिसाब से सूचना को स्टाइल करने पर, आपकी सूचनाएं अलग दिखेंगी. साथ ही, वे आपके ऐप्लिकेशन के एक्सटेंशन की तरह दिखेंगी. सूचना फ़्रेमवर्क में, आपकी मदद करने के लिए कई बिल्ट-इन स्टाइल शामिल होती हैं. हालांकि, आपके पास हमेशा अपनी स्टाइल बनाने का विकल्प होता है.
NotificationCompat
में इन चीज़ों के लिए पहले से मौजूद स्टाइल उपलब्ध हैं:
BigTextStyle
, जिसमें टेक्स्ट का बड़ा ब्लॉक दिख सकता है. जैसे, बड़ा किए जाने पर ईमेल का कॉन्टेंट दिखता है.BigPictureStyle
, जिसमें बड़े फ़ॉर्मैट वाली सूचनाएं दिखती हैं. इनमें बड़ी इमेज अटैचमेंट के तौर पर शामिल होती है.InboxStyle
में बातचीत के स्टाइल वाला टेक्स्ट कॉन्टेंट दिखाया गया है.MediaStyle
, जो मीडिया प्लेबैक के कंट्रोल दिखाता है.MessagingStyle
, इसमें बड़े फ़ॉर्मैट वाली सूचनाएं दिखती हैं. इनमें कई लोगों के बीच हुए कई मैसेज शामिल होते हैं.
बड़ी की जा सकने वाली सूचना बनाएं के दस्तावेज़ में, आपको अन्य स्टाइल के बारे में ज़्यादा जानकारी मिल सकती है. इस चरण में, आपको NotificationCompat.BigPictureStyle
का इस्तेमाल करके, बड़ी की जा सकने वाली सूचना बनानी होगी. बड़ी करने पर, सूचना में अंडे की बड़ी इमेज दिखेगी.
NotificationUtils.kt
खोलें औरsendNotification()
फ़ंक्शन ढूंढें.resources
से इमेज लोड करके शुरू करें. इसके लिए,BitmapFactory
का इस्तेमाल करें.
// NotificationUtils.kt
// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
applicationContext.resources,
R.drawable.cooked_egg
)
- एक नया
BigPictureStyle
बनाएं और अपनी इमेज सेट करें. 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)
setStyle()
कोbigPicStyle
पर सेट करके स्टाइल सेट करें.setLargeIcon()
के साथ बड़े आइकॉन कोeggImage
पर सेट करें, ताकि सूचना को छोटा करने पर इमेज, छोटे आइकॉन के तौर पर दिखे.
// NotificationUtils.kt
// TODO: Step 2.1 add style to builder
.setStyle(bigPicStyle)
.setLargeIcon(eggImage)
- ऐप्लिकेशन चालू करें और टाइमर सेट करें. जब सूचना पहली बार दिखती है, तो सूचना की दराज में यह छोटी होती है. सूचना को बड़ा करने पर, सूचना वाले बड़े हिस्से में एक बड़ी इमेज दिखती है.
दूसरा चरण: सूचना से जुड़ी कार्रवाइयां
सूचनाओं में अपनी पसंद के मुताबिक बदलाव करने के लिए, सूचना से जुड़ी कार्रवाइयां भी जोड़ी जा सकती हैं. फ़िलहाल, सूचनाओं पर क्लिक करने से उपयोगकर्ताओं को आपके ऐप्लिकेशन पर रीडायरेक्ट किया जाता है. सूचना पर डिफ़ॉल्ट रूप से मौजूद इस कार्रवाई के अलावा, ऐक्शन बटन भी जोड़े जा सकते हैं. इनसे सूचना में ही ऐप्लिकेशन से जुड़ा कोई टास्क पूरा किया जा सकता है.
किसी सूचना में ज़्यादा से ज़्यादा तीन ऐक्शन बटन हो सकते हैं. इनसे उपयोगकर्ता तुरंत जवाब दे सकता है. जैसे, किसी रिमाइंडर को स्नूज़ करना या किसी टेक्स्ट मैसेज का जवाब देना. इन ऐक्शन बटन से, वही कार्रवाई नहीं होनी चाहिए जो उपयोगकर्ता के सूचना पर टैप करने से होती है.
ऐक्शन बटन जोड़ने के लिए, बिल्डर पर मौजूद addAction()
फ़ंक्शन को PendingIntent
पास करें. यह setContentIntent()
को कॉल करके, सूचना के डिफ़ॉल्ट टैप ऐक्शन को सेट अप करने जैसा है. हालांकि, इसमें गतिविधि लॉन्च करने के बजाय, कई अन्य काम किए जा सकते हैं. उदाहरण के लिए, BroadcastReceiver
शुरू करना, जो बैकग्राउंड में काम करता है, ताकि कार्रवाई से पहले से खुले हुए ऐप्लिकेशन में रुकावट न आए.
इस कोडलैब में, आपको पहले से ही BoadcastReceiver
नाम का SnoozeReceiver
दिया गया है. आपको SnoozeReceiver
का इस्तेमाल करना होगा, ताकि उपयोगकर्ता को सूचना पर क्लिक करने की सुविधा मिल सके. यहां दिए गए चरणों में, आपको कोड जोड़ना होगा. इससे, जब उपयोगकर्ता स्नूज़ ऐक्शन बटन पर क्लिक करेगा, तब अंडे के टाइमर की सूचना 60 सेकंड के लिए स्नूज़ हो जाएगी. सूचना को कुछ समय के लिए बंद करने की कार्रवाई पर क्लिक करने पर, SnoozeReceiver
को एक इंटेंट मिलेगा. इसके बाद, वह 60 सेकंड के बाद नई सूचना भेजने के लिए, एक नया अलार्म बनाएगा.
SnoozeReceiver.kt
खोलें. यह क्लास,AlarmReceiver
जैसी ही है जिसका इस्तेमाल आपने पहले किया था. यहां दिए गए चरणों में, आपको ऐसा कोड जोड़ना होगा जोSnoozeReceiver
केonReceive()
फ़ंक्शन को ट्रिगर करेगा. संक्षेप में,SnoozeReceiver
में मौजूद कोड, एक नया अलार्म बनाएगा. इससे एक मिनट बाद नई सूचना भेजी जाएगी. onReceive फ़ंक्शन के सबसे नीचे तक स्क्रोल करें. सिस्टम से notificationManager का इंस्टेंस पाएं और cancelAll को कॉल करें.
// SnoozeReceiver.kt
val notificationManager = ContextCompat.getSystemService(
context,
NotificationManager::class.java
) as NotificationManager
notificationManager.cancelAll()
SnoozeReceiver
का इस्तेमाल करने के लिए,NotificationUtils.kt
खोलें.-
sendNotification()
फ़ंक्शन में स्टाइल के ठीक बाद,SnoozeReceiver
के लिए नयाIntent
snoozeIntent
बनाएं. PendingIntent
परgetBroadcast()
तरीके को कॉल करके, एक पेंडिंग इंटेंट बनाएं. इसके लिए, आपको यहां दिए गए चरणों में पैरामीटर देने होंगे. इसPendingIntent
का इस्तेमाल सिस्टम, नया अलार्म सेट अप करने के लिए करेगा. इससे उपयोगकर्ता के स्नूज़ बटन पर टैप करने के 60 सेकंड बाद, नई सूचना पोस्ट की जा सकेगी.- पहला पैरामीटर, ऐप्लिकेशन का वह कॉन्टेक्स्ट होता है जिसमें इस
PendingIntent
को गतिविधि शुरू करनी चाहिए. - दूसरा पैरामीटर, अनुरोध कोड होता है. यह इस लंबित इंटेंट के लिए अनुरोध कोड होता है. अगर आपको इस लंबित इंटेंट को अपडेट करना है या रद्द करना है, तो आपको इस कोड का इस्तेमाल करके लंबित इंटेंट को ऐक्सेस करना होगा.
- इसके बाद,
snoozeIntent
ऑब्जेक्ट जोड़ें. यह लॉन्च की जाने वाली गतिविधि का इंटेंट होता है. - आखिर में,
#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
)
- इसके बाद,
notificationBuilder
परaddAction()
फ़ंक्शन को कॉल करें. इस फ़ंक्शन को एक आइकॉन और एक टेक्स्ट की ज़रूरत होती है, ताकि उपयोगकर्ता को आपकी कार्रवाई के बारे में बताया जा सके. आपकोsnoozeIntent
भी जोड़ना होगा. इस इंटेंट का इस्तेमाल, आपकी कार्रवाई पर क्लिक किए जाने पर सहीboadcastReceiver
को ट्रिगर करने के लिए किया जाएगा.
// NotificationUtils.kt
// TODO: Step 2.3 add snooze action
.addAction(
R.drawable.egg_icon,
applicationContext.getString(R.string.snooze),
snoozePendingIntent
)
- स्नूज़ करने की सुविधा को आज़माने के लिए, टाइमर ऐप्लिकेशन चलाएं.
- टाइमर शुरू करें और ऐप्लिकेशन को बैकग्राउंड में रखें. टाइमर खत्म होने के बाद, सूचना को बड़ा करें. आपको दिखेगा कि सूचना में अब स्नूज़ करने का बटन है. इस बटन को दबाकर, अंडे के टाइमर को एक मिनट के लिए स्नूज़ किया जा सकता है.
तीसरा चरण: सूचना की प्राथमिकता
अहमियत से यह तय होता है कि सूचना, उपयोगकर्ता को विज़ुअल और ऑडियो के हिसाब से कितनी बार दिखेगी. ज़्यादा ज़रूरी सूचनाएं, लोगों के लिए ज़्यादा रुकावट पैदा करेंगी.
आपको NotificationChannel
कंस्ट्रक्टर में अहमियत का लेवल बताना होगा. आपने एग टाइमर ऐप्लिकेशन के लिए, सूचनाओं को कम ज़रूरी के तौर पर सेट किया था. सूचनाओं को IMPORTANCE_NONE(0)
से लेकर IMPORTANCE_HIGH(4)
तक, पांच में से किसी भी लेवल पर सेट किया जा सकता है. किसी चैनल को असाइन किया गया अहमियत का लेवल, उस पर पोस्ट किए गए सभी सूचना मैसेज पर लागू होता है.
चैनल के अहमियत के लेवल
उपयोगकर्ता को दिखने वाला अहमियत का लेवल | अहमियत (Android 8.0 और इसके बाद के वर्शन) | प्राथमिकता (Android 7.1 और इससे पहले के वर्शन) |
इससे आवाज़ आती है और यह सूचना, स्क्रीन पर सबसे ऊपर दिखने वाली सूचना के तौर पर दिखती है | ||
आवाज़ करता है | ||
कोई ध्वनि नहीं | ||
इन सूचनाओं से किसी तरह की आवाज़ नहीं होती और ये स्टेटस बार में नहीं दिखती हैं |
प्राथमिकता का सही लेवल चुनने के बारे में जानकारी पाने के लिए, सूचनाओं के डिज़ाइन से जुड़ी गाइड में "प्राथमिकता के लेवल" लेख पढ़ें. आपको अपने ऐप्लिकेशन में सूचनाओं के लिए, अहमियत का लेवल चुनते समय सावधानी बरतनी चाहिए. चैनल की अहमियत का लेवल चुनते समय, उपयोगकर्ता के समय और ध्यान को ध्यान में रखना चाहिए. जब किसी गैर-ज़रूरी सूचना को ज़रूरी सूचना के तौर पर दिखाया जाता है, तो इससे बेवजह डर पैदा हो सकता है और ध्यान भटक सकता है. उपयोगकर्ताओं के पास, सूचनाओं के महत्व के लेवल को कंट्रोल करने का पूरा अधिकार होता है. इसलिए, अगर आपने कोई परेशान करने वाली सूचना बनाई है, तो वे सूचनाएं पाने के लिए आपके चैनल को पूरी तरह से बंद कर सकते हैं.
पहले चरण में सूचना बनाते समय, अंडे के टाइमर को कम प्राथमिकता वाली सूचनाएं भेजने के लिए सेट किया गया था.ऐसा इसलिए किया गया था, ताकि उपयोगकर्ता को सूचनाओं से परेशान न किया जाए. हालांकि, अंडे के ज़्यादा पकने से पहले उपयोगकर्ता का ध्यान खींचना बेहतर हो सकता है. सूचना के अहमियत के लेवल को बदलने के लिए, चैनल की सेटिंग से शुरुआत करें. चैनल की अहमियत से, चैनल में पोस्ट की गई सभी सूचनाओं के इंटरप्शन लेवल पर असर पड़ता है. इसे NotificationChannel
कंस्ट्रक्टर में तय किया जाना चाहिए.
- अपने ऐप्लिकेशन के सूचना चैनल का अहमियत लेवल बदलने के लिए,
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
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)
- ऐप्लिकेशन चलाने से पहले, अपने डिवाइस या एम्युलेटर पर ऐप्लिकेशन के आइकॉन पर दबाकर रखें. इसके बाद, पिछली चैनल सेटिंग मिटाने के लिए, अनइंस्टॉल करें को चुनें. अगर ऐप्लिकेशन को अनइंस्टॉल नहीं किया जाता है, तो चैनल की प्राथमिकता वाली सेटिंग में कोई बदलाव नहीं होगा. इससे सूचना पोस्ट किए जाने पर, कोई बदलाव नहीं होगा.
- अब ऐप्लिकेशन को फिर से चलाएं और टाइमर शुरू करें. इस बार, सूचना मिलने पर आपको स्क्रीन के सबसे ऊपर एक पॉप-अप दिखेगा. इससे कोई फ़र्क़ नहीं पड़ता कि आपका ऐप्लिकेशन फ़ोरग्राउंड में चल रहा है या बैकग्राउंड में.
चौथा चरण: सूचना वाले बैज
सूचना वाले बैज, छोटे डॉट होते हैं. ये किसी ऐप्लिकेशन से जुड़ी सूचना मिलने पर, उसके लॉन्चर आइकॉन पर दिखते हैं. उपयोगकर्ता, सूचनाएं देखने के लिए ऐप्लिकेशन के आइकॉन को दबाकर रख सकते हैं.
इन बिंदुओं को बैज कहा जाता है. ये डिफ़ॉल्ट रूप से दिखते हैं. इसके लिए, आपके ऐप्लिकेशन को कुछ भी करने की ज़रूरत नहीं है. हालांकि, कुछ मामलों में ऐसा हो सकता है कि बैज आपकी सूचनाओं के लिए काम के न हों. इसलिए, NotificationChannel
ऑब्जेक्ट पर setShowBadge(false)
को कॉल करके, इन्हें हर चैनल के हिसाब से बंद किया जा सकता है. एग टाइमर में एक समय पर सिर्फ़ एक सूचना चालू होती है. इसलिए, आपके ऐप्लिकेशन के आइकॉन पर मौजूद बैज से लोगों को ज़्यादा फ़ायदा नहीं मिलता. यहां दिए गए तरीके से, बैज को बंद किया जा सकता है. साथ ही, सिर्फ़ अंडे के आकार वाले टाइमर की सूचना दिखाई जा सकती है.
- बैज बंद करने के लिए, अंडे के टाइमर के चैनल बनाने के कोड में
setShowBadge(false)
जोड़ें.
// EggTimerFragment.kt
).apply {
// TODO: Step 2.6 disable badges for this channel
setShowBadge(false)
}
- ऐप्लिकेशन को फिर से चलाएं, टाइमर शुरू करें, और ऐप्लिकेशन के आइकॉन पर नज़र रखें. आपको ऐप्लिकेशन के आइकॉन पर कोई बैज नहीं दिखेगा.
सोल्यूशन कोड, डाउनलोड किए गए कोड की मास्टर ब्रांच में मौजूद होता है.
- NotificationManager क्लास का इस्तेमाल करके, सूचना बनाई जा सकती है, भेजी जा सकती है, अपडेट की जा सकती है, और रद्द की जा सकती है.
- सूचना के लिए चैनल सेट करने के लिए, createNotificationChannel तरीके के साथ NotificationChannel ऑब्जेक्ट का इस्तेमाल करें.
- किसी सूचना में क्विक ऐक्शन जोड़ने के लिए, addAction() का इस्तेमाल करें.
- बैज दिखाने या छिपाने के लिए, setShowBadge() का इस्तेमाल करें.
- Notification.Style से एक्सटेंड होने वाली स्टाइल का इस्तेमाल करके, सूचनाओं को स्टाइल करें
- NotificationChannel.setImportance() का इस्तेमाल करके, सूचना के लिए प्राथमिकता का लेवल सेट करें
Udacity का कोर्स:
Android डेवलपर का दस्तावेज़:
इस कोर्स में मौजूद अन्य कोडलैब के लिंक के लिए, Advanced Android in Kotlin कोडलैब का लैंडिंग पेज देखें.