जब वास्तव में onSaveInstanceState () और onRestoreInstanceState () कहा जाता है?


102

निम्नलिखित आंकड़ा ( आधिकारिक डॉक्टर से ) एक एंड्रॉइड गतिविधि के प्रसिद्ध जीवनचक्र का वर्णन करता है :

यहां छवि विवरण दर्ज करें

दूसरी ओर, जब सिस्टम द्वारा गतिविधि को नष्ट कर दिया जाता है (उदाहरण के लिए क्योंकि मेमोरी को पुनः प्राप्त करने की आवश्यकता होती है), गतिविधि की स्थिति कभी-कभी स्वचालित रूप से सहेज ली जाती है और विधियों के माध्यम से पुनर्स्थापित की जाती है , onSaveInstanceState()और onRestoreInstanceState()जैसा कि निम्न आकृति द्वारा सचित्र है से आधिकारिक दस्तावेज़ ):

यहां छवि विवरण दर्ज करें

मुझे लगता है कि बारे में पता कर रहा हूँ onSaveInstanceState()है हमेशा नहीं बुलाया एक गतिविधि के बारे में नष्ट किया जा रहा है जब। उदाहरण के लिए, यदि यह नष्ट हो जाता है क्योंकि उपयोगकर्ता ने "बैक" बटन दबाया है, तो गतिविधि स्थिति संरक्षित नहीं है। लेकिन उन मामलों में जब राज्य को बचाया और बहाल किया जाता है, और onSaveInstanceState()/ onRestoreInstanceState()बुलाया जाता है, जब वे वास्तव में कहा जाता है ?

उदाहरण के लिए, ऊपर के आंकड़ों के अनुसार, onRestoreInstanceState()इससे पहले कहा जा सकता है onStart(), या बाद में onStart()लेकिन इससे पहले onResume(), या बाद में onResume()। इसी तरह, कई संभावनाएं मौजूद हैं onSaveInstanceState()। तो उन्हें कब बुलाया जाता है?

आदर्श रूप से, मैं जो चाहूंगा, वह एक संयुक्त आरेख है जो गतिविधि जीवनचक्र की स्थिति और बचत / पुनर्स्थापना विधियों को दिखाएगा , अगर यह मौजूद है।


Android आधिकारिक दस्तावेज़, onSaveInstanceState () से onPause () और onStop () के बीच अंतिम उत्तर मिला।
ऋषि

1
@ ऋषि क्या आप उस दस्तावेज़ का लिंक प्रदान कर सकते हैं?
लुइस मेंडो


पढ़ें अपनी गतिविधि को सहेजें वहां अनुच्छेद
ऋषि

चाहे मैं सही हूं या नहीं, कृपया स्पष्ट करें
ऋषि

जवाबों:


107

प्रति प्रलेखन :

शून्य onRestoreInstanceState (बंडल सहेजा गया InstanceState)

इस विधि के बीच onStart()और कहा जाता है onPostCreate(Bundle)

शून्य onSaveInstanceState (बंडल आउटस्टेट करें)

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


1
धन्यवाद। क्या आप दस्तावेज़ को लिंक प्रदान कर सकते हैं?
लुइस मेंडो

वहाँ तुम जाओ, मुझे भी नहीं लगता कि onStart () और onPostCreate () के बीच कुछ और है, इसलिए onRestoreInstanceState () श्रृंखला में अच्छी तरह से परिभाषित है।
स्टीव एम

बहुत बहुत धन्यवाद। इस मुद्दे को स्पष्ट करता है
लुइस मेंडो

1
@SteveM "इस बारे में कोई गारंटी नहीं है कि यह ऑनपॉइंट से पहले या बाद में होगा (") क्या इसका मतलब है कि अगर हम किसी दृश्य (एक मानदंड से एक सूचकांक की तरह, बचाने के लिए कुछ मूल्य प्राप्त करने के लिए) का उपयोग करने की कोशिश करते हैं, तो हम NulloneointerException में चल सकते हैं?
टिआगो

3
फिर, क्या अनुशंसा की जाती है, ऑनपॉज़ में एक डेटा संरचना को सहेजना और इसे ऑन-ऑन में पुनर्स्थापित करना इसके बजाय onSaveInstanceState और onRestoreInstanceState?
गोदेल 77

18

Doc1 और doc2 के अनुसार

onSaveInstanceState

