शेयर की जाने वाली स्थायी सूचनाएं

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

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

स्थायी सूचनाओं को इकट्ठा करना

घटक

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


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

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

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

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

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

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

इस्तेमाल की स्थितियां

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

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

चेतावनियां और आने वाले समय की योजनाएं

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