2011-09-06 8 views
13

बचत बंडल (गतिविधि ए) बचत नहीं कर रहा है:onSaveInstanceState मेरी मूल्यों (onCreate इनपुट बंडल हमेशा रिक्त है)

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putString("test", "value"); 
    super.onSaveInstanceState(outState); 
} 

गतिविधि बी पर नेविगेट कर रहा;

startActivity(new Intent(getBaseContext(), B.class)); 

गतिविधि एक करने के लिए वापस जा रहे हैं:

startActivity(new Intent(getBaseContext(), A.class)); 

मूल्य मैं गतिविधि एक में बंडल को पत्र लिखा लोड करने के लिए कोशिश कर रहा है:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

Log.d("MY", "saved instance is null"+ Boolean.toString(savedInstanceState == null)); 
} 

रिटर्न हमेशा savedInstanceState = अशक्त। मैं यहाँ क्या याद कर रहा हूँ?

onRestoreInstanceState शुरू हो रहा कभी नहीं है जब मैं यह करने के लिए सामग्री जोड़ने से पहले मुख्य गतिविधि

+0

-1? किस लिए? सब कुछ करने की कोशिश की है और एंड्रॉइड एपीआई द्वारा सबकुछ काम करना चाहिए, लेकिन इसकी नहीं। –

+2

क्या आपने इसे हल किया? मैं एक ही मुद्दा है। – blindstuff

+0

मुझे एक ही समस्या है, मुझे यहां कोई जवाब नहीं दिखाई देता है। – Jag

उत्तर

5

आपके कोड में कुछ भी गलत नहीं है। जब गतिविधि ए पर आप लॉग, जो आपके onSaveInstanceState (जिसका अर्थ में निम्नलिखित देखेंगे डिवाइस घूर्णन प्रयास करें) ठीक काम कर रहा है:

saved instance is nullfalse 

यहाँ Android Developer Site है, जो आपको दिलचस्प लग सकती से एक अंश इस प्रकार हैं:

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

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

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 

वर्ष आशय है कि पृष्ठभूमि से बचाया राज्य है जब फिर से शुरू:

+0

'... फिर, यदि सिस्टम आपकी गतिविधि की प्रक्रिया को मारता है और उपयोगकर्ता आपकी गतिविधि पर वापस आ जाता है, तो सिस्टम बंडल को ऑनक्रेट() पर जाता है ...' - isn जब उपयोगकर्ता दूसरी गतिविधि में जाता है तो मेरी गतिविधि मारे जाती है? –

+0

Destroy() :-) पर लॉग इन करने का प्रयास करें। नहीं, इस मामले में, यह नहीं है। प्रत्येक बार लाइन प्रारंभ करने के दौरान गतिविधि का एक नया उदाहरण बनाया जा रहा है सक्रियता (... एक्लास) चल रहा है। – OceanBlue

+0

हां, आप सही हैं। संदर्भ: http://developer.android.com/images/activity_lifecycle.png सारांशित करने के लिए: ** जब उपयोगकर्ता किसी अन्य गतिविधि पर जाता है तो गतिविधि बंद हो जाती है। जब तक सिस्टम ऐसा नहीं कहता है तब तक गतिविधि नष्ट नहीं होती है (उदाहरण के लिए पर्याप्त स्मृति नहीं) ** ** –

2

आप super.onSaveInstanceState (outState) क्या करना है पर वापस जाएँ।

+0

नहीं, काम नहीं कर रहा है। और मुझे यकीन है कि 'super.onSaveInstanceState (आउटस्टेट);' अंत में होना चाहिए। संदर्भ: http://stackoverflow.com/questions/151777/how-do-i-save-an-android-applications-state –

+0

यह शुरुआत में होना चाहिए। शायद यह ओपी का मुद्दा नहीं था, लेकिन सिर्फ यह स्पष्ट करना कि वास्तव में यह पहली बात है जिसे आपको कॉल करना चाहिए। – blindstuff

+2

दरअसल, इससे कोई फर्क नहीं पड़ता जब तक कि आप किसी आईडी के साथ आउटस्टेट में कुछ भी नहीं जोड़ते जो ओएस से कुछ ओवरलैप करता है। http://stackoverflow.com/questions/10342274/call-super-onsaveinstancestatebundle-first-or-last – Dave

4

मैं इस होने से हल मिल गया। इस झंडे के बिना, मुझे लगता है कि जब प्रारंभिकता कहा जाता है, तो यह पुराने व्यक्ति को ढेर से प्राप्त करने के बजाय गतिविधि का एक नया उदाहरण बनाता है।

+0

यह स्वीकृत उत्तर क्यों नहीं है? मैंने इसे बहुत उपयोगी पाया! – tomahaug

+0

लेकिन सहेजे गए इंस्टेंस हमेशा मेरे लिए शून्य हैं। –

2

यदि किसी अन्य गतिविधि पर जाकर और वापस आ रहा है, तो SharedPreference पर onPause() विधि में सहेजने का सबसे अच्छा तरीका है, जो एक नई गतिविधि लोड होने पर निष्पादित करने के लिए बाध्य है। अन्य Activity पर, साझा वरीयता तक पहुंच करके onCreate() पर मूल्य का उपयोग किया जा सकता है।

+0

कोड के साथ ठीक से समझाओ। –

0

मामले में आप डिवाइस का एक रोटेशन पर अपने टुकड़ा की स्थिति को बनाए रखने के लिए चाहते हैं और आप आश्चर्य है कि onSaveInstanceState कभी नहीं कहा जाता है:

  1. चेक कि क्या आप अपने सभी onSaveInstanceState कार्यों में super.onSaveInstanceState(outState); कहते हैं।
  2. जांचें कि आपके पास AndroidManifest.xml में android:configChanges नहीं है।
संबंधित मुद्दे