67

मेरे पास चार गतिविधियां हैं, ए, बी, सी और डी मेरी स्थिति है ए ए प्रारंभिकता ForResult द्वारा गतिविधि बी शुरू करेगा।startActivityForResult का उपयोग करना, अनुरोध कैसे प्राप्त करें बच्चे गतिविधि में कोड?

startActivityForResult(new Intent(this,B.class),ONE); 

अन्य स्थितियों में मैं अन्य स्थिति के साथ बी करूंगा।

startActivityForResult(new Intent(this,B.class),TWO); 

बी में, मुझे अनुरोध कोड के आधार पर सी या डी कॉल करने की आवश्यकता है। यदि किसी को सी और डी
शुरू करने की आवश्यकता है तो मुझे यह जानने की जरूरत है कि बच्चे गतिविधि में बीकोड को कैसे जांचें (बी यहाँ)।
दूसरे शब्दों में, मैं अनुरोध कोड प्राप्त करना चाहता हूं कि गतिविधि बी शुरू किया गया था।

उत्तर

109

आप अतिरिक्त कोड डालकर अनुरोध कोड पास कर सकते हैं।

intent.putExtra("requestCode", requestCode); 

या यदि आप startActivityForResult कई बार, तो प्रत्येक संपादन की तुलना में बेहतर इस्तेमाल किया है, तो आप अपने Activity में startActivityForResultoverride कर सकते हैं, इस

@Override 
    public void startActivityForResult(Intent intent, int requestCode) { 
     intent.putExtra("requestCode", requestCode); 
     super.startActivityForResult(intent, requestCode); 
    } 

की तरह वहाँ कोड जोड़ने तो करने के लिए कोई जरूरत नहीं है अपनी सभी स्टार्ट एक्टिविटीफॉररसल्ट
आशा है कि इससे आपको

+33

वहाँ वास्तव में एक बच्चे गतिविधि अपने अनुरोध प्राप्त करने के लिए कोई रास्ता नहीं है कोड? –

+1

अब तक मेरे सबसे अच्छे ज्ञान तक, मुझे कोई दूसरा रास्ता नहीं लगता है। –

+11

वही बात सोच रहा था - यह एंड्रॉइड एपीआई में उन चीजों में से एक है जो कोई तार्किक अर्थ नहीं बनाते हैं। –

22

अनुरोध कोड स्वचालित रूप से प्रारंभिक गतिविधि को पास नहीं किया गया है क्योंकि यह डी इस मूल्य को जानने की आवश्यकता नहीं है (और नहीं)। इसे केवल यह जानने की जरूरत है कि क्या करना है और यह कहां से शुरू किया गया था।

एक गतिविधि शुरू करना वास्तव में एक विधि को कॉल करने का एक और रूप है। जब आप कोई विधि कॉल करते हैं, तो आप परिणाम को समकालिक रूप से प्राप्त करते हैं (ठीक वहीं जहां आपने कॉल किया था)। इस मामले में आप केवल उस जानकारी में गुजर रहे हैं जिस विधि को अपना काम करने की आवश्यकता है। आप यह नहीं कह रहे हैं कि आपने इसे कहां से बुलाया था।

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

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

अब, "लॉगिन" बटन लॉगिन गतिविधि शुरू करने के लिए अनुरोध कोड 1 का उपयोग करता है, लेकिन "खरीदें" बटन उसी अनुरोध कोड का उपयोग नहीं कर सकता है क्योंकि लॉगिन सफल होने पर इसे कुछ अलग करना होगा। तो, "खरीदें" बटन अनुरोध कोड का उपयोग करता है 2.

"लॉगिन" गतिविधि में आपको दो अलग-अलग अनुरोध कोड प्राप्त हो सकते हैं, जहां से इसे कहलाया गया था, लेकिन आपको एक ही प्रक्रिया करने की आवश्यकता होगी।

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

if (requestCode == LOGIN || requestCode == BUY) { 
    // ... 
} else ... 

तुम भी होगा केंद्रीय स्थान में अनुरोध कोड स्थिरांक को संग्रहीत करने के साथ समाप्त करें RequestCodes नाम की एक कक्षा।

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

+1

क्या होगा यदि यह सॉर्ट का "प्रबंधक" है और आप एक निश्चित कोड (अतिरिक्त में सहेजे गए मूल्य) को "सेव" करने के लिए अनुरोध कोड चाहते हैं। एक अन्य अनुरोध कोड जो एक मूल्य ("अतिरिक्त में वापस लौटता है) होगा लेकिन इस गतिविधि के भीतर वे कुल मिलाकर सहेजे गए मूल्यों का नाम बदल सकते हैं जैसे कि नामकरण, संपादन, हटाना आदि। इस तरह के कुछ पर आपके विचार क्या हैं? मुझे लगता है कि यह एक ही क्रिया करने के लिए डुप्लिकेटिंग कोड/गतिविधियों को रोक देगा। – JRomero

+0

@ जे। रोमेरो ऐसा मत करो, यह सिर्फ चीजों को जटिल करेगा। बस उस कार्यक्षमता को एक (उपयोगिता/सिंगलटन) कक्षा में रखें। आप [हैंडलर] (http://developer.android.com/reference/android/os/Handler.html) और [सेवा] (http://developer.android.com/reference/android/ पर भी देखना चाहते हैं) ऐप/सेवा.html) –

+2

Szabolcs बच्चे की गतिविधि, भले ही इसे "इस मूल्य को जानने की आवश्यकता न हो" को किसी श्रृंखला में अगली गतिविधि पर मूल्य पारित करने की आवश्यकता हो। विडंबना यह है कि हमें इसके लिए अधिक अनावश्यक कोड लिखना होगा। ऐसी किसी चीज़ के लिए जिसे हमें यह जानने की आवश्यकता नहीं है कि हमें क्या करना चाहिए इसके बारे में पढ़ने के लिए हमें और अधिक व्याख्यान मिलता है। – user250343

4

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

protected static final String ACTION_DO_C = "do_c"; 
protected static final String ACTION_DO_D = "do_d"; 

तो फिर तुम जैसे जाना चाहते हैं:

final Intent intent = new Intent(this,B.class) 
intent.setAction(ACTION_DO_C); 
startActivityForResult(intent,ONE); 

और गतिविधि में B आप कार्रवाई आसानी से मिलती है:

getIntent().getAction(); 
संबंधित मुद्दे