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

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

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

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

घटक

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


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

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

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

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

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

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

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

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

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