2013-07-06 3 views
8

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

ऑनर्यूम को बुलाया जाता है, जिसे किसी गतिविधि के लिए जीवन चक्र के हिस्से के रूप में दस्तावेज किया जाता है। मुझे समझ में नहीं आता है कि ऑनक्रेट को फिर से क्यों नहीं बुलाया जाता है। बटन के क्लिक श्रोता के लिए नींद मोड से बाहर आने के बाद भी कार्य करना संभव है? आपको लगता है कि एंड्रॉइड ने गतिविधि से जुड़ी सभी चल रही प्रक्रियाओं को नष्ट कर दिया है जिसमें बटन के क्लिक श्रोता शामिल हैं।

+0

आखिरकार आप क्या चाहते हैं! –

+1

निश्चित रूप से, यह वही है जो मैं चाहता हूं लेकिन मेरा सवाल यह है कि क्या हो रहा है। संचालकों और धागे नष्ट नहीं कर रहे हैं, मैं केवल यह मान सकते हैं कि एंड्रॉयड (या हार्डवेयर) "रोक" सभी प्रक्रियाओं का राज्य (सिवाय एक AlarmManager की तरह है) और फिर इस राज्य "को रोकना बंद करके" डिवाइस के लिए आता है के लिए सक्षम है नींद मोड से बाहर। मुझे लगता है कि बैटरी को बचाने के लिए डिवाइस के आर्किटेक्चर द्वारा यह केवल संभव है। वास्तव में दिलचस्प क्या है कि यदि यह सच है, नींद मोड से बाहर आने पर पृष्ठभूमि सेवाएं क्यों जीवित नहीं रहती हैं। वे वास्तव में नींद मोड के दौरान मारे जा सकते हैं और कर सकते हैं। – AndroidDev

उत्तर

1

आपका क्या मतलब है, onCreate() क्यों नहीं कहा जाता है?

सरल उत्तर: स्क्रीन बंद होने पर आपकी गतिविधि को नष्ट नहीं किया जा रहा है, इसलिए onCreate() के लिए फिर से कॉल करने का कोई कारण नहीं है।

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

मुझे लगता है कि नींद मोड को इंगित करना और स्क्रीन को बंद करना एक ही बात नहीं है। जब आप स्क्रीन बंद करते हैं, तो यह तुरंत नींद मोड में जा सकता है या नहीं। जब स्क्रीन बंद हो जाती है लेकिन यह अभी तक नींद मोड में नहीं जाती है, तो सीपीयू अभी भी काम कर रहा है और सेवा अभी भी चल रही है। जब फोन नींद मोड में जाता है तो यह सीपीयू को कम करता है, अनिवार्य रूप से सभी प्रक्रियाओं को "ठंडा" करता है, और नतीजतन सभी services भी। Wakelocks का उपयोग फोन को नींद मोड में जाने से रोकता है, यही वजह है कि फोन की स्क्रीन एक विस्तृत अवधि के लिए बंद होने पर सेवाएं अभी भी चलेंगी। यदि आपने इसे अभी तक नहीं पढ़ा है, तो Service reference में कुछ अच्छी जानकारी है। यह अपने जीवन चक्र पर चर्चा करता है और कैसे एंड्रॉइड इसके स्मृति उपयोग को प्राथमिकता देता है।

+0

आपकी स्पष्टीकरण यह नहीं बताती है कि लंबी अवधि के लिए स्क्रीन बंद होने पर सेवाओं को क्यों मार दिया जाता है। वाकेलॉक के बारे में भूल जाओ क्योंकि स्पष्टीकरण के साथ इसका कोई लेना-देना नहीं है कि क्यों एक गतिविधि की प्रक्रिया बरकरार रहती है और जब स्क्रीन वापस आती है तो उसे बहाल किया जाता है। – AndroidDev

+0

जब आपकी डिवाइस को स्मृति की आवश्यकता होती है तो यह आपकी पूरी प्रक्रिया को मार सकती है। इसमें आपकी गतिविधि और सेवाएं शामिल हैं। जैसा कि इस जवाब में कहा गया है, यह हर बार डिवाइस सोने जा रहा है, यह होने की गारंटी नहीं है। इस जवाब में जो कहा गया था, उसके विपरीत, प्रक्रिया को मारने पर डेस्ट्रॉय() को नहीं कहा जा सकता है। – AsafK

0

Android की गतिविधि लाइफसाइक्ल एंड्रॉइड पर कई वर्षों के मूल विकास के बाद अत्यधिक जटिल और Romain Guy states he doesn't understand it fully भी है। आप यह मान सकते हैं कि एंड्रॉइड ओएस आपके क्रियाकलाप जीवन चक्र में हस्तक्षेप कर सकता है, यह पृष्ठभूमि में होने पर यह कैसा लग सकता है। activity lifecycle केवल वास्तविक व्यवहार का प्रतिनिधित्व करता है, ज्यादातर मुझे अनुभव और निशान और त्रुटि के माध्यम से मेरी समझ मिलती है।

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

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

+0

रोमैन के बयान के लिए उस लिंक के लिए कोई अपडेट? पढ़ने के लिए ऐसा मणि होगा, लेकिन हां, हम नहीं कर सकते! – user3175580

0

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

+0

यदि आपको आवश्यकता हो, तो कृपया अधिक स्पष्टीकरण मांगें, या यदि आपको लगता है कि यह उत्तर आपके संदेह को लक्षित नहीं करता है। –

+0

मुझे नहीं लगता कि घर दबाकर या पावर बटन दबाकर वर्तमान गतिविधि को पीछे की ढेर पर रखा जाता है। – for3st

+0

तो onPause विधि, जबकि यह कर बुलाया जाता है, की तुलना में यह मतलब है DVM है backstack में वर्तमान गतिविधि डाल। हो सकता है इस लिंक अपने संदेह को हल करती है, http://stackoverflow.com/questions/5001682/android-memory-management-in-activity-lifecycle गतिविधि जीवन चक्र और स्मृति प्रबंधन के बारे में माइकल के जवाब देखें। –

0

संक्षिप्त उत्तर: onCreate() को Activity बनने पर कॉल किया जाता है। एक डिवाइस नींद में जा रहा है और वापस आ के लिए व्यवहार के रूप में onPause() और onResume() कॉल परिभाषित किया गया है। डिवाइस नींद ऐप या गतिविधि को मार नहीं पाएगी - राज्य (लगभग) वही रहता है।

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