मोबाइल नोटिफ़िकेशन इकट्ठा करें

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

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

हमेशा दिखने वाली सूचनाओं को एक साथ देखना

घटक

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


Navigation SDK टूल में, ForegroundServiceManager सिंगलटन को शुरू करने और पाने के लिए स्टैटिक तरीके मौजूद होते हैं. इस सिंगलटन को Navigation SDK के लाइफ़टाइम में सिर्फ़ एक बार शुरू किया जा सकता है. इसलिए, अगर किसी एक शुरू करने के कॉल (initForegroundServiceManagerMessageAndIntent() या initForegroundServiceManagerProvider()) का इस्तेमाल किया जाता है, तो आपको उसे try-catch ब्लॉक के साथ इस्तेमाल करना चाहिए, ताकि उस पाथ को फिर से डालने पर कोई गड़बड़ी न हो. अगर किसी भी तरीके को एक से ज़्यादा बार कॉल किया जाता है, तो Navigation SDK एक रनटाइम अपवाद दिखाता है. ऐसा तब तक होता रहेगा, जब तक कि हर कॉल से पहले ForegroundServiceManager के सभी रेफ़रंस को हटाकर clearForegroundServiceManager() को कॉल नहीं किया जाता.

initForegroundServiceManagerMessageAndIntent() के चार पैरामीटर ये हैं: application, notificationId, defaultMessage, और resumeIntent. अगर आखिरी तीन पैरामीटर शून्य हैं, तो सूचना स्टैंडर्ड नेविगेशन SDK सूचना है. इस सूचना के पीछे, ऐप्लिकेशन में मौजूद अन्य फ़ोरग्राउंड सेवाओं को अब भी छिपाया जा सकता है. notificationId पैरामीटर से, सूचना के लिए इस्तेमाल किए जाने वाले सूचना आईडी की जानकारी मिलती है. अगर यह वैल्यू शून्य है, तो किसी भी वैल्यू का इस्तेमाल किया जाता है. इसे साफ़ तौर पर सेट किया जा सकता है, ताकि अन्य सूचनाओं के साथ होने वाली गड़बड़ियों से बचा जा सके. जैसे, किसी दूसरे SDK से मिलने वाली सूचनाएं. defaultMessage एक स्ट्रिंग है, जो तब दिखती है, जब सिस्टम नेविगेट नहीं कर रहा होता. resumeIntent एक ऐसा इंटेंट है जो सूचना पर क्लिक करने पर ट्रिगर होता है. अगर resumeIntent शून्य है, तो सूचना पर किए गए क्लिक को अनदेखा कर दिया जाता है.

initForegroundServiceManagerProvider() के तीन पैरामीटर ये हैं: application, notificationId, और notificationProvider. अगर आखिरी दो पैरामीटर शून्य हैं, तो सूचना स्टैंडर्ड Navigation SDK सूचना है. notificationId पैरामीटर से उस सूचना आईडी की जानकारी मिलती है जिसका इस्तेमाल सूचना के लिए किया जाना चाहिए. अगर यह शून्य है, तो किसी भी वैल्यू का इस्तेमाल किया जाता है. इसे साफ़ तौर पर सेट किया जा सकता है, ताकि अन्य सूचनाओं के साथ होने वाली गड़बड़ियों को ठीक किया जा सके. जैसे, किसी दूसरे SDK से मिलने वाली सूचनाएं. अगर notificationProvider सेट है, तो सूचना को रेंडर करने के लिए, सेवा देने वाली कंपनी हमेशा ज़िम्मेदार होती है.

Navigation SDK टूल का getForegroundServiceManager() तरीका, फ़ोरग्राउंड सेवा मैनेजर सिंगलटन दिखाता है. अगर आपने अब तक कोई यूआरएल जनरेट नहीं किया है, तो इसका मतलब है कि आपने notificationId, defaultMessage, और resumeIntent के लिए, शून्य पैरामीटर के साथ initForegroundServiceManagerMessageAndIntent() को कॉल किया है.

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

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

इस्तेमाल के उदाहरण

इस सेक्शन में, शेयर की गई सूचनाओं के इस्तेमाल के उदाहरणों के बारे में बताया गया है.

