Android गतिविधियों को नष्ट करने, प्रक्रियाओं को मार रहा है


117

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

... मेरे आवेदन का क्या होगा?

  1. क्या स्मृति को पुनर्प्राप्त करने के लिए सिस्टम केवल एक या मेरी कुछ गतिविधियों को नष्ट कर सकता है?
  2. क्या सिस्टम मेरे आवेदन की पूरी प्रक्रिया को मार देगा? क्या सभी गतिविधियों को अच्छी तरह से नष्ट कर दिया जाएगा?
  3. जब मैं पूरी तरह से मारा गया तो मैं अपने आवेदन पर वापस आऊंगा तो क्या होगा? क्या यह भीख से शुरू होगा (पहली शुरुआत की तरह) या यह प्रचलित अवस्था में गतिविधियों को पुनर्प्राप्त करने की कोशिश करेगा / यदि हाँ - तो क्या यह केवल स्टैक के शीर्ष पर है या उन सभी में से एक है?

अपडेट करें:

इस सवाल को पूछने से पहले मैंने गतिविधि जीवन चक्र को कुछ बार देखा है लेकिन इसमें मेरे सवालों के जवाब नहीं हैं। मैंने कुछ परीक्षण किए और मेरे पास कुछ उत्तर हैं। DDMS में "स्टॉप प्रोसेस" परीक्षण के लिए एक संकेत था।

मैंने प्रश्न 1 के उत्तर का परीक्षण नहीं किया है, लेकिन जैसा कि गाइड कहता है:

यदि कोई गतिविधि रोक दी जाती है या बंद कर दी जाती है, तो सिस्टम गतिविधि को मेमोरी से ड्रॉप कर सकता है या तो इसे समाप्त करने के लिए कह सकता है, या बस इसकी प्रक्रिया को मार सकता है।

ऐसा लगता है कि प्रक्रिया को मारे बिना एक या एक से अधिक गतिविधियों को धीरे से (onDestroy विधि के साथ) नष्ट किया जा सकता है। आप बस (onCreate + बंडल) उन्हें वापस मिलने पर प्राप्त करेंगे।

प्रश्न 2 उत्तर:

हाँ। आम तौर पर सिस्टम पूरी प्रक्रिया को मारता है इसका मतलब है कि गतिविधियों और स्थिर क्षेत्रों सहित सभी डेटा नष्ट हो जाते हैं। यह अच्छी तरह से नहीं किया गया है - आपको अपनी रुकी हुई / रुकी हुई किसी भी गतिविधि के लिए onDestroy या finialize () नहीं मिलेगा। यही कारण है कि saveInstanceState () को ऑनपॉज विधि से ठीक पहले कहा जाता है। ऑनपॉज मूल रूप से अंतिम विधि है जहां आपको कुछ बचाना चाहिए क्योंकि इस विधि के बाद आप कभी भी onStop या onDestroy नहीं देख सकते हैं। सिस्टम आपकी सभी वस्तुओं को नष्ट करने की प्रक्रिया को मार सकता है और वे जो कुछ भी कर रहे हैं।

प्रश्न 3 उत्तर:

जब आप मारे गए आवेदन पर वापस आ जाएंगे तो क्या होगा?

  • एंड्रॉइड 2.2 से पहले - एप्लिकेशन लॉन्चरिंग से शुरू होगा, लॉन्चर गतिविधि के साथ।
  • 2.2 से शुरू - सिस्टम पिछले एप्लिकेशन स्थिति को पुनर्स्थापित करेगा। इसका क्या मतलब है? इसका मतलब है कि अंतिम दृश्य गतिविधि फिर से बनाई जाएगी (onCreate + बंडल)। गतिविधि स्टैक के साथ क्या होगा? स्टैक ठीक है लेकिन इस पर सभी गतिविधियां मृत हैं। जब आप बैक बटन के साथ इसे प्राप्त करेंगे तो उनमें से प्रत्येक को फिर से बनाया जाएगा (onCreate + बंडल)। इसके बारे में एक और बात है:

जब उपयोगकर्ता होम स्क्रीन से उस कार्य को फिर से चुनता है, तो सामान्य रूप से, सिस्टम एक कार्य को साफ़ कर देता है (कुछ गतिविधियों को रूट गतिविधि के ऊपर से स्टैक से हटा देता है)। आमतौर पर, यह किया जाता है यदि उपयोगकर्ता ने किसी निश्चित समय के लिए कार्य का दौरा नहीं किया है, जैसे कि 30 मिनट।

