Android - startActivityForResult तुरंत चालू करता है onActivityResult


144

मैं कॉल का उपयोग करके अपने ऐप में मुख्य गतिविधि से गतिविधियां शुरू कर रहा हूं startActivityForResult(intent, ACTIVITY_TYPE), और वे सभी काम कर रहे हैं लेकिन एक।

यह एक, जब बुलाया जाता है, गतिविधि को वांछित के रूप में लॉन्च करता है, लेकिन लॉग में मैं देख सकता हूं कि onActivityResult()तुरंत ट्रिगर किया जा रहा है। गतिविधि दिखाई देती है, लेकिन RESULT_CANCELEDतुरंत वापस कर दी जाती है onActivityResult()

मैं फिर गतिविधि के साथ बातचीत करता हूं, एक बटन दबाता हूं जो कॉल करता है finish(), और onActivityResult()इसे इस समय नहीं कहा जाता है (क्योंकि स्पष्ट रूप से एक परिणाम पहले ही वापस आ चुका है)।

क्या इस बात का कोई मतलब है? क्या किसी ने इस व्यवहार को पहले देखा है?

जवाबों:


315

startActivityForResult()यदि आपकी गतिविधि singleInstanceया के रूप में लॉन्च की जा रही है तो आप इसका उपयोग नहीं कर सकते singleTaskstandardया singleTopलॉन्च मोड समस्या को ठीक करेगा।


2
आप दोनों का शुक्रिया, मैंने अपनी मैनिफ़ेस्ट फ़ाइल में यह
लिखा

9
वाह! यह javadocs में जोड़ने के लिए एक स्पष्ट बात की तरह लगता है! मैंने इसे काम करने की कोशिश में एक पूरी शाम बर्बाद कर दी और इस एसओ जवाब ने मुझे याद दिलाया कि मेरी गतिविधि सिंगलटॉप पर सेट थी।
स्वोबी

20
singleTopमेरे लिए ठीक लगता है, singleTaskलेकिन इस मुद्दे को पैदा कर रहा था और इसलिए singleInstanceनिश्चित रूप से भी करना होगा
darnmason

4
मैंने इस पर बहुत लंबी बहस भी की! धन्यवाद!!
suomi35

4
मेरे मामले में, किसी भी वर्ग को सिंगलइंस्टेंस या सिंगलटॉप के रूप में परिभाषित नहीं किया गया है, लेकिन फिर भी यह हो रहा है ... कोई सुझाव?
CoDe

110

इसके अतिरिक्त सुनिश्चित करें कि आशय में Intent.FLAG_ACTIVITY_NEW_TASKसेट नहीं है ।

से डॉक्स :

इस ध्वज का उपयोग तब नहीं किया जा सकता जब कॉलर लॉन्च की जा रही गतिविधि से परिणाम का अनुरोध कर रहा हो।


3
इससे मेरे मामले में समस्या ठीक हो गई। समस्या सिंगलइनस्टांस, सिंगलटॉप और न ही सिंगलटैस्क के कारण नहीं थी।
डायना

आप एक टकसाल (एक जीवन रक्षक) हैं। यह मेरी सटीक समस्या थी जब मैं चाहता था कि उपयोगकर्ता एक चित्र में एक छवि को कैप्चर करे
kyay

@ डायना, क्या आपको याद है कि आपने इसके बजाय क्या इस्तेमाल किया था Intent.FLAG_ACTIVITY_NEW_TASK?
केसेलमे

@Keselme क्षमा करें, यह एक लंबा समय हो गया है, काश मैं मदद कर सकता हूं लेकिन मुझे याद नहीं है और मैं उस कोड तक पहुंच नहीं पा रहा हूं।
डायना

हां, इसे ठीक कर दिया। startActivityForResult का उपयोग Intent.FLAG_ACTIVITY_NEW_TASK के साथ नहीं किया जाना चाहिए
hanilozmen

21

मैंने इस व्यवहार को पहले देखा है, कृपया यह सुनिश्चित करें कि आपकी गंतव्य गतिविधि (वह विशेष गतिविधि) singleInstanceAndroidManifest फ़ाइल में नहीं है। यदि गतिविधि है singleInstance, तो यह RESULT_CANCELEDलॉन्च होने से पहले वापस आ जाएगी !


18

मैं यह भी जोड़ना चाहूंगा कि आप किसी बाहरी ऐप को कॉल कर सकते हैं:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
जो कि Intent.FLAG_ACTIVITY_NEW_TASKडिफ़ॉल्ट रूप से जोड़े जाने के साथ एक इरादा बनाएगा , इसलिए कॉल करें:
in.setFlags(0);
जो उस ध्वज को साफ़ कर देगा, और फिर आप इसके लिए आगे बढ़ सकते हैं:startActivityForResult(in, action);