ऐप्लिकेशन की फ़ोरग्राउंड सेवाओं की लगातार मिलने वाली सूचनाएं छिपाना
सबसे आसान तरीका यह है कि मौजूदा व्यवहार को बनाए रखा जाए और नेविगेशन SDK टूल की जानकारी को रेंडर करने के लिए, सिर्फ़ लगातार दिखने वाली सूचना का इस्तेमाल किया जाए. फ़ोरग्राउंड सेवा मैनेजर startForeground() और stopForeground() तरीकों का इस्तेमाल करके, अन्य सेवाएं इस सूचना के पीछे छिप सकती हैं.
अन्य ऐप्लिकेशन की फ़ोरग्राउंड सेवाओं की लगातार दिखने वाली सूचनाएं छिपाएं, लेकिन नेविगेट न करने पर दिखने वाला डिफ़ॉल्ट टेक्स्ट सेट करें
दूसरा आसान तरीका यह है कि मौजूदा व्यवहार को बनाए रखा जाए और नेविगेशन SDK टूल की जानकारी को रेंडर करने के लिए, सिर्फ़ तब सूचनाएं दिखाई जाएं, जब सिस्टम नेविगेट न कर रहा हो. जब सिस्टम नेविगेट नहीं कर रहा होता है, तो initForegroundServiceManagerMessageAndIntent() के लिए दी गई स्ट्रिंग दिखती है. यह स्ट्रिंग, डिफ़ॉल्ट नेविगेशन SDK स्ट्रिंग के बजाय दिखती है. इस स्ट्रिंग में "Google Maps" का ज़िक्र होता है. इस कॉल का इस्तेमाल, फिर से शुरू करने का इंटेंट सेट करने के लिए भी किया जा सकता है. यह इंटेंट, सूचना पर क्लिक करने पर ट्रिगर होता है.
हमेशा दिखने वाली सूचना को रेंडर करने की प्रोसेस को पूरी तरह से कंट्रोल करना
आखिरी स्थिति में, सूचना देने वाली सेवा देने वाली कंपनी को तय करना और बनाना ज़रूरी है. साथ ही, इसे initForegroundServiceManagerProvider() का इस्तेमाल करके ForegroundServiceManager को भेजना होगा. इस विकल्प की मदद से, यह तय किया जा सकता है कि सूचना में क्या दिखाया जाए. हालांकि, इससे नेविगेशन SDK टूल की सूचना से जुड़ी जानकारी भी सूचना से हट जाती है. इससे सूचना में, बारी-बारी से निर्देश देने वाले काम के प्रॉम्प्ट नहीं दिखते. Google, इस जानकारी को हासिल करने और सूचना में डालने का आसान तरीका उपलब्ध नहीं कराता.

सूचना देने वाली सेवा देने वाली कंपनी का उदाहरण

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

public class NotificationContentProviderImpl
   extends NotificationContentProviderBase
   implements NotificationContentProvider {
 private String channelId;
 private Context context;
 private String message;

 /** Constructor */
 public NotificationContentProviderImpl(Application application) {
   super(application);
   message = "-- uninitialized --";
   channelId = null;
   this.context = application;
 }

 /**
  * Sets message to display in the notification. Calls updateNotification
  * to display the message immediately.
  *
  * @param msg The message to display in the notification.
  */
 public void setMessage(String msg) {
   message = msg;
   updateNotification();
 }

 /**
  * Returns the notification as it should be rendered.
  */
 @Override
 public Notification getNotification() {
   Notification notification;

   if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
     Spanned styledText = Html.fromHtml(message, FROM_HTML_MODE_LEGACY);
     String channelId = getChannelId(context);
     notification =
         new Notification.Builder(context, channelId)
             .setContentTitle("Notifications Demo")
             .setStyle(new Notification.BigTextStyle()
                 .bigText(styledText))
             .setSmallIcon(R.drawable.ic_navigation_white_24dp)
             .setTicker("ticker text")
             .build();
   } else {
     notification = new Notification.Builder(context)
         .setContentTitle("Notification Demo")
         .setContentText("testing non-O text")
         .build();
   }

   return notification;
 }

 // Helper to set up a channel ID.
 private String getChannelId(Context context) {
   if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
     if (channelId == null) {
       NotificationManager notificationManager =
           (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
       NotificationChannel channel = new NotificationChannel(
           "default", "navigation", NotificationManager.IMPORTANCE_DEFAULT);
       channel.setDescription("For navigation persistent notification.");
       notificationManager.createNotificationChannel(channel);
       channelId = channel.getId();
     }
     return channelId;
   } else {
     return "";
   }
 }
}

NotificationContentProviderImpl बनाने के बाद, यहां दिए गए कोड का इस्तेमाल करके, नेविगेशन SDK टूल को उससे कनेक्ट करें:

ForegroundServiceManager f = NavigationApi.getForegroundServiceManager(getApplication());
mNotification = new NotificationContentProviderImpl(getApplication());
NavigationApi.clearForegroundServiceManager();
NavigationApi.initForegroundServiceManagerProvider(getApplication(), null, mNotification);

सावधानियां और आने वाले समय के प्लान

  • initForegroundServiceManagerMessageAndIntent() या initForegroundServiceManagerProvider() को जल्दी कॉल करें, ताकि इस्तेमाल के अनुमानित तरीके के बारे में अच्छी तरह से जानकारी दी जा सके. नया नेविगेटर बनाने से पहले, आपको यह तरीका कॉल करना होगा.
  • अगर कोड पाथ एक से ज़्यादा बार डाला गया है, तो initForegroundServiceManagerMessageAndIntent() या initForegroundServiceManagerProvider() को कॉल करने से जुड़ी अपवादों को ज़रूर पकड़ें. Navigation SDK v2.0 में, इस तरीके को कई बार कॉल करने पर, रनटाइम एक्सप्शन के बजाय, एक चेक किया गया अपवाद दिखता है.
  • Google को अब भी सूचना के पूरे जीवनकाल के दौरान, हेडर की स्टाइल से मैच करने वाली स्टाइल को एक जैसा रखने के लिए काम करना पड़ सकता है.
  • सूचना देने वाली सेवा तय करने पर, प्राथमिकता की मदद से हेड्स-अप की सुविधा को कंट्रोल किया जा सकता है.
  • Google, सूचना देने वाली सेवा देने वाली कंपनी के लिए, हर मोड़ की जानकारी पाने का आसान तरीका उपलब्ध नहीं कराता.