निष्कर्ष?

  1. ऐसा मत सोचो कि गतिविधि रोटेशन की समस्याओं को संभालना Android द्वारा हल किया जा सकता है: configChanges = "अभिविन्यास"। जब आप ऐसा करते हैं, तो आपको कई अन्य समस्याएं मिलेंगी जिनके बारे में आप जानते भी नहीं हैं।
  2. डीडीएमएस के साथ अपने आवेदन का परीक्षण करें - प्रक्रिया बटन बंद करें। यह देखो
  3. स्थिर चर का उपयोग करते समय सावधान रहें। यह मत सोचिए कि जब आपने उन्हें गतिविधि 1 में आरंभीकृत किया था - तो आपने उन्हें गतिविधि 2 में आरंभीकृत किया होगा। वैश्विक स्टेटिक्स को आरम्भ करने का एकमात्र सुरक्षित स्थान एप्लीकेशन क्लास होगा।
  4. याद रखें कि आप कभी भी onStop या onDestroy नहीं देख सकते हैं। फ़ाइलें / डेटाबेस बंद करें, डाउनलोडकर्ताओं को ऑनपॉज़ में रोकें। जब आप एप्लिकेशन को बीजी में कुछ करने के लिए चाहते हैं - अग्रभूमि सेवा का उपयोग करें।

यही होगा ... आशा है कि मैंने अपने निबंध के साथ मदद की :)


आपकी धारणा के लिए, क्या वे 5 गतिविधियाँ एक ही ऐप या कई अलग-अलग ऐप से आती हैं?
डम्बलिंगर्स

1
"मेरे पास वर्तमान गतिविधि स्टैक पर 5 गतिविधियों के साथ एक आवेदन है" बेशक वे सभी मेरे, एक, एक ही प्रक्रिया आवेदन से हैं।
मार्क

4
धन्यवाद, यह वास्तव में मेरा प्रश्न भी था ... आपके प्रश्न और उत्तर ने मुझे काफी मदद की।
क्रेगर्स84


@ मर्क: क्या यह समस्या अब हल हो गई है? अगर यह कैसे है?
आमेर मोआविया

जवाबों:


30

पहले कृपया इस पर एक नज़र डालें:

img1

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

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

इसलिए, जब आप अपने डिवाइस पर "घर" बटन दबाते हैं, अपने वर्तमान अग्रभूमि गतिविधि पर डाल दिया जाता है onPause()तो onStop(), अन्य 4 रहना चाहिएonStop()

Google के दस्तावेज़ों के अनुसार:

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

और, प्रक्रिया जीवनचक्र के लिए:

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

उपरोक्त सभी उद्धरण निम्नलिखित हैं: Android Developers संदर्भ: गतिविधि

यह पुष्टि की जाती है कि जब आप कुछ मेमोरी खपत करने वाले एप्लिकेशन लॉन्च करते हैं तो सिस्टम गैर-एसिटिव गतिविधियों को नष्ट कर सकता है और यादों को रीसायकल कर सकता है। और आप इसे लागू कर सकते हैं: isFinishing()अपनी गतिविधि में और फिर डीडीएमएस में "किल" बटन का उपयोग करके यह पता लगाने के लिए कि आपकी कौन सी गतिविधियों को सिस्टम द्वारा गिराया जा रहा है। लेकिन मुझे लगता है कि सिस्टम सबसे पुराना सबसे पहले नष्ट कर देगा। हालाँकि अन्य गतिविधियों को रखने का कोई मतलब नहीं है जब "लॉन्च गतिविधि" को पुनर्नवीनीकरण किया गया है।

अपडेट करें

यहाँ मुझे कुछ राय मिली है :

रूकी हुई अवस्था

जब कोई गतिविधि दिखाई नहीं देती है, लेकिन फिर भी स्मृति में है, तो हम कहते हैं कि यह एक रुकी हुई स्थिति में है। स्टॉपिंग एक्टिविटी को फिर से रनिंग एक्टिविटी बनने के लिए सामने लाया जा सकता है। या, इसे नष्ट किया जा सकता है और स्मृति से हटाया जा सकता है।

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

रुकी हुई गतिविधियों को किसी भी समय मेमोरी से हटाया जा सकता है।


4
इस मुद्दे पर प्रलेखन काफी भ्रमित है, हालांकि केवल एक पूरी प्रक्रिया को मारा जा सकता है, न कि व्यक्तिगत घटकों (गतिविधियों, सेवाओं, आदि) को। देखें: stackoverflow.com/questions/7536988/…
greg7gkb

