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

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

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

स्थायी सूचनाओं को एक साथ दिखाना

घटक

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


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

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

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

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

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

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

इस्तेमाल करने के तरीके

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

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