हनीकॉम्ब से पहले, गतिविधियों को तब तक हत्या योग्य नहीं माना जाता था जब तक कि उन्हें रोक नहीं दिया गया था, जिसका अर्थ है कि onSaveInstanceState () को ऑनपॉज़ () से तुरंत पहले बुलाया गया था। हालांकि, हनीकॉम्ब के साथ शुरू होने के बाद, गतिविधियों को केवल तभी रोका जा सकता है जब उन्हें रोक दिया जाता है, जिसका अर्थ है कि onSaveInstanceState () अब onPtop () के बजाय onPause () से पहले बुलाया जाएगा।

onRestoreInstanceState

इस विधि को onStart () और onPostCreate (बंडल) के बीच कहा जाता है, जब गतिविधि को पहले से सहेजे गए राज्य से पुन: प्रारंभ किया जा रहा हो


जिस तरह से आपने अलग-अलग एंड्रॉइड संस्करणों पर परिदृश्यों का वर्णन किया, वह पसंद आया
जिमित पटेल

14

पहले से ही पोस्ट किए गए उत्तरों के अलावा, एंड्रॉइड पी में पेश किया गया एक सूक्ष्म परिवर्तन है, जो है:

शून्य onSaveInstanceState (बंडल आउटस्टेट करें)

अगर कहा जाए तो यह तरीका AFTER होगा onStop() पी के साथ शुरू होने वाले प्लेटफार्मों को लक्षित करने वाले अनुप्रयोगों के लिए । पहले के प्लेटफ़ॉर्म संस्करणों को लक्षित करने वाले अनुप्रयोगों के लिए यह विधि पहले होगी onStop()और इस बारे में कोई गारंटी नहीं है कि यह पहले या बाद में होगीonPause()

स्रोत: डॉक्स

यह परिवर्तन क्यों पेश किया जाता है, इसका उत्तर यहां दिया गया है:

... इसलिए एक एप्लिकेशन सुरक्षित रूप से टुकड़ा लेनदेन onStop()कर सकता है और बाद में लगातार स्थिति को बचाने में सक्षम होगा।

स्रोत: डॉक्स


हाय, बढ़िया टिप्पणी। क्या आप जानते हैं कि P से टारगेट करने वाला ऐप कैसे व्यवहार करेगा लेकिन लोअर एपी पर चलता है? एप्लिकेशन को लोअर एपी के रूप में समान किया गया है या यह एपी के अनुरूप होगा और "एपी" व्यवहार को लक्षित करेगा?
फिलीपिकोविज़

@Filipkowicz, Do you know how will behave app that target P but runs on lower api?जब तक कि ऐप M पर चलाया जा रहा है, तब तक Android के संस्करण में इस उपकरण में परिवर्तन नहीं होते हैं, जो P में पेश किए जाते हैं, जिसका अर्थ है कि परवाह किए बिना आपके पास निर्दिष्ट लक्ष्य है जैसा कि Pआप नहीं देखेंगे। प्री-पी उपकरणों के लिए अलग। उम्मीद है कि यह आपके प्रश्न का उत्तर देगा।
अजीज़बेकिन

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

6

यह onSaveInstanceState (बंडल) के लिए एक अतिरिक्त जानकारी है

डॉक्स से

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

तो यह डिफ़ॉल्ट कार्यान्वयन के लिए है ..

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


0
String activityState;
@Override 
public void onCreate(Bundle savedInstanceState) {
// call the super class onCreate to complete the creation of activity like 
// the view hierarchy 
super.onCreate(savedInstanceState);

// recovering the instance state 
if (savedInstanceState != null) {
     activityState = savedInstanceState.getString(STATE_KEY);
 } 

   setContentView(R.layout.main_activity);
   mTextView = (TextView) findViewById(R.id.text_view);
} 

// यह कॉलबैक तभी कहा जाता है जब पहले से सहेजे गए इंस्टेंस का उपयोग करके सहेजा जाता है // onSaveInstanceState ()। हम onCreate () में कुछ राज्य को पुनर्स्थापित करते हैं, जबकि हम वैकल्पिक रूप से अन्य राज्य को यहां पुनर्स्थापित कर सकते हैं, संभवतः onStart () के बाद उपयोग करने योग्य है। // saveInstanceState बंडल एक जैसा है जो onCreate () में उपयोग किया जाता है।

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) {
 mTextView.setText(savedInstanceState.getString(STATE_KEY));
  } 


// invoked when the activity may be temporarily destroyed, save the instance 
//state here 
//this method will be called before onstop

@Override 
 public void onSaveInstanceState(Bundle outState) {
    outState.putString(STATE_KEY, activityState);

    // call superclass to save any view hierarchy 
    super.onSaveInstanceState(outState);
} 

क्षमा करें, इस प्रश्न का उत्तर कैसे देता है जब सहेजें / पुनर्स्थापना के तरीके कहे जाते हैं, वास्तव में ?
लुइस मेंडो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.