2012-04-06 9 views
8

कहा जाता है मेरे पास 2 गतिविधियां हैं, प्रत्येक अलग-अलग अनुप्रयोगों में हैं। Activity1 एक बटन क्लिक कर सकते हैं उपयोगकर्ता है और यह इसकी onClick() विधि में एक अभिप्राय का उपयोग करके दूसरी गतिविधि कॉल:Android onActivityResult को

Intent myIntent = getPackageManager().getLaunchIntentForPackage(com.myProject.Activity2); 
startActivityForResult(myIntent, 600); 

यह सही ढंग से Activity1 से activity2 की शुरूआत है, लेकिन onActivityResult Activity1 में बुलाया जाता है onCreate से पहले activity2 में बुलाया जाता है, बजाय onBackPressed() में जहां मैंने वापसी का इरादा स्थापित किया था।

यहाँ activity2 के लिए onCreate विधि है:

@Override 
public void onBackPressed() { 
    Intent intent = new Intent(); 
    intent.putExtra("Stuff", someStuff); 

    if(getParent()==null){ 
     setResult(Activity.RESULT_OK, intent); 
    }else{ 
     getParent().setResult(Activity.RESULT_OK, intent); 
    } 
    finish(); 
    super.onBackPressed(); 
} 

मेरे AndroidManifest.xml activity2 के लिए निम्नलिखित लक्ष्य फ़िल्टर है:

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

यहाँ activity2 के लिए onBackPressed विधि के वर्तमान संस्करण है

<intent-filter> 
    <action android:name="android.intent.action.MAIN"/> 
    <category android:name="android.intent.category.LAUNCHER"/> 
</intent-filter> 

मैंने सत्यापित किया कि मेरा standard (और singleTask, आदि नहीं) की सलाह दी गई है here और मेरा अनुरोध कोड नकारात्मक नहीं है जैसा कि here चेतावनी दी गई है। मैंने android:launchMode="singleTop" भी कोशिश की, लेकिन यह भी नहीं था।

मैं भी बुला नहीं onBackPressed() में finish() activity2 के लिए के रूप में और फिर से सुझाव के रूप में here यह बुला (बस super.onBackPressed() सुझाव here के रूप में के साथ भी) here उल्लेख करने की कोशिश की।

इसके अतिरिक्त मैंने intent.putExtra("Stuff", someStuff); लाइन को टिप्पणी करने का प्रयास किया क्योंकि यह this person के लिए परेशानी का कारण बन रहा था।

कोई विचार क्या मैं गलत कर रहा हूं?

उत्तर

9
तो यहाँ

अंतिम समाधान है कि यह का ध्यान रखा है:

मैं निम्नलिखित करने के लिए Activity1 के लिए आशय बदल दिया है:

Intent myIntent = new Intent(); 
myIntent.setClassName("com.myProject", "com.myProject.Activity2"); 
startActivityForResult(myIntent, 600); 

किसी कारण एंड्रॉयड दूसरा पैरामीटर के लिए पूरी तरह से योग्य नाम की आवश्यकता है पहले पैरामीटर द्वारा दिए गए पैकेज नाम के अतिरिक्त। अब यह काम कर रहा है! :)

+1

वापस आने और अपना समाधान पोस्ट करने के लिए बहुत बहुत धन्यवाद। मैं इस समस्या पर लंबे समय से फंस गया हूं और मैंने आपके समाधान में आने वाले सभी समाधानों का भी कोई फायदा नहीं लिया। इसने इसे ठीक कर दिया और अपना दिन बहुत बेहतर तरीके से एक बिल्ली बनाया =) –

+0

मैं startActivityForResult का उपयोग setClassName के बिना या मेरी परियोजनाओं में पूरी तरह से योग्य नामों के बिना करता हूं और वे सभी एक मामले को छोड़कर पूरी तरह से काम करते हैं। इसलिए मैंने उस मामले में आपके समाधान की कोशिश की और इससे कोई फर्क नहीं पड़ता। – user316117

+0

2h !! समाधान – Anthone

0

निश्चित नहीं है कि आपकी समस्या क्या है। जिस तरह से आप गतिविधि 1 में इरादा बना रहे हैं वह अजीब है; यह विधि उन उद्देश्यों को बनाने के लिए नहीं है जो एक ही ऐप में एक और गतिविधि लॉन्च करते हैं। कुछ डेवलपर्स इरादे (संदर्भ, कक्षा <>) कन्स्ट्रक्टर का उपयोग करते हैं। मैं केवल अपने ऐप में परिभाषित कस्टम एक्शन स्ट्रिंग के साथ इरादा (स्ट्रिंग एक्शन) का उपयोग करना पसंद करता हूं (जो सही ढंग से कोड करना आसान है)।

इसके अलावा, गतिविधि 2 के लिए आपके द्वारा निर्दिष्ट इरादा फ़िल्टर आमतौर पर होम स्क्रीन से लॉन्च की गई गतिविधि के लिए उपयोग किया जाता है।

गतिविधि 2 के लिए onCreate() कोड कहां है? बैकप्रेस() पर कोड कहां है? क्या आप मुझे साबित कर सकते हैं कि setResult() को गतिविधि 2 में किसी अन्य कोड से पहले बुलाया जाता है? आपको डीबग में गतिविधियों को चलाना चाहिए। सुनिश्चित करें कि गतिविधि 2 आपके इच्छित इरादे को प्राप्त कर रहा है, फिर setResult() तक निष्पादित किए गए बयानों को चरणबद्ध करें। करने के लिए यह समझने से पहले कोड में समाधान फेंकने से पहले अंतर्निहित समस्या क्या है।

जहां तक ​​मैं अब तक कह सकता हूं, गतिविधि 1 एक इरादा भेज रहा है, और फिर एक्टिविटी रिसेट को बुलाया जा रहा है। अब तक कुछ भी साबित नहीं हुआ है।

+0

टिप्पणी के लिए धन्यवाद - मैंने प्रश्न पर 'ऑनक्रेट' और 'ऑन बैकप्रेस' विधियों को जोड़ा है। मैंने इसे कई बार डीबग किया और ब्रेक पॉइंट्स का उपयोग करके मैं यह दिखाने में सक्षम था कि गतिविधि 1 की 'एक्टिविटी रिसेट' को तब कहा जाता है जब गतिविधि 2 पहले लॉन्च हो जाता है - गतिविधि 2 कभी लौटने से पहले, और जब यह लौटाता है तो उसे फिर से कॉल नहीं किया जाता है। – user1205577

+0

मैंने 'इरादा (संदर्भ, गतिविधि 2.class)' का उपयोग करके एक इरादा बनाने का भी प्रयास किया, लेकिन शिकायत की कि उसे कक्षा नहीं मिल सका (शायद क्योंकि यह किसी अन्य एप्लिकेशन में है)। मैंने पूरी तरह से योग्य पथ नाम का उपयोग करने के कुछ बदलावों की कोशिश की और यह भी नहीं था। – user1205577

1

यह तब होगा जब आप "एकल प्रवेश" ध्वज सेट करते हैं जब आप गतिविधि लॉन्च करते हैं।

+0

धन्यवाद jbaylina आपका उत्तर मेरे लिए उपयोगी है – Swapnil