6

मैं एक लगातार अधिसूचना एक सेवा द्वारा निर्धारित का उपयोग कर दूर करने के लिए घंटे के लिए कोशिश कर रहा है:NotificationManager.cancel() मेरे लिए काम नहीं करता

startForeground(1337, notification); 

कोड मैं इसे रद्द करने के लिए उपयोग कर रहा हूँ:

NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
nManager.cancel(1337); // cancel existing service notification, doesn't take effect 
nManager.cancelAll(); //surpluous, but also doesn't take effect 

मुझे यहां क्या याद आ रही है? मैं परेशान हूँ

यह स्पष्ट करने के लिए कि मैं ऐसा क्यों कर रहा हूं: सेवा डिफ़ॉल्ट निरंतर अधिसूचना के साथ शुरू होती है। जब मेरा ऐप चलता है, तो उसे इस अधिसूचना को दूसरे के साथ बदलना होगा। मौजूदा अधिसूचना पर notify() का उपयोग पूरी तरह से काम करता है, हालांकि, मुझे नई अधिसूचना के लिए टिकर टेक्स्ट दिखाने के लिए भी इसकी आवश्यकता है। यही कारण है कि मैंने मौजूदा अधिसूचना (ऊपर दिए गए कोड का उपयोग करके) को हटाने का फैसला किया, एक नया निर्माण किया, और फिर मैं startForeground() पर दोबारा कॉल करता हूं और इसे नई अधिसूचना पास करता हूं, इसलिए मेरी सेवा बनी रहती है।

+0

आप एक अलग एप्लिकेशन से शुरू की गई अधिसूचना को हटाने का प्रयास कर रहे हैं? – matt5784

+0

नहीं, यह वही अनुप्रयोग है – slinden77

उत्तर

11

समस्या यह है कि आप startForeground() का उपयोग कर अप्रत्यक्ष तरीके से अधिसूचना जारी कर रहे हैं। फोरग्राउंड सेवा शुरू करते समय सिस्टम आपको अधिसूचना प्रदान करने पर जोर देकर उसी अधिसूचना के लिए अधिसूचना को रद्द नहीं कर सकता है। जब तक आपकी अग्रभूमि सेवा चल रही है, तब तक अधिसूचना होगी।

ज्यादातर मामलों में, सेवाओं को वास्तव में अग्रभूमि में नहीं होना चाहिए। यदि आप अपनी सेवा के लिए सामान्य प्राथमिकता का उपयोग कर सकते हैं, तो आप सामान्य रूप से अपनी अधिसूचना शुरू कर सकते हैं और रोक सकते हैं।

यदि आप वास्तव में कुछ ऐसा कर रहे हैं जो वास्तव में अग्रभूमि सेवा की आवश्यकता है, और यदि आप वास्तव में उपयोगकर्ता को एक टिकर टेक्स्ट दिखाना चाहते हैं, तो मेरा मानना ​​है कि आपका एकमात्र विकल्प एक और अधिसूचना जारी करना है।

+7

उन्हें वास्तव में इसे दस्तावेज़ीकरण में रखना चाहिए या जब इसे प्रयास किया जाता है तो यह एक त्रुटि फेंक देता है ... – slinden77

6

आप हमेशा कॉलिंग स्टॉपॉर्गग्राउंड (बूलियन हटाने नोटिफिकेशन) द्वारा अग्रभूमि सेवा से अधिसूचना हटा सकते हैं। फिर एक सेवा अपने अग्रभूमि से बाहर निकलती है और स्मृति की आवश्यकता होने पर सिस्टम द्वारा एक बार फिर से मारा जा सकता है।

0

आप खाली बिल्डर में गुजरकर अधिसूचना अपडेट कर सकते हैं।

if(showNotification){ 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
      .setVisibility(Notification.VISIBILITY_SECRET) 
      .setSmallIcon(R.mipmap.ic_spotify_white_24dp) 
      .setTicker("Playing Now") 
      .setContentTitle("Spotify") 
      .setContentText("Preview"); 
    return mBuilder; 
}else{ 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); 
    return mBuilder; 
}