कारण मैं यह कर रहा हूं कि मेरे पास एक उपयोगिता ऐप है जिसमें कुछ अन्य ऐप के बीच सामान्य कार्यक्षमता है और मैं कई अपडेट्स के बारे में चिंता करने के बजाय एक स्थान पर कोड परिवर्तन रख सकता हूं।


मुझे पता है कि यह पुराना है, लेकिन यह मेरे लिए इतना अमूल्य था कि मैं उपयोगकर्ता को धन्यवाद कहना चाहता था, और गतिविधियों के बीच कूदने वाले किसी भी व्यक्ति के लिए इशारा करना चाहता था कि यह सोना है! एक हैकथॉन के दौरान मेरी गांड को बचाया;)
वेस विन्न

इस पर ज्यादा ध्यान देने की जरूरत है। यह सबसे अच्छा समाधान है और मेरे लिए पूरी तरह से काम करता है। आपने मुझे बहुत समय बचाया, बहुत बहुत धन्यवाद।
अरित्रा रॉय

इस जवाब पर मतदान के रूप में यह सटीक मुद्दा था जो मैं आज सुबह कर रहा था! समाधान के लिए धन्यवाद!
विल जॉनसन

धन्यवाद। आशय .setFlags (0) ने समस्या को हल किया। अब दूसरा ऐप ठीक शुरू होता है और कॉलिंग ऐप
Niaz

5

startActivityForResult()एक साथ काम नहीं करता singleInstanceया singleTaskएंड्रॉयड के पूर्व लॉलीपॉप संस्करण में गतिविधि। Android 5 के बाद से यह काम करता है ( अधिक विवरण के लिए यह उत्तर देखें)।


5

यदि आप FLAG_ACTIVITY_NEW_TASKअपने इरादे में हैं , तो यह भी ट्रिगर होता है ।

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

धन्यवाद। मैंने अपनी गतिविधि में FLAG_ACTIVITY_NEW_TASK को जोड़ा।
चिराग सवसानी

1

मेरी समस्या कॉलिंग गतिविधि के साथ थी। AndroidManifest में इसकी घोषणा में निम्नलिखित संपत्ति थी:

android:noHistory="true"

इसे "झूठे" में बदल दिया और अब ठीक काम करता है।


1

एंड्रॉइड 4.4 में एक्टिविटी क्लोजर के अंत में वापसी की प्रतीक्षा करने के बारे में एक छोटी समस्या है। इस व्यवहार को हल करने के लिए इसे सेट करना महत्वपूर्ण है:

  • सभी गतिविधियों में समान कार्य आत्मीयता विशेषता होगी। ( TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

यह समाधान एंड्रॉइड के सभी संस्करण के साथ काम करता है

इसे देखें टास्क के लिए देखें: https://asyoulook.com/ कंप्यूटर्स%20&%20internet/android-onactivityresult-being-called-instantly/1004072


1

इसके अलावा, जांचें कि क्या Android: noHistory = "true" मैनिफेस्ट में गतिविधि पर, यदि हां, तो यह काम नहीं करेगा।


0

के लिए ActivityGroupया TabHostऔर अन्य लोगों, हो सकता है xxxActivityएक है subActivityअपने पेरेंट की। फिर startActivityForResultकाम नहीं कर सकता है लेकिन माता-पिता को परिणाम मिल सकता है।

  1. getParent().startActivityForResult()अपनी उप-गतिविधि से कॉल करें

  2. आपके माता-पिता ( ActivityGroup) को संभाल सकेंगे onActivityResult। इसलिए मैंने इसका एक उपवर्ग बनाया ActivityGroupऔर इसे संभाला onActivityResult

  3. यदि आपको जरूरत हो तो आप फिर से उप-गतिविधि पर वापस जा सकते हैं। बस द्वारा वर्तमान गतिविधि प्राप्त करें getLocalActivityManager().getCurrentActivity()। मेरी उप-गतिविधियाँ एक कस्टम गतिविधि से विरासत में मिलती हैं इसलिए मैंने कॉल करने के handleActivityResult(requestCode, resultCode, data)लिए उस उपवर्ग में एक जोड़ा ActivityGroup

उदाहरण: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html


डिफ़ॉल्ट वेब ब्राउजर को कॉल करते समय आप इस विशेष मामले के बारे में क्या सोचते हैं: codeproject.com/Questions/990063/…
अहमद अब्राहिमी

0

onActivityResult()यदि आप पैकेज या क्लास नाम को प्रकट फ़ाइल RESULT_CANCELEDमें छोड़ देते हैं resultCodeतो यह भी पास हो जाएगा ।


0

android:launchMode="singleTop"गतिविधि के लिए एंड्रॉइड मेनिफेस्ट सेट में आप परिणाम के साथ खुला चाहते हैं और गतिविधि सेट ध्वज को खोलते समयintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


0

यदि आप android:noHistory="true"अपने AndroidManifest.xml में गतिविधि में परिभाषित करते हैं, तो यह यहां एक ही समस्या का कारण होगा।

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