PendingIntent पर "requestCode" का क्या उपयोग है?


110

पृष्ठभूमि:

मैं अलार्म मैनजर के माध्यम से अलार्म के लिए PendingIntent का उपयोग कर रहा हूं।

समस्या:

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

लेकिन तब मुझे पता चला कि मैं गलत था, क्योंकि रद्द करने वाला एपीआई कहता है:

मेल खाते इरादे के साथ किसी भी अलार्म निकालें। किसी भी प्रकार का अलार्म, जिसका आशय इस एक से मेल खाता है (जैसा कि फ़िल्टरएक्ल्स (आशय) द्वारा परिभाषित किया गया है), रद्द कर दिया जाएगा।

" फ़िल्टरएक्ल्स " को देखते हुए, प्रलेखन कहता है:

यह निर्धारित करें कि क्या आशय संकल्प (छानने) के उद्देश्यों के लिए दो उद्देश्य समान हैं। यही है, अगर उनकी कार्रवाई, डेटा, प्रकार, वर्ग और श्रेणियां समान हैं। यह इंटेंट्स में शामिल किसी भी अतिरिक्त डेटा की तुलना नहीं करता है।

इसलिए मुझे वह नहीं मिला जो "requestCode" के लिए है ...

प्रश्न:

"RequestCode" किसके लिए उपयोग किया जाता है?

क्या होगा अगर मैं एक ही "अनुरोधकोड" के साथ कई अलार्म बनाऊँ? क्या वे एक दूसरे को ओवरराइड करते हैं?


यदि आप एक ही अनुरोध का उपयोग करते हैं, तो आप एक ही लंबित
pskink

3
PendingIntent.getBroadcast () के लिए, requestCode को स्पष्ट रूप से Android द्वारा अनदेखा किया जाता है। एपीआई 22 के रूप में, यह आपके लंबित इरादे को अद्वितीय नहीं बनाएगा। GetActivity के लिए करता है () और (शायद getService () लेकिन मैंने परीक्षण नहीं किया है)। stackoverflow.com/a/33203752/2301224
बेकर

@ बेकर क्या इसे बग नहीं माना जाता? यदि यह एक बग है, तो आपको इसके बारे में यहां लिखना चाहिए: code.google.com/p/android/issues/list
Android डेवलपर

1
ठीक है, वास्तव में, प्रलेखन अनुरोध के usaga को निर्दिष्ट करता हैकोड: If you truly need multiple distinct PendingIntent objects active at the same time (such as to use as two notifications that are both shown at the same time), then you will need to ensure there is something that is different about them to associate them with different PendingIntents. This may be any of the Intent attributes considered by Intent#filterEquals(Intent), or different request code integers supplied.
Eir

@ ईयर राइट, तो अनुरोधकोड का उपयोग करने में क्या बात है? इसका उपयोग कहां किया जा सकता है?
एंड्रॉयड डेवलपर

जवाबों:


77
  1. requestCode का उपयोग उसी लंबित इरादे को बाद में (रद्द करने, आदि के लिए) करने के लिए किया जाता है।
  2. हां, मेरा अनुमान है कि अलार्म एक दूसरे को ओवरराइड करेंगे। मैं अनुरोध कोड अद्वितीय रखूंगा।

5
अलार्म के इंटर्न्स बहुत अलग हैं (सेवा ए के लिए और सेवा बी के लिए एक उदाहरण के लिए) यहां तक ​​कि मामले में भी अद्वितीय होने के लिए अनुरोध को सेट करना आवश्यक है? इसके अलावा, प्रलेखन कैसे आता है इसके बारे में कुछ नहीं कहते हैं? क्या एक निश्चित प्रकार के सभी अलार्म को निकालना संभव है, कोई फर्क नहीं पड़ता कि अनुरोध क्या है?
Android डेवलपर

1
नहीं, यह अलग-अलग इरादों के लिए आवश्यक नहीं है। और मुझे नहीं पता कि प्रलेखन इसके बारे में कुछ क्यों नहीं कहता है, लेकिन मैंने यह तब सीखा जब अलार्म सेट करना और उसी इरादे का उपयोग करते समय भी।
मिन्हाज अरफिन

2
मैं PendingIntent के बारे में बात कर रहा था। startActivityForResult एक सामान्य इरादे का उपयोग करता है।
एंड्रॉइड डेवलपर

2
क्या "startActivityForResult के साथ PendingIntent एक प्रॉक्सी गतिविधि का उपयोग कर" का उद्देश्य है? क्या आप एक उदाहरण दे सकते हैं?
Android डेवलपर

3
मैं सहमत हूँ; PendingIntent और AlarmManager के लिए दस्तावेज़ीकरण कुल sh है! t - इस तथ्य से और भी बदतर बना दिया गया है कि अलार्म को प्रोग्रामिक रूप से सूचीबद्ध करना संभव नहीं है।
किसी