इस सवाल को @ greg7gkb टिप्पणी के लिंक में जानकारी के साथ अद्यतन किया जाना चाहिए, इसकी भ्रामक
ल्यूक डी

1

क्या स्मृति को पुनर्प्राप्त करने के लिए सिस्टम केवल एक या मेरी कुछ गतिविधियों को नष्ट कर सकता है?

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

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

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

यदि किसी गतिविधि को रोक दिया जाता है या रोक दिया जाता है, तो सिस्टम गतिविधि को मेमोरी से ड्रॉप कर सकता है या तो इसे समाप्त करने के लिए कह सकता है, या बस इसकी प्रक्रिया को मार सकता है। जब इसे फिर से उपयोगकर्ता के लिए प्रदर्शित किया जाता है, तो इसे पूरी तरह से फिर से शुरू किया जाना चाहिए और इसकी पिछली स्थिति में पुनर्स्थापित किया जाना चाहिए।


क्या सिस्टम मेरे आवेदन की पूरी प्रक्रिया को मार देगा? क्या सभी गतिविधियों को अच्छी तरह से नष्ट कर दिया जाएगा?

गतिविधि एक व्यक्ति से संबंधित है जबकि प्रक्रिया गतिविधियों के समूह से संबंधित है। तीसरे बिंदु को ऊपर देखें फिर से यह प्रक्रिया को मारता है जैसा कि उल्लेख किया गया है।


जब मैं पूरी तरह से मारा गया तो मैं अपने आवेदन पर वापस आऊंगा तो क्या होगा?

इसके पुनः आरंभ के समान। तीसरा बिंदु फिर से आपको कुछ उत्तर देगाWhen it is displayed again to the user, it must be completely restarted and restored to its previous state

स्मृति से संबंधित सामान के बारे में कुछ और जानकारी यहाँ प्राप्त करें

संपादित करें:
किसी अनुप्रयोग में सभी गतिविधियाँ एक ही प्रक्रिया में चलती हैं। इसलिए जब एक प्रक्रिया को मार दिया जाता है तो सभी गतिविधियाँ 5 या 10 नहीं रह जाती हैं, अर्थात फिर से शुरू हो जाती हैं। पुनः आरंभ आपके एप्लिकेशन को किसी भी सहेजे गए राज्यों से शुरू करने का कारण बनेगा।


2
मैंने कम से कम 5 बार गतिविधि जीवनचक्र देखा है, लेकिन यह मेरे सवालों का जवाब नहीं देता है। जब आपने कहा था कि मेरी ऐप प्रक्रिया के मारे जाने का क्या मतलब होगा - जब मैं ऐप पर वापस लौटता हूं तो उसे पिछली स्थिति में बहाल कर दिया जाता है। इसलिए जब मैंने 5 गतिविधियाँ बंद कर दीं .. तो क्या वे सभी मर गए (onDestroy invoked) जब प्रक्रिया को मार दिया गया था? जब मैं अपने ऐप पर वापस लौटा तो क्या सभी गतिविधियाँ पुनर्स्थापित की गईं (ऑनक्रिएट + बंडल) या केवल स्टैक के शीर्ष पर एक (उपयोगकर्ता के लिए दृश्यमान)?
मार्क

1
एक अनुप्रयोग में सभी गतिविधियाँ एक ही प्रक्रिया में चलती हैं। इसलिए जब एक प्रक्रिया को मार दिया जाता है तो सभी गतिविधियाँ 5 या 10 नहीं रह जाती हैं, अर्थात फिर से शुरू हो जाती हैं। रिस्टार्ट आपके एप्लिकेशन को शुरुआत में बिना किसी सहेजे हुए राज्य से शुरू करने का कारण बनेगा ..
विनय

1
लगभग सच है, लेकिन 2.2 और ऊपर के लिए नहीं। पृष्ठ के शीर्ष पर मेरी अद्यतन देखें।
मार्क

1
नहीं, यह सच नहीं है और कभी सच नहीं रहा है। यह डॉक्स पर आधारित भ्रामक है, लेकिन देखें: stackoverflow.com/questions/7536988/…
greg7gkb

2
@JJPA Android स्मृति को पुनः प्राप्त करने के लिए एकल गतिविधियों को नष्ट नहीं कर सकता है, यह केवल प्रक्रियाओं को नष्ट कर देता है। Android मेमोरी टीम के "मेमोरी किलर से बाहर" क्रियान्वयन में शामिल टीम के सदस्य डायने हैकबोर का यह उत्तर देखें: stackoverflow.com/a/7576275/1290264
बोरसो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.