92

मैं इस कोड के माध्यम से एक BroadcastReceiver अंदर एक अधिसूचना बनाने हूँ:अधिसूचना गुजरता वर्ष आशय अतिरिक्त

String ns = Context.NOTIFICATION_SERVICE; 
     NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns); 
     int icon = R.drawable.ic_stat_notification; 
     CharSequence tickerText = "New Notification"; 
     long when = System.currentTimeMillis(); 

     Notification notification = new Notification(icon, tickerText, when); 
     notification.defaults |= Notification.DEFAULT_VIBRATE; 
     long[] vibrate = {0,100,200,200,200,200}; 
     notification.vibrate = vibrate; 
     notification.flags |= Notification.FLAG_AUTO_CANCEL; 

     CharSequence contentTitle = "Title"; 
     CharSequence contentText = "Text"; 
     Intent notificationIntent = new Intent(context, NotificationActivity.class); 
     notificationIntent.putExtra(Global.INTENT_EXTRA_FOO_ID, foo_id); 
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 

     notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); 

     int mynotification_id = 1; 

     mNotificationManager.notify(mynotification_id, notification); 

जब मैं अधिसूचना पर क्लिक करें, यह NotificationActivity खोलता है और गतिविधि के अंदर मैं आशय से foo_id प्राप्त कर सकते हैं -बंडल (उदाहरण 1)

हालांकि अगर कोई अन्य अधिसूचना ट्रिगर हो जाती है और मैं इसे फिर से क्लिक करता हूं, तो गतिविधि को अभी भी "पुराने" मान (1) को मंशा-बंडल से प्राप्त होता है। मैंने स्पष्ट() के साथ बंडल को साफ़ करने का प्रयास किया है, लेकिन मुझे एक ही प्रभाव प्राप्त हो रहा है। मुझे लगता है कि मेरे कोड के साथ sth गलत है ..

+0

कृपया आप मुझे बताओ कि तुम आशय – user49557

+0

लंबित एहसास है कि यह वर्ष अतिरिक्त भेज रही थी, मेरे लिए आसान triaging बनाया से डेटा प्राप्त कर सकते हैं। –

उत्तर

187

आप अपने लंबित इरादे के लिए एक ही अनुरोध कोड भेज रहे हैं। इस बदलें:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 

करने के लिए:

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0); 

उद्देश्य नहीं बनाई गई हैं अगर आप एक ही पैरामीटर भेजें। उनका पुन: उपयोग किया जाता है। PendingIntent.FLAG_UPDATE_CURRENT के लिए

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

डॉक से:

+0

तो UNIQUE_INT_PER_CALL एक इंटीजर है जो मुझे प्रदान करना है? या यह कहीं एक स्थिर चर घोषित किया गया है? – BrianM

+0

अद्वितीय पूर्णांक आपको – IncrediApp

+6

एंड्रॉइड गॉचा # 147 प्रदान करना है - इसलिए एक 'इरादा' जिसमें * अलग * अतिरिक्त ('putExtra' के माध्यम से) समान हैं और फिर से उपयोग किए जाते हैं क्योंकि मैंने कुछ लंबित इरादे को एक अद्वितीय आईडी प्रदान नहीं की है कॉल - भयानक एपीआई – wal

116

फिर, आप अपने PendingIntent उत्पन्न करने के लिए निम्न कोड का उपयोग कर सकते

वर्णित PendingIntent पहले से मौजूद है, तो यह रखना है, लेकिन इसके अतिरिक्त की जगह इस नए इरादे में क्या है इसके साथ डेटा। इसका उपयोग तब किया जा सकता है जब आप इरादे बना रहे हों, जहां केवल अतिरिक्त परिवर्तन हो, और इस बात की परवाह न करें कि आपके पिछले लंबित इंटेंट प्राप्त करने वाली किसी भी संस्था को इसे अपने नए एक्स्ट्रा के साथ लॉन्च करने में सक्षम हो जाएगा, भले ही उन्हें स्पष्ट रूप से नहीं दिया गया हो।

+0

धन्यवाद के साथ समान है! यह समस्या थी और यह है सही समाधान –

+0

यह पिछले एक –

+0

की तुलना में अधिकतर अनुप्रयोगों के लिए एक बेहतर समाधान प्रतीत होता है, यह एक आकर्षण की तरह काम करता है, आपको बहुत क्रिस्टोफ – praveenb

34

आप एक ही आईडी पास कर रहे हैं। स्थिति इस प्रकार का यह

int iUniqueId = (int) (System.currentTimeMillis() & 0xfffffff); 

की तरह समय से एक Unike आईडी बनाने और इस

PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),iUniqueId, intentForNotification, 0); 
+1

क्यों नया रैंडम()। अगला INT() – exloong

+0

का उपयोग नहीं करें यह समाधान वास्तविक काम करता है। –

+0

बंडल अधिसूचनाओं के लिए, यह समाधान काम करता है। – User12111111

3

के रूप में यह डाल लंबे समय के बाद सबसे अच्छा तरीका की तलाश में किसी को भी के लिए आप सभी की जरूरत PendingIntent पारित करने के लिए। FLAG_UPDATE_CURRENT अंतिम तर्क के रूप में नीचे

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

आप नए विशेष आईडी प्रदान करने के लिए की जरूरत नहीं है दिखाया गया है।

0

आपका अनुरोध कोड सभी अधिसूचनाओं के लिए 0 है। लाइन निम्नलिखित बदलें:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 

के साथ:

PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt(), notificationIntent, 0); 
संबंधित मुद्दे