2011-06-24 12 views
82

क्या कोई मुझे बता सकता है कि पहले कहलाता है, क्या यह onActivityResult() है या यह onResume() है? उदाहरण:पर एक्टिविटी रिसेट() और ऑनर्यूम()

गतिविधि एक कॉल startActivityForResult() गतिविधि बी बी कार्यान्वित शुरू करने के लिए, पूरा करता है और एक करने के लिए एक परिणाम देता है, लेकिन एक की जो विधि पहले कहा जाता है, onActivityResult() या onResume()?

मुझे पता है कि किसी ने पहले से ही इस प्रश्न का उत्तर Activity Docs का जिक्र कर दिया है, हालांकि मैं वहां खुद को नहीं ढूंढ पाया।

उत्तर

106

पहले कॉलिंग onActivityResult() फिर onResume()। डॉक्स से

उद्धरण:

संरक्षित शून्य onActivityResult (पूर्णांक requestCode, पूर्णांक resultCode, आशय डेटा)

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

+1

अभी तक मेरा कोड एक्टिविटी रिसेट पर कॉल कर रहा है * ऑनस्टार्ट *: -/ –

+1

ये चित्र गतिविधि और टुकड़े के पूर्ण जीवन चक्र को समझने के लिए उपयोगी हो सकते हैं: https: // github।com/xxv/android-lifecycle – Sergii

10

onActivityResult() पहले कहा जाता है (बस कुछ ही लॉग बयान के साथ इस बात की पुष्टि की और देखते हैं कि onActivityResult() वास्तव में onResume() से पहले कहा जाता है)

+2

मेरे परीक्षण भी पुष्टि करते हैं। onResume() को ACTITYResult() पर बाद में बुलाया जाता है। –

34

के रूप में दूसरों को तैनात किया है, onActivityResult() onResume से पहले कहा जाता है() जब अपने गतिविधि को पुनरारंभ किया जा रहा है।

डियान हैकबर्न बताते हैं कि ऑन एक्टिविटी रिसेट() को यूआई को प्रभावित करने के लिए यूआई को प्रभावित करने और यूआई को अपडेट करने से पहले उपलब्ध होने की अनुमति देने के लिए कहा जाता है (संभावित रूप से डबल अपडेट से बचने के लिए - एक बार रेज़्यूम में () लौटा परिणाम के बिना, और फिर एक्टिविटी रिसेट() में, लौटा परिणाम जोड़ना)। इस के

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/3epIML7fjGw

एक परिणाम यह है कि किसी भी initializations आप का फैसला किया है हो सकता है onResume() (जैसे, एक बाहरी स्रोत से डेटा का initializations है कि आप ताजा होने की जरूरत है) के बजाय onCreate की तुलना में (भीतर ही प्रदर्शन करने के लिए है), जब unctivityResult() पर एक कॉल को ओएस द्वारा स्मृति से बाहर निकाला गया है, तो पुन: प्रारंभ करने के हिस्से के रूप में होता है (क्योंकि ऑनस्यूम() को एक्टिविटी रिसैट() से पहले नहीं कहा जाता था।

इस स्थिति में, atctivityResult() को पर पर उपयोग किए जाने वाले ऐसे चर के लिए प्रारंभिक कार्य करने के लिए तैयार होना होगा।

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

इस से निपटने का एक और तरीका है एक्टिविटी रिसैट() द्वारा आवंटित जानकारी को स्टोर करने के लिए, जो रेस्यूम() द्वारा उठाया जाएगा और वहां संसाधित किया जाएगा (किसी भी आवश्यक प्रारंभिकरण के बाद रेज़्यूम() द्वारा किया गया है) AtctivityResult() के शरीर के भीतर प्रसंस्करण कर रहा है।

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

इस अनुक्रमण के आस-पास के कुछ मुद्दों (ऐप के अनुप्रयोग ऑब्जेक्ट का उपयोग करने के प्रयासों के बारे में चेतावनी सहित, इसके प्रभाव से चर की रक्षा करने के प्रयासों के बारे में चेतावनी सहित), यहां एक हाथ से खींचे गए यूएमएल अनुक्रम आरेख के साथ एक सूचनात्मक अन्वेषण है, यहां:

इस के

http://steveliles.github.com/android_activity_lifecycle_gotcha.html

-1

एक परिणाम यह है कि किसी भी initializations आप का फैसला किया है हो सकता है onResume() के भीतर ही प्रदर्शन करने के लिए है (उदाहरण के लिए, एक बाहर स्रोत से डेटा का initializations है कि आप ताजा होने की जरूरत है) के बजाय onCreate() की तुलना में, होगा onActivityResult() पर कॉल करने पर एक ऐप को पुनरारंभ करने के हिस्से के रूप में प्रारंभ होने पर अनियंत्रित किया जाए जैसा कि ओएस द्वारा स्मृति से बाहर निकला गया है (क्योंकि onResume()onActivityResult() से पहले नहीं कहा गया था)।

इस स्थिति में, AtctivityResult() को एक्टिविटी रिसेट() द्वारा उपयोग किए जाने वाले किसी भी चर के लिए प्रारंभिकरण करने के लिए तैयार रहना होगा।

बेशक

, initializations onActivityResult() की जरूरत नहीं बल्कि onResume() की तुलना में onCreate() में प्रदर्शन किया जा सकता है, तो onCreate() के बाद से दोनों onActivityResult() और onResume() से पहले एक पुनः आरंभ करने पर बुलाया जाएगा, कि सामान के लिए जाने के लिए सबसे आसान तरीका यह होगा कि आप प्रत्येक बार ऐप फिर से शुरू होने की आवश्यकता नहीं है। यदि, हालांकि, आप जिस डेटा को प्रारंभ कर रहे हैं वह बाहरी स्रोत से आता है और आपको इसे ताजा होने की आवश्यकता है, तो आप onCreate() और onResume() दोनों में ऐसे डेटा को प्रारंभ करना चाहते हैं, onResume()onCreate() में ध्वज सेट की जांच करने के लिए डेटा देखने के लिए बस onCreate() में आरंभ किया गया था, और उसके बाद इसे onResume() में अपडेट किया गया था, अगर वे नहीं हैं। इस तरह, इसका कुछ विंटेज हमेशा उपलब्ध रहेगा (कम से कम पिछली बार ऐप फिर से शुरू होने के बाद)।

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