2011-10-13 12 views
22

this question जैसी समस्या का सामना करते समय, मुझे आश्चर्य हुआ कि onNewIntent ओवरराइड करते समय हमें स्पष्ट रूप से setIntent पर कॉल क्यों करना है, और यह कोड super.onNewIntent द्वारा पहले से क्यों नहीं किया गया है।क्या न्यूइन्टेंट पर ओवरराइड करते समय setIntent को कॉल न करने का कोई कारण नहीं है?

@Override 
public void onNewIntent(Intent intent) 
{ 
    super.onNewIntent(intent); 

    // Why isn't this performed by the framework in the line above? 
    setIntent(intent); 
} 

उत्तर

31

Intent ऑब्जेक्ट Activity, Service और अन्य घटक तब तक चल रहे हैं जब तक वे घटक चल रहे हों। वे आसानी से नहीं जाते क्योंकि आप किसी अन्य एप्लिकेशन में चले जाते हैं। इसका कारण यह है कि एंड्रॉइड किसी भी समय प्रक्रिया को मार सकता है, लेकिन उपयोगकर्ता अभी भी वापस जाना चाहता है और जारी रख सकता है कि वे क्या कर रहे थे। इससे अतिरिक्त के माध्यम से जानकारी के छोटे (और कभी-कभी बड़े) बिट्स को संग्रहीत या प्रसारित करने के लिए इराद आदर्श होते हैं।

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

यदि आपको परवाह नहीं है कि इसे बाद में क्यों कहा जाता है, तो आप setIntent() पर कॉल करके मूल Intent रख सकते हैं। यह विशेष रूप से उपयोगी होता है जब आपका Activity (या कुछ अन्य घटक) वही काम करता है चाहे कोई भी इसे किसने बुलाया और यह कौन सा डेटा प्रदान करता है।

यदि आपको व्यक्तिगत रूप से प्रत्येक ईवेंट का जवाब देने की आवश्यकता है, तो आपको कम से कम Intent की जानकारी संग्रहीत करनी होगी। इसका मतलब है कि आप setIntent() से बच सकते हैं, फिर भी, इसके किसी भी घटक से लिंक करने के लिए Intent जानकारी नहीं होगी जबतक कि आप उन्हें सीधे भेज दें। यह उस एप्लिकेशन के लिए वांछित व्यवहार हो सकता है जो मूल Intent बीमा नहीं कर सकता था पूरी तरह से संभाला गया था।

यदि आपको व्यक्तिगत रूप से प्रत्येक इरादे का जवाब देना है और मूल Intent कोई फर्क नहीं पड़ता है, तो आप setIntent() का उपयोग करते हैं। यह मूल Intent को छोड़ देता है, जो अभी भी वहां है ... और नए Intent को स्थान देता है ताकि यदि उपयोगकर्ता दूर हो जाए (फिर भी), तो वे उसी स्थान पर वापस आ जाएंगे।

कारण super.onNewIntent() इसका कारण यह नहीं है क्योंकि कोर घटक वर्ग यह निर्धारित नहीं कर सकते कि नया Intent पुराना से अधिक महत्वपूर्ण है या नहीं। यह सब परवाह है कि यह एक Intent है, यह नहीं है। यही कारण है कि हम इन तरह की विधियों को ओवरराइड करते हैं, ताकि हम निर्धारित करें कि क्या महत्वपूर्ण है और क्या नहीं है। सामान्य भावना यह है कि Activity जैसे बेस क्लासेस हमारे पास जो भी डेटा चाहते हैं, उसका उपयोग कर सकते हैं (जब तक हम इसे ओवरराइड नहीं करते हैं और अन्यथा बताते हैं)। हालांकि, जब तक हम उन्हें विशेष रूप से नहीं बताते हैं, तब तक उन्हें हमारे डेटा से छुटकारा नहीं मिलना चाहिए (और अक्सर नहीं)। यह एक तर्क है कि आप वास्तव में कुछ प्रोग्रामर के साथ नहीं चाहते हैं। हेहे

उम्मीद है कि इससे मदद मिलती है।

+0

मैं वास्तव में इस उत्तर की सराहना करता हूं। उद्देश्य अब मेरे लिए बहुत स्पष्ट है। चीयर्स! – w3bshark

2

onNewIntent राज्य के लिये दस्तावेज: "ध्यान दें कि getIntent() अभी भी मूल आशय रिटर्न आप setIntent (आशय) इस नए आशय करने के लिए इसे अपडेट कर सकते।।" मेरा अनुमान है कि ऑनइंटेंट मौजूद है ताकि आपकी गतिविधि को अधिसूचित किया जा सके और सुपर शायद कुछ भी नहीं करता है।

1

मैंने अपने onNewIntent(Intent intent) कार्यान्वयन से setIntent(intent) कोड हटा दिया है।

कारण: मेरा मुख्य सक्रियता एकल शीर्ष है। जबकि मेरा ऐप चलता है, यह कैमरे की गतिविधि जैसी अन्य गतिविधियों को लॉन्च करता है। जब ऐप मुख्य क्रियाशीलता पर वापस आ जाता है, onResume() में (अंतिम) getIntent() द्वारा लौटाया गया इरादा फिर से संसाधित किया जाएगा, भले ही इसे पहले से संसाधित किया गया हो।

मेरा नया कार्यान्वयन (अब तक काम कर रहा है): निजी उदाहरण फ़ील्ड में onNewIntent(Intent intent) से इरादा स्टोर करें। onResume में इस फ़ील्ड को नल के लिए जांचें और इसे तुरंत शून्य पर रीसेट करें, एक बार और केवल एक बार इरादे को संसाधित करें।

यह भी देखें https://groups.google.com/forum/#!topic/android-developers/vrLdM5mKeoY

संबंधित मुद्दे

 संबंधित मुद्दे