अधिसूचना पुराने इरादे एक्स्ट्रा को पास करती है


134

मैं इस कोड के माध्यम से एक ब्रॉडकास्टर के अंदर एक अधिसूचना बना रहा हूं:

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);

जब मैं अधिसूचना पर क्लिक करता हूं, तो यह अधिसूचना अधिसूचना को खोलता है और गतिविधि के अंदर मैं fent_id को इंटेंट-बंडल (जैसे 1) से पुनर्प्राप्त कर सकता हूं

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


कृपया आप मुझे बता सकते हैं कि आपको लंबित आशय से डेटा कैसे मिलता है
user49557

यह महसूस करने के लिए कि यह पुराने एक्स्ट्रा कलाकार को भेज रहा है, इससे मेरी यात्रा आसान हो गई।
उत्सव गुप्ता

जवाबों:


268

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

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

सेवा:

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

यदि आप एक ही पैरा भेजते हैं तो इंटेंट नहीं बनाए जाते हैं। उनका पुन: उपयोग किया जाता है।


1
इसलिए UNIQUE_INT_PER_CALL एक पूर्णांक है जिसे मुझे प्रदान करना है? या यह एक स्थिर चर कहीं घोषित किया गया है?
ब्रायनएम

23
एंड्रॉयड पकड़ लिया # 147 - तो एक Intentहै कि विभिन्न एक्स्ट्रा कलाकार (के माध्यम से putExtra) एक ही और फिर से इस्तेमाल किया क्योंकि मैं कुछ लंबित आशय कॉल करने के लिए एक विशिष्ट आईडी नहीं प्रदान की थी माना जाता है - भयानक एपीआई
वाल

तुम जानते हो, मैं कितना लापरवाह था। बस यह सोचकर कि यह एक ब्लॉक में 0 कैसे रह सकता है (मेरे मामले में) :(
Exigente05

3
यह मेरे लिए अविश्वसनीय रूप से उपयोगी था, दूसरों के लिए सिर्फ एक टिप, यह संभावना है कि आप उसी तरीके से अपनी अधिसूचना का निर्माण कर रहे हैं, और इसलिए आप नए लंबित इरादे के लिए आईडी सेट कर सकते हैं जैसे कि आप जिस पर जा रहे हैं। सूचनाओं के लिए उपयोग करें अद्वितीय आईडी!
जेम्स मैकनी

1
@IncrediApp, यह PendingIntent.getBroadcast () के साथ समान है; ?
श्रुति

139

वैकल्पिक रूप से, आप निम्नलिखित कोड का उपयोग अपनी लंबित सूची बनाने के लिए कर सकते हैं:

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

के लिए डॉक्टर से PendingIntent.FLAG_UPDATE_CURRENT:

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


धन्यवाद ... इस ध्वज के लिए पूरी तरह से काम कर रहा है जो "PendingIntent.FLAG_UPDATE_CURRENT" जोड़ा गया है :)
नजीब अहमद पुथवाला

1
मेरे लिए काम किया है, एक अलार्म को प्रसारण रिसीवर से राज्य को स्थानांतरित करने के लंबित इरादे का उपयोग कर रहा हूं।
विलियम टी। मलार्ड

काश मुझे पता होता कि इन झंडे के बारे में मुझे क्या पता था कि इससे पहले कि मैं अपने यूजर्स को नोटिफ़िकेशन भेजूँ (!) ख़ुशी है कि इससे मेरी परेशानी दूर होती है ...
जेम्स एंड्रयू

42

आप एक ही आईडी पास कर रहे हैं। इस तरह की स्थिति में, समय-समय पर इस तरह की एक अनोखी आईडी बनाएं:

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

और इसे इस प्रकार रखें:

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

3
नए रैंडम () का उपयोग क्यों नहीं करें। NextInt ()
निकालें

@ अहमदाबाद में "& 0xfffffff" को ऊपर दिए गए इंट में क्या जोड़ता है?
एजेडब्ल्यू

3
@AJW System.currentTimeMillis()एक लंबा रिटर्न देता है, जबकि एक इंट requestIdका पैरामीटर PendingIntent.getActivity()0xffffffffएक बिटमास्क है। जबकि इसके लिए थोड़ा और अधिक है, सरल व्याख्या यह है कि `लॉन्ग एंड 0xffffffff 'करना लंबे से सबसे कम 32-बिट्स देता है और उच्चतम 32-बिट्स को छोड़ देता है, जो आपको अनिवार्य रूप से 32-बिट इंट के साथ छोड़ देता है। यह केवल इंट में कास्टिंग करने से बेहतर है क्योंकि यह साइन बिट को नहीं हिलाएगा (यदि आप एक लंबा कास्ट करते हैं जो इंट से अधिक बड़ा है तो साइन बिट ओवरफ्लो हो जाएगा और आप संभवतः एक नकारात्मक मान के साथ हवा देंगे। )
जॉर्डन बोंडो

8

किसी को भी लंबे समय के बाद सबसे अच्छा तरीका ढूंढने के लिए, आपको PendingIntent.FLAG_UPDATE_CURRENT को अंतिम तर्क के रूप में पास करना होगा जैसा कि नीचे दिखाया गया है

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

आपको एक नई अनूठी आईडी प्रदान करने की भी आवश्यकता नहीं है।

आपको अगली बार ऐसा करने की आवश्यकता है, पहली बार नहीं


1
यह काम नहीं करता है, मैं यहाँ मिला क्योंकि मैं क्या कर रहा था।
ब्रिल पप्पिन

आपको अगली बार ऐसा करने की ज़रूरत नहीं है, यह काम करेगा।
कोमल

0

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

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

साथ में:

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

1
क्या "System.currentTimeMillis ()" के बजाय "नया रैंडम ()। NextInt ()" का उपयोग करने का कोई लाभ है?
एजेडब्ल्यू

यादृच्छिक का उपयोग करके दुर्घटना पर फिर से उसी पूर्णांक मान को फिर से प्राप्त किया जा सकता है, इस प्रकार पुराने इरादों के बग को खोजने के लिए बहुत मुश्किल हो जाता है।
सैम

@AJW मेरे मामले में था। मैंने ठीक उसी मिलीसेकंड में 2 अलग-अलग सूचनाएं बनाईं, इसलिए उनमें से एक में गलत एक्स्ट्रा कलाकार मिला।
कलाकार

0

बस एक और विकल्प जोड़ना चाहता था

 PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.