onActivityResult () जिसे समय से पहले कहा जाता है


92

मैं अपने कार्यकर्ता गतिविधि से निम्न Activity(वंशज PreferenceActivity) शुरू करता हूं:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1458)
        loadInfo();
}

void showSettingsDialog()
{
    startActivityForResult(new Intent().setClass(this, MyConfigure.class), 1458);
}

MyConfigureक्लास में कोई setResult()कॉल नहीं है । वास्तव में, MyConfigureक्लास के पास कोई कोड नहीं है सिवाय इसके OnCreate()कि वह वरीयताओं का उपयोग करके कहां लोड करता है addPreferencesFromResource

अब समय से पहले onActivityResultबुलाया जाता है , गतिविधि चलने के ठीक बाद । 1.6 और 2.1 एमुलेटर के साथ-साथ 2.1 डिवाइस पर परीक्षण किया गया। वहाँ कहीं दफन करने के लिए एक कॉल है ? या इस समयपूर्व कॉल को और कैसे समझाया जा सकता है?requestCode1458MyConfiguresetResult()PreferenceActivity


1
एक गतिविधि setResults () पर समाप्त नहीं होती है, यह खत्म () पर समाप्त होती है। क्या आप अपने MyConfigure गतिविधि की ऑनक्रिट विधि दिखा सकते हैं?
चेरिल साइमन

ठीक है, यह नहीं है। हालाँकि, कुछ समय के पहले कॉल सेट करता हैResult () और मैं सोच रहा हूँ, यह क्या है। OnCreate का कोड तुच्छ है: सार्वजनिक वर्ग MyConfigure सुविधा का विस्तार करता है {@Override संरक्षित शून्य onCreate (बंडल सहेजी गई InstanceState) {super.onCreate (saveInanceanceState); addPreferencesFromResource (R.xml.preferences); }}
यूजीन मेवस्की 'कॉलबैक जूल

आपको कैसे पता चलेगा कि setResult कहा जाता है?
RoflcoptrException

यह वही है जिसके लिए मैंने सवाल बनाया था। यह जानने के लिए कि समय से पहले ही क्यों कहा जाता है।
यूजीन मेवस्की 'कॉलबैक

इस अवधि के आसपास लॉगकैट आउटपुट क्या कहता है? विशेष रूप से "एक्टिविटी मैनजर" टैग, जो दिखाता है कि इंटेंट्स किसे कहा जा रहा है।
क्रिस्टोफर ओरल

जवाबों:


254

यह लॉन्च मोड को बदलकर तय किया गया है singleTop:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop">

एंड्रॉइड में एक बग / सुविधा (?) है, जो तुरंत परिणाम की रिपोर्ट करता है (जो अभी तक सेट नहीं किया गया है) Activity, के रूप में घोषित किया गया है singleTask(इस तथ्य के बावजूद कि गतिविधि जारी है)। हम बदलते हैं, तो launchModeसे माता-पिता गतिविधि के singleTaskलिए singleTop, के रूप में की उम्मीद सब कुछ काम करता है - परिणाम बताया जाता है के बाद ही गतिविधि समाप्त हो गया है। हालांकि इस व्यवहार की कुछ व्याख्या है (केवल एक singleTaskगतिविधि मौजूद हो सकती है और इसके लिए कई वेटर हो सकते हैं), यह अभी भी मेरे लिए एक तार्किक प्रतिबंध नहीं है।


2
यह एक बग लगता है! ^ ^ बहुत अजीब व्यवहार!
फेलिप

7
यदि गतिविधि में सिंगलटैस्क लॉन्च मोड है, तो उसे onActivityResult का उपयोग करके उप-गतिविधियों से परिणाम प्राप्त करने की आवश्यकता नहीं है। उप-गतिविधियां केवल कॉल फिनिश () और फिर डेटा इंटेंस के साथ मुख्य गतिविधि शुरू करती हैं। मुख्य गतिविधि में आपको onNewIntent मेथड को ओवरराइड करना होगा और प्रक्रिया को आशय प्राप्त होगा।
निक

43
लॉन्चमोड = "सिंगलइनस्टांस" भी इस व्यवहार का कारण बनता है
फेल्डएंड्रो

1
ऐसा लगता है कि यह मेरे लिए काम नहीं किया, मैंने पैरेंट गतिविधि पर सिंगलटॉप की कोशिश की लेकिन कोई फायदा नहीं हुआ। मैंने FLAG_ACTIVITY_SINGLE_TOP में इरादे का झंडा भी सेट किया, हालाँकि अब अनुरोध सही मान दिखाता है, लेकिन परिणाम हमेशा 0. है
नियॉन वेज

11
यह किटकैट 4.4.4 पर होता है, लॉलीपॉप पर नहीं होता है।
सोमसुंदरम महेश

18

मैंने intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);फोन करने से पहले हटाने के बाद अपनी समस्या हल कर ली fragment.startActivityForResult(intent, 0);


1
धन्यवाद! इससे मेरी समस्या हल हो गई। क्या इसके लिए कहीं स्पष्टीकरण है?
कोनर हरकनेस

इन दिनों फ़्लैग के लिए डॉक्स में इसके लिए एक स्पष्टीकरण है "यह ध्वज तब उपयोग नहीं किया जा सकता है जब कॉलर लॉन्च की जा रही गतिविधि से एक परिणाम का अनुरोध कर रहा है"। खैर इसकी व्याख्या नहीं है लेकिन कम से कम एक चेतावनी!
कोड Novitiate

4

मैंने अपनी गतिविधि से अपने सभी कस्टम "एंड्रॉइड: लॉन्चमोड" को हटा दिया और सब कुछ एक आकर्षण की तरह काम किया। जब आप एंड्रॉइड को समझ रहे हैं तो यह बिल्कुल नहीं पता है कि यह एक अच्छा विचार नहीं है ... एंड्रॉइड इस तरह से थोड़ा मुश्किल है।


1

मेरे साथ ऐसा तब हुआ जब इरादे का Intent.FLAG_RECEIVER_FOREGROUNDझंडा लगा था ।

(हां, वह झंडा गतिविधि से संबंधित नहीं है, लेकिन मेरे पास एक अलग समस्या के लिए एक शॉटगन समाधान के हिस्से के रूप में मेरे सभी इरादों पर था ।)


-1

फिर से मायरा की टिप्पणी में, setResult()आपकी समस्या से कोई लेना-देना नहीं है। किसी कारण से, MyConfigureक्लास ख़ुद ही खत्म हो जाती है और जब ऐसा होता है तो यह PreferenceActivityमान लिया जाता है कि वहाँ से परिणाम हो सकता है MyConfigureक्योंकि आपने कोड लिखा है।

यह तब भी होता है जब आप किसी भी गतिविधि को बलपूर्वक शुरू करते हैं startActivityForResult()...

इसलिए, मुझे लगता है कि यह ध्यान देना बेहतर है कि आपकी MyConfigureकक्षा जबरन समाप्त क्यों हो रही है।


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