Android एपीआई लेवल 26 से, फ़ोरग्राउंड सेवाओं के लिए लगातार सूचनाएं भेजना ज़रूरी है. इस ज़रूरी शर्त को इसलिए सेट किया गया है, ताकि डिवाइस को छिपने से रोका जा सके ऐसी सेवाओं की वजह से, सिस्टम के संसाधनों की ज़रूरत बहुत ज़्यादा पड़ सकती है. इनमें, बैटरी का ख़ास ख्याल रखा जाता है. इस ज़रूरी शर्त की वजह से एक समस्या हो सकती है: अगर कई फ़ोरग्राउंड सेवाओं वाला कोई ऐप्लिकेशन, सूचना को ध्यान से मैनेज नहीं करता, ताकि वह सभी सेवाओं पर शेयर की जा सके, तो लगातार दिखने वाली कई ऐसी सूचनाएं हो सकती हैं जिन्हें खारिज नहीं किया जा सकता. इससे सूचनाओं की चालू सूची में ग़ैर-ज़रूरी सूचनाएं दिखने लगती हैं.
नेविगेशन जैसे 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()
का तरीका, फ़ोरग्राउंड सेवा मैनेजर सिंगलटन दिखाता है. अगर आपने अब तक जनरेट नहीं किया है, तो
यह initForegroundServiceManagerMessageAndIntent()
को कॉल करने के बराबर है
notificationId
, defaultMessage
, और इसके लिए शून्य पैरामीटर वाले
resumeIntent
.
ForegroundServiceManager
को इस्तेमाल करने के तीन आसान तरीके हैं. पहले दो, किसी सेवा को फ़ोरग्राउंड में और उससे बाहर ले जाने के लिए होते हैं. आम तौर पर, इन्हें बनाई गई सेवा से ही कॉल किया जाता है. इन तरीकों का इस्तेमाल करने से यह पक्का होता है कि सेवाएं, शेयर की गई सूचना से जुड़ी हों. फ़ाइनल
तरीका, updateNotification()
, उस मैनेजर को फ़्लैग करता है कि सूचना में
बदला गया हो और उसे फिर से रेंडर किया जाना चाहिए.
अगर आपको शेयर की गई सूचना को पूरी तरह से कंट्रोल करना है, तो एपीआई, सूचना देने वाली सेवा को तय करने के लिए NotificationContentProvider
इंटरफ़ेस उपलब्ध कराता है. इसमें मौजूदा कॉन्टेंट के साथ सूचना पाने का एक ही तरीका होता है. इससे आपको बेस क्लास भी मिलती है. इससे आपको ये काम करने में मदद मिलती है
कंपनी के बारे में बताने के लिए, इसका इस्तेमाल करें. बेस क्लास के मुख्य क्लास में से एक
का मकसद है कि यह updateNotification()
को कॉल करने का तरीका
ForegroundServiceManager
को ऐक्सेस करना होगा. अगर आप
सूचना देने वाली कंपनी को नए मैसेज पाने हैं, तो आप इस
इंटरनल तरीके का इस्तेमाल करें.
इस्तेमाल के उदाहरण
इस सेक्शन में, शेयर की गई सूचनाओं को इस्तेमाल करने के उदाहरणों के बारे में बताया गया है.
- ऐप्लिकेशन की फ़ोरग्राउंड सेवाओं की अन्य सूचनाओं को लगातार छिपाएं
- सबसे आसान स्थिति, मौजूदा व्यवहार को बनाए रखना और सिर्फ़
नेविगेशन 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()
एक से ज़्यादा बार डाला गया. नेविगेशन SDK टूल v2.0 में, इस तरीके को कॉल करें कई बार रनटाइम अपवाद के बजाय एक जांचे गए अपवाद देता है. - हो सकता है कि Google अभी भी आपके ब्राउज़र पर एक जैसी स्टाइलिंग बनाए रखने के लिए हेडर स्टाइल से मेल खाने वाली सूचना की लाइफ़टाइम वैल्यू.
- सूचना देने वाली कंपनी तय करते समय, चेतावनी देने की सुविधा को कंट्रोल किया जा सकता है को प्राथमिकता दें.
- Google, मोड़-दर-मोड़ जानकारी पाने के लिए कोई आसान तरीका उपलब्ध नहीं कराता है ऐसी जानकारी जिसे सूचना देने वाली कंपनी, सूचना में डाल सकती है.