दिलचस्प पोस्ट
क्या मैं किसी सी # स्ट्रिंग मान को एक पलायन स्ट्रिंग में परिवर्तित कर सकता हूँ कंसट्रक्टर में यह () और सुपर () को पहला वक्तव्य क्यों होना चाहिए? एंड्रॉइड: टेक्स्टव्यू: ऊपर और नीचे पर रिक्ति और पैडिंग निकालें जावा – अपने घटकों के साथ जेपीएनएल खींचें और ड्रॉप कैसे करें त्रुटि: Servlet जार लोड नहीं है … आक्रमण वर्ग: javax / servlet / Servlet.class डीजेन्गो-स्टोरेज और अमेज़ॅन एस 3 के साथ एक डीजेंगो प्रोजेक्ट को सेट अप कैसे करें, लेकिन स्थिर फाइलों और मीडिया फ़ाइलों के लिए अलग-अलग फ़ोल्डरों के साथ? एएनटीएलआर में 'सिमेंटिक स्पिटकेंट' क्या है? फ़ंक्शन में एक सबफ़ंक्शन के साथ काम क्यों नहीं करता? मैं iPhone पर प्रोग्राम को एक छवि कैसे दिखाऊंगा? कार्डव्यू लेआउट_विंड = "मैच_पेरेंट" अभिभावक रीसाइक्लरदृश्य चौड़ाई से मेल नहीं खाता जेएसपी पृष्ठ में एक डेटाबेस से छवियों को कैसे प्राप्त और प्रदर्शित करना है? कैसे एक Firebase डीबी में प्रारंभिक डेटा को हटाने के लिए एक जार के अंदर एक फ़ाइल को संशोधित करना रेल में गतिशील बाइंडिंग के साथ एक कच्चे अद्यतन एसक्यूएल निष्पादित कैसे करें रोबोट को एक फ़ॉर्म भरने से कैसे रोका जा सकता है?

onSaveInstanceState () और onRestoreInstanceState ()

मैं सेव onSaveInstanceState() और onRestoreInstanceState() तरीकों का उपयोग कर एक Activity की स्थिति को बचाने और पुनर्स्थापित करने का प्रयास कर रहा हूं।

समस्या यह है कि वह कभी भी पर onRestoreInstanceState() नहीं है। क्या कोई मुझे बता सकता है कि यह क्यों है?

वेब के समाधान से एकत्रित समाधान "onSaveInstanceState () और onRestoreInstanceState ()"

आम तौर पर आप अपने राज्य को onCreate() में बहाल करते हैं इसे रिस्टोर onRestoreInstanceState() पर भी पुनर्स्थापित करना संभव है, लेकिन बहुत आम नहीं है ( onRestoreInstanceState() को onRestoreInstanceState() बाद कहा जाता है, जबकि onStart() से पहले कहा जाता है।

onSaveInstanceState() में मूल्यों को संगृहीत करने के लिए रखा विधियों का उपयोग करें:

 protected void onSaveInstanceState(Bundle icicle) { super.onSaveInstanceState(icicle); icicle.putLong("param", value); } 

और onCreate() में मानों को पुनर्स्थापित करें:

 public void onCreate(Bundle icicle) { if (icicle != null){ value = icicle.getLong("param"); } } 

आपको दृश्यों को संग्रहीत करने की ज़रूरत नहीं है, क्योंकि वे super.onSaveInstanceState (icicle) को कॉल करके स्वचालित रूप से संग्रहीत किए जाते हैं।;

onRestoreInstanceState() केवल तब कहा जाता है जब यह ओएस द्वारा मार डाला जाने के बाद की गतिविधि को onRestoreInstanceState() । ऐसी स्थिति तब होती है जब:

  • डिवाइस परिवर्तन की ओर उन्मुखीकरण (आपकी गतिविधि नष्ट हो जाती है और पुन: निर्मित)
  • आपके सामने एक और गतिविधि है और कुछ बिंदु पर ओएस आपकी गतिविधि को मारता है ताकि स्मृति मुक्त हो सके (उदाहरण के लिए)। अगली बार जब आप onRestoreInstanceState() अपनी गतिविधि शुरू करते हैं तो उसे बुलाया जाएगा।

इसके विपरीत: यदि आप अपनी गतिविधि में हैं और आप डिवाइस पर Back बटन दबाते हैं, तो आपकी गतिविधि समाप्त होती है () एड (यानी डेस्कटॉप अनुप्रयोग को निकलने के रूप में सोचें) और अगली बार जब आप अपना ऐप शुरू करते हैं तो यह "ताज़ा" शुरू हो जाता है, अर्थात बिना सहेजे हुए स्थिति के कारण, जब आप Back हिट करने पर जानबूझकर इसे बाहर निकल आए थे

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

सब कुछ, जैसा कि onRestoreInstanceState() लिए दस्तावेज में बताया गया है:

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

जैसा कि मैंने इसे पढ़ा है: onRestoreInstanceState() पर ओवरराइड करने का कोई कारण नहीं है जब तक कि आप उप- onRestoreInstanceState() Activity नहीं कर रहे हैं और यह अपेक्षित है कि कोई आपके उपवर्ग को उप-वर्ग देगा

जिस स्थिति पर आप सहेजते हैं, onSaveInstanceState() पर बाद में उपलब्ध onSaveInstanceState() onCreate() विधि का आह्वान। तो onCreate (और इसके Bundle पैरामीटर) पर अपनी गतिविधि की स्थिति को पुनर्स्थापित करने के लिए उपयोग करें।

मुख्य बात यह है कि यदि आप onSaveInstanceState() स्टोर नहीं करते हैं, तो फिर onRestoreInstanceState() को कॉल नहीं किया जाएगा। यह restoreInstanceState() और restoreInstanceState() बीच मुख्य अंतर है सुनिश्चित करें कि आप वास्तव में कुछ संग्रहीत करें सबसे अधिक संभावना यह आपकी समस्या है

मैंने पाया कि ऑनसाइट इन्स्टैंसस्टेट को हमेशा कहा जाता है जब एक अन्य गतिविधि अग्रभूमि पर आती है और ऐसा ही है।

हालांकि, OnStestoreInstanceState को केवल तब कहा जाता था जब onCreate और onStart भी कहा जाता था। और, क्रिएट और ऑनस्टर्ट को हमेशा नहीं कहा जाता था।

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

चित्रा 2 यह वर्णन करता है।

एक वैकल्पिक हल के रूप में, आप डेटा के साथ एक बंडल स्टोर कर सकते हैं जिसे आप गतिविधि ए को प्रारंभ करने के लिए उपयोग किए गए आशय में बनाए रखना चाहते हैं।

 Intent intent = new Intent(this, ActivityA.class); intent.putExtra("bundle", theBundledData); startActivity(intent); 

गतिविधि ए को यह गतिविधि बी पर वापस करना होगा। आप गतिविधि बी की क्रिएट विधि में आशय पुनः प्राप्त करेंगे।

 Intent intent = getIntent(); Bundle intentBundle; if (intent != null) intentBundle = intent.getBundleExtra("bundle"); // Do something with the data. 

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

मुझे लगता है कि यह धागा काफी पुराना था। मैं सिर्फ एक और मामले का जिक्र करता हूं, जो कि onSaveInstanceState() को भी बुलाया जाएगा, जब आप Activity.moveTaskToBack(boolean nonRootActivity) कॉल Activity.moveTaskToBack(boolean nonRootActivity)Activity.moveTaskToBack(boolean nonRootActivity)

यदि आप android:configChanges="orientation|screenSize" साथ क्रियाकलाप की ओरिएंटेशन परिवर्तन संभाल रहे हैं android:configChanges="orientation|screenSize" और onConfigurationChanged(Configuration newConfig) , onRestoreInstanceState() को नहीं कहा जाएगा।

यह आवश्यक नहीं है कि OnStestInStanceState को हमेशा सेववेस्टास्टस्टैट के बाद कहा जाएगा।

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

मेरे मामले में, onRestoreInstanceState को तब बुलाया गया जब डिवाइस की ओरिएंटेशन बदलने के बाद गतिविधि का पुनर्गठन किया गया था। onCreate(Bundle) को सबसे पहले बुलाया गया था, लेकिन बंडल में मेरे पास onSaveInstanceState(Bundle) साथ सेट की गई कुंजी / मूल्य नहीं था।

इसके ठीक बाद, onRestoreInstanceState(Bundle) को एक बंडल के साथ बुलाया गया था, जिसकी सही कुंजी / मूल्य थी।

मैं बस इस में भाग गया और यह देख रहा था कि प्रलेखन का मेरा जवाब था:

"यह फ़ंक्शन किसी रिक्त स्थिति से कभी भी नहीं बुलाया जाएगा।"

https://developer.android.com/reference/android/view/View.html#onRestoreInstanceState(android.os.Parcelable)

मेरे मामले में, मैं सोच रहा था कि प्रारंभिक तत्काल पर ऑनस्टस्टोर इंटरस्टैस्ट को क्यों नहीं बुलाया जा रहा था इसका यह भी अर्थ है कि यदि आप कुछ भी संग्रहीत नहीं करते हैं, तो जब आप अपने दृश्य को फिर से संगठित करने के लिए जाते हैं, तब इसे नहीं बुलाया जाएगा।

मैं ऐसा कर सकता हूँ (खेद है कि यह सी # नहीं है लेकिन यह एक समस्या नहीं है …):

 private int iValue = 1234567890; function void MyTest() { Intent oIntent = new Intent (this, typeof(Camera2Activity)); Bundle oBundle = new Bundle(); oBundle.PutInt("MYVALUE", iValue); //=> 1234567890 oIntent.PutExtras (oBundle); iRequestCode = 1111; StartActivityForResult (oIntent, 1111); } 

और परिणाम के लिए आपकी गतिविधि में

 private int iValue = 0; protected override void OnCreate(Bundle bundle) { Bundle oBundle = Intent.Extras; if (oBundle != null) { iValue = oBundle.GetInt("MYVALUE", 0); //=>1234567890 } } private void FinishActivity(bool bResult) { Intent oIntent = new Intent(); Bundle oBundle = new Bundle(); oBundle.PutInt("MYVALUE", iValue);//=>1234567890 oIntent.PutExtras(oBundle); if (bResult) { SetResult (Result.Ok, oIntent); } else SetResult(Result.Canceled, oIntent); GC.Collect(); Finish(); } 

आखिरकार

 protected override void OnActivityResult(int iRequestCode, Android.App.Result oResultCode, Intent oIntent) { base.OnActivityResult (iRequestCode, oResultCode, oIntent); iValue = oIntent.Extras.GetInt("MYVALUE", -1); //=> 1234567890 }