2011-11-27 10 views
8

मेरे ऐप में, मैं अग्रभूमि में मेरी सेवा जगह का उपयोग करके हत्या किए जाने से रोकने के लिए:क्या अधिसूचना अद्यतन करना किसी सेवा की अग्रभूमि स्थिति को हटा देता है?

startForeground(NOTIFY_ID, notification); 

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

notification.setLatestEventInfo(getApplicationContext(), someString, someOtherString, contentIntent); 
mNotificationManager.notify(NOTIFY_ID, notification); 

प्रश्न यह है कि: क्या यह सेवा को इसके विशेष अग्रभूमि स्थिति से बाहर कर देगा?

this answer में, CommonsWare इंगित करता है कि यह व्यवहार संभव है, लेकिन वह निश्चित नहीं है। तो क्या कोई वास्तविक जवाब जानता है?


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

+1

Btw, हालांकि आप एक मौजूदा अधिसूचना के पाठ अद्यतन कर सकते हैं, तो आप टिकर पाठ किसी दिए गए अधिसूचना के लिए एक बार से अधिक स्थिति पट्टी में दिखाई देते हैं, भले ही आप बदल नहीं कर सकते यह - कम से कम अधिसूचना का उपयोग नहीं कर रहा है। FLAG_ONGOING_EVENT। मौजूदा अधिसूचना के लिए नया टिकर टेक्स्ट दिखाने के लिए, आपको अधिसूचना रद्द करना होगा और फिर इसे पुनरारंभ करना होगा। –

उत्तर

9

एंड्रॉइड डेवलपर साइट पर RandomMusicPlayer ऐप एक अग्रभूमि सेवा की अधिसूचना को अद्यतन करने के लिए अधिसूचना प्रबंधक का उपयोग करता है, तो संभावनाएं बहुत अच्छी हैं कि यह अग्रभूमि स्थिति को बरकरार रखती है।

(setUpAsForeground() और updateNotification() देखें MusicService.java कक्षा में।)

से मैं क्या समझ, अगर आप अधिसूचना को रद्द सेवा एक अग्रभूमि सेवा किया जा रहा संघर्ष है, तो रखें कि मन में होगा; अगर आप अधिसूचना रद्द करते हैं, तो आपको सेवा की अग्रभूमि स्थिति को पुनर्स्थापित करने के लिए फिर से शुरू करने के लिए startForeground() को कॉल करना होगा।

8

स्पष्ट करने के लिए यहाँ क्या कहा गया है:

मैं क्या समझ से, अगर आप अधिसूचना सेवा एक अग्रभूमि सेवा किया जा रहा संघर्ष करेंगे रद्द, तो रखें कि मन में; यदि आप अधिसूचना को रद्द करते हैं, तो आपको सेवा की अग्रभूमि स्थिति को पुनर्स्थापित करने के लिए startForeground() को फिर से पर कॉल करने की आवश्यकता होगी।

जवाब के इस भाग को सुझाव है कि यह लगातार Notification पर NotificationManager.cancel() का उपयोग करके चल रहे एक Notification एक Service द्वारा निर्धारित दूर करने के लिए संभव है। यह सच नहीं है। NotificationManager.cancel() का उपयोग कर startForeground() द्वारा जारी अधिसूचना सेट को निकालना असंभव है।

इसे हटाने का एकमात्र तरीका stopForeground(true) पर कॉल करना है, इसलिए जारी अधिसूचना हटा दी गई है, जो कि Service अग्रभूमि में होने से रोकता है। तो यह वास्तव में चारों ओर एक और तरीका है; Service अग्रभूमि में नहीं रुकता है क्योंकि Notification रद्द कर दिया गया है, Notification केवल Service को अग्रभूमि में रखने से रोक दिया जा सकता है।

स्वाभाविक रूप से startForeground() को इस नए के बाद Notification के साथ राज्य को पुनर्स्थापित करने के लिए कॉल कर सकता है। एक कारण यह है कि आप ऐसा करना चाहते हैं यदि टिकर टेक्स्ट को फिर से दिखाना है, क्योंकि यह केवल पहली बार चला जाएगा जब Notification प्रदर्शित होता है।

यह व्यवहार दस्तावेज नहीं है, और मैंने यह पता लगाने की कोशिश में 4 घंटे बर्बाद कर दिए कि मैं Notification क्यों नहीं हटा सका। NotificationManager.cancel() doesn't work for me

2

आप एक अधिसूचना startForeground (द्वारा निर्धारित अपडेट करना चाहते हैं जब), बस एक नया notication निर्माण और फिर इसे सूचित करने के लिए NotificationManager का उपयोग करें: यहां मुद्दा यह है पर अधिक।

मुख्य बिंदु एक ही अधिसूचना आईडी का उपयोग करना है।

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

उदाहरण:

private static final int notif_id=1; 

@Override 
public void onCreate(){ 
    this.startForeground(); 
} 

private void startForeground() { 
     startForeground(notif_id, getMyActivityNotification("")); 
} 

private Notification getMyActivityNotification(String text){ 
     // The PendingIntent to launch our activity if the user selects 
     // this notification 
     CharSequence title = getText(R.string.title_activity); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 
       0, new Intent(this, MyActivity.class), 0); 

     return new Notification.Builder(this) 
       .setContentTitle(title) 
       .setContentText(text) 
       .setSmallIcon(R.drawable.ic_launcher_b3) 
       .setContentIntent(contentIntent).getNotification();  
} 
/** 
this is the method that can be called to update the Notification 
*/ 
private void updateNotification() { 

       String text = "Some text that will update the notification"; 

       Notification notification = getMyActivityNotification(text); 

       NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
       mNotificationManager.notify(notif_id, notification); 
} 
संबंधित मुद्दे