Android API लेवल 26 से, फ़ोरग्राउंड सेवाओं के लिए लगातार सूचनाएं पाना ज़रूरी होता है. यह ज़रूरी इसलिए है, ताकि आप उन सेवाओं को न छिपाएं जिनकी वजह से सिस्टम के संसाधनों पर बहुत ज़्यादा मांग हो सकती है, जिसमें खास तौर पर बैटरी शामिल है. इस ज़रूरी शर्त से एक संभावित समस्या पैदा होती है: अगर कोई ऐप्लिकेशन कई फ़ोरग्राउंड सेवाओं वाला ऐप्लिकेशन सूचना को सावधानी से मैनेज नहीं करता, ताकि उसे सभी सेवाओं पर शेयर किया जा सके, तो ऐसी कई सूचनाएं लगातार आ सकती हैं जिन्हें खारिज नहीं किया जा सकता. इसकी वजह से, सूचनाओं की चालू सूची में अनचाहे अड़चनें आ सकती हैं.
जब नेविगेशन SDK जैसे SDK टूल इस्तेमाल किए जाते हैं, तो यह समस्या और भी बड़ी हो जाती है. SDK टूल, फ़ोरग्राउंड सेवाओं को ऐप्लिकेशन के अलावा, स्वतंत्र रूप से और लगातार चलाते रहते हैं. ऐसे SDK टूल की मदद से, इन ऐप्लिकेशन को एक साथ लगातार सूचनाएं भेजना मुश्किल हो जाता है.
इन समस्याओं को हल करने के लिए, नेविगेशन SDK v1.11 में एक आसान एपीआई लॉन्च किया गया है. इसकी मदद से, SDK टूल के साथ-साथ ऐप्लिकेशन में लगातार मिलने वाली सूचनाओं को मैनेज किया जा सकता है.
घटक
फ़ोरग्राउंड सेवा मैनेजर, Android की फ़ोरग्राउंड सेवा की क्लास और स्थायी सूचना क्लास के आस-पास रैपर उपलब्ध कराता है. इस रैपर का मुख्य काम सूचना आईडी को दोबारा इस्तेमाल करना है, ताकि मैनेजर का इस्तेमाल करके उस सूचना को फ़ोरग्राउंड सभी सेवाओं पर शेयर किया जा सके.
नेविगेशन SDK टूल में, ForegroundServiceManager
सिंगलटन शुरू करने और पाने के स्टैटिक तरीके शामिल हैं. इस सिंगलटन को नेविगेशन SDK टूल के लाइफ़टाइम में
सिर्फ़ एक बार शुरू किया जा सकता है. ऐसे में, अगर आपने किसी एक इनिशलाइज़ेशन कॉल (initForegroundServiceManagerMessageAndIntent()
या
initForegroundServiceManagerProvider()
) का इस्तेमाल किया है, तो आपको इसे एक ट्राई-कैच ब्लॉक के साथ घेर लेना चाहिए, ताकि पाथ फिर से डाला जा सके. अगर किसी भी तरीके को एक से ज़्यादा बार कॉल किया जाता है, तो नेविगेशन SDK टूल रनटाइम अपवाद को दिखाता है. ऐसा तब तक होता है, जब तक कि आप ForegroundServiceManager
के सभी रेफ़रंस साफ़ न कर दें और हर एक कॉल से पहले clearForegroundServiceManager()
को कॉल न करें.
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 "";
}
}
}
NotificationContentProviderImpl
बनाने के बाद, यहां दिए गए कोड का इस्तेमाल करके, नेविगेशन SDK टूल को उससे कनेक्ट किया जा सकता है:
ForegroundServiceManager f = NavigationApi.getForegroundServiceManager(getApplication());
mNotification = new NotificationContentProviderImpl(getApplication());
NavigationApi.clearForegroundServiceManager();
NavigationApi.initForegroundServiceManagerProvider(getApplication(), null, mNotification);
चेतावनियां और आने वाले समय की योजनाएं
initForegroundServiceManagerMessageAndIntent()
याinitForegroundServiceManagerProvider()
को पहले ही कॉल करना न भूलें, ताकि अनुमानित इस्तेमाल की जानकारी अच्छी तरह से तय की जा सके. नया नेविगेटर बनाने से पहले, आपको इस तरीके को कॉल करना होगा.- अगर कोड पाथवे एक से ज़्यादा बार डाला गया है, तो
initForegroundServiceManagerMessageAndIntent()
याinitForegroundServiceManagerProvider()
पर किए गए कॉल के अपवादों को पकड़ना न भूलें. नेविगेशन SDK टूल के v2.0 वर्शन में, इस तरीके को कई बार कॉल करने पर, रनटाइम अपवाद के बजाय जांच किया गया अपवाद दिखता है. - हेडर स्टाइल से मेल खाने वाली सूचना के पूरे समय तक, स्टाइल को एक जैसा बनाए रखने के लिए, Google को अब भी कुछ काम करना पड़ सकता है.
- सूचना देने वाली कंपनी को तय करने के बाद, आपके पास सबसे पहले, सूचना देने वाले व्यक्ति के व्यवहार को कंट्रोल करने का विकल्प होता है.
- Google मोड़-दर-मोड़ जानकारी पाने के लिए कोई ऐसा आसान तरीका उपलब्ध नहीं कराता है जिसे सूचना देने वाली कंपनी सूचना में शामिल कर सके.