33

मैं सिर्फ @ मिन्हाज अरफिन जवाब में जोड़ना चाहता हूं

1- अनुरोध लंबित (रद्द करने आदि के लिए) बाद में उसी लंबित इरादे को प्राप्त करने के लिए उपयोग किया जाता है

2- हाँ, वे तब तक ओवरराइड हो जाएंगे जब तक आपका इरादा आपके इरादे को वही बताएगा जो आप अपने लंबित पर निर्दिष्ट करते हैं।

उदाहरण:

Intent startIntent1 = new Intent(context, AlarmReceiverFirst.class);
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, startIntent1, 0);

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

ऊपर के उदाहरण से, वे एक-दूसरे को ओवरराइड नहीं करेंगे क्योंकि रिसीवर अलग है (AlarmReceiverFirst और AlarmReceiverSecond)

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

Intent startIntent3 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent3 = PendingIntent.getBroadcast(context, 0, startIntent3, 0);

उपरोक्त उदाहरण से, वे एक-दूसरे को ओवरराइड करेंगे , क्योंकि रिसीवर एक ही है (अलार्मराइसेवरसेकंड)


आशय startIntent4 = नया आशय (संदर्भ, AlarmReceiverSecond.class); लंबित लंबितIntent4 = PendingIntent.getService (संदर्भ, 0, startIntent4, 0); तब ठीक होगा? मेरा मतलब है, यह ओवरराइड नहीं होगा क्योंकि यह गेटबॉर्डकास्ट () के बजाय गेटसेव () कह रहा है?
जेनिक्स

एक और सवाल पूछने के लिए क्षमा करें, लेकिन क्योंकि stackoverflow मुझे एक भी कोड लाइन के बिना एक सवाल लिखने की अनुमति नहीं देता है .. क्या GetBroadcast की तरह PendingIntent के तरीकों का अंतिम तर्क नहीं है () ओवरराइडिंग के साथ कुछ करना है? मैं आपके उदाहरण कोड की तरह ही 0 डाल देता था, लेकिन मैंने यह भी देखा कि बहुत से लोग 0. के बजाय कुछ विशिष्ट विकल्प मान रख रहे थे
जेनिक्स

1
@ जेनिक्स यूउ का उपयोग AlarmReceiverSecond.classइरादे पर करें और फिर उपयोग करें PendingIntent.getService()। यह काम नहीं करेगा, क्योंकि AlarmReceiverSecond.classBroadcastReceiver, नहीं हैService
HendWD 13

1
झंडे के बारे में, यह ऐसे गुण हैं जिन्हें आप सेट कर सकते हैं, जो आपके द्वारा प्रदान किए गए झंडे के अनुसार आपके PendingIntent के व्यवहार को बनाएंगे। 0 का अर्थ है सभी झंडे बंद
HendraWD

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

2

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

 PendingIntent pendingIntent =
                            PendingIntent.getActivity(this, **Some unique id for all GCMS** /* Request code */, intent,
                                    PendingIntent.FLAG_ONE_SHOT);

मेरे मामले के लिए आगे कोड की जांच करने की कोई आवश्यकता नहीं थी, क्या आप बता सकते हैं कि किस मामले में लंबित इरादे की आवश्यकता होगी। प्रश्न बदलने के अनुरोध के साथ कोड ने मुझे सही स्क्रीन करने में मदद की, मुझे नहीं पता कि क्या यह सही तरीका है और मेरे लिए त्रुटि केवल तब हो रही थी जब कई एफसीएम ट्रे में थे
JSONParser

तो अगर आपको इसकी आवश्यकता नहीं है, तो एक अलग अनुरोध-कोड क्यों सेट करें?
एंड्रॉयड डेवलपर

ठीक है, मैं विस्तार से बताऊंगा, मेरे पास कुछ सक्रियता ए थी, यह उन सवालों को दिखाने के लिए है जिन्हें मैं आईडी को इरादे से सूचनाओं के माध्यम से पारित कर दूंगा और फिर उस आईडी के लिए एक नेटवर्क अनुरोध करूंगा और विशेष प्रश्न प्राप्त करूंगा, इसलिए जब वहां हो रहा था सूचना ट्रे में 1 से अधिक सूचनाएं हैं और फिर मैं उनमें से किसी एक पर क्लिक करता हूं जिसमें मुझे सवाल का आईडी मिलता है जो पहले GCM में था, लंबित आशय अनुरोध कोड को कुछ अद्वितीय मूल्य में बदलने के बाद काम किया। मुझे उम्मीद है कि मैंने इसे स्पष्ट कर दिया है, अगर किसी और चर्चा की आवश्यकता है तो मैं वहां हूं, मैं और भी सीखना चाहता हूं, धन्यवाद
JSONParser

ओह तुम्हारा मतलब था कि अन्यथा यह सब पर काम नहीं होता, है ना? भ्रम के बारे में क्षमा करें। यह प्रश्न बहुत समय पहले पूछा गया था और मुझे यह बिल्कुल भी याद नहीं है ...
Android डेवलपर

1

requestCodeविगेट्स का उपयोग करते समय आपके ऐप के बारे में एक महत्वपूर्ण बात गंभीरता से परेशान करेगी। फोन रिबूट के बाद विगेट्स काम नहीं करेंगे अगर उनके requestCodeसमान हैं। इसका अर्थ है कि pendingIndentआपने remoteViewsअपने विजेट पर जो सेट किया है, उसे विशिष्ट अनुरोध सेट किया जाना चाहिए, आमतौर पर एक नंबर के साथ विजेटआईडी।


0

दरअसल, प्रलेखन में स्पष्ट रूप से कहा गया है कि अनुरोध कोड का उपयोग किस लिए किया जाता है:

यदि आपको एक ही समय में कई अलग-अलग PendingIntent ऑब्जेक्ट सक्रिय करने की आवश्यकता है (जैसे कि दो सूचनाओं के रूप में उपयोग करने के लिए जो दोनों एक ही समय में दिखाए जाते हैं), तो आपको यह सुनिश्चित करने की आवश्यकता होगी कि कुछ अलग है जो उन्हें अलग से संबद्ध करने के बारे में है PendingIntents। यह Intent # filterEquals (आशय), या getActivity (Context, int, Intent, int), getActivities (Context, int, Intent [], int), getBroadcast () के लिए आपूर्ति किए गए अलग-अलग अनुरोध कोड इंटीरियर्स में से कोई भी हो सकता है। प्रसंग, int, Intent, int), या getService (संदर्भ, int, इरादा, int)।

चूंकि ऐसा लगता है कि यह अभी भी स्पष्ट नहीं है, मुझे समझाने की कोशिश करें:

जब आप किसी PendingIntentऑब्जेक्ट का उपयोग करना चाहते हैं , तो आप केवल एक ही इंस्टेंट नहीं करते हैं। बल्कि, आप का उपयोग कर सिस्टम से इसे प्राप्त PendingIntentस्थिर तरीके ( getActivity, getBroadcast, getServiceआदि)। सिस्टम PendingIntent उदाहरणों का एक समूह रखता है और आपको एक देता है। यह आपको कौन सा देता है, यह इन गेटर तरीकों से आपके द्वारा पारित इनपुट मापदंडों पर निर्भर करता है। वे इनपुट पैरामीटर्स हैं: Contextअर्थात, इरादे के लक्ष्य रिसीवर, Intentउपयोग करने के लिए, requestCodeऔर flags। जब आप समान Context, समान requestCodeऔर समान आशय (एक आशय का अर्थ है कि filterEqualsदूसरे इरादे से) पास करते हैं, तो आपको वही PendingIntentवस्तु मिलती है । मुद्दा यह है कि सिस्टम PendingIntentजितनी संभव हो उतनी कम वस्तुओं को प्राप्त करना चाहता है, इसलिए यह मौजूदा लोगों को पुन: उपयोग करने की अनुमति देता है, जितना संभव हो सके।

उदाहरण के लिए, आपके पास दो कैलेंडर सूचनाएं हैं, दो अलग-अलग तिथियों के लिए। जब आप उनमें से किसी एक पर क्लिक करते हैं, तो आप चाहते हैं कि आपका ऐप उस अधिसूचना की संबंधित तिथि को खुल जाए। उस परिदृश्य में, आपके पास एक ही Contextलक्ष्य है, और जो Intentवस्तु आप पास कर रहे हैं वह केवल EXTRA_DATA में भिन्न है (जो उस तारीख को निर्दिष्ट करता है जो खुली होनी चाहिए)। यदि आप वस्तु requestCodeप्राप्त करते समय समान प्रदान करते हैं PendingIntent, तो आप उसी PendingIntentवस्तु के साथ समाप्त हो जाएंगे । इसलिए, दूसरी अधिसूचना बनाते समय, आप पुरानी Intentवस्तु को नए EXTRA_DATA से बदल देंगे, और एक ही तिथि की ओर इशारा करते हुए दो सूचनाओं के साथ समाप्त करेंगे।

यदि आप दो अलग-अलग PendingIntentऑब्जेक्ट्स रखना चाहते हैं, जैसा कि आपको इस परिदृश्य में होना चाहिए, तो आपको ऑब्जेक्ट requestCodeप्राप्त करते समय एक अलग निर्दिष्ट करना चाहिए PendingIntent


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

@androiddeveloper जो आपने अभी कहा वह गलत है। कोशिश करो।
ईयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.