2011-04-22 9 views
6

मुझे एक टैबहोस्ट में 2 गतिविधियां मिली हैं। गतिविधि 1 में, मैं अभिविन्यास परिवर्तनों को संभालता हूं और जब उपयोगकर्ता गतिविधियों के बीच स्विच करता है।किसी अन्य गतिविधि में अभिविन्यास परिवर्तन के साथ जीवन चक्र परिस्थिति

समस्या तब शुरू होती है जब उपयोगकर्ता गतिविधि 1 से गतिविधि 2 (टैब चयन के माध्यम से) स्विच करता है, एक अभिविन्यास परिवर्तन करता है, फिर गतिविधि 1 पर वापस स्विच करता है। मैं अपने गतिविधि 1 में होने वाली जीवन चक्र घटनाओं के साथ थोड़ा सा खो गया हूं, जबकि गतिविधि 2 दिखाई देने पर चीजें चल रही हैं।

=== === अभिविन्यास बदलें
onSaveInstanceState
onPause
onStop
onCreate
onStart
onRestoreInstanceState:

डिबगर के अनुसार, यहां की घटनाओं है कि मेरे Activity1 में पाए जाते हैं के अनुक्रम है
ऑनर्यूम

=== स्विच गतिविधि 2 === को
onSaveInstanceState
onPause गतिविधि में

=== जबकि अभिविन्यास बदलें 2 ===
onStop
onCreate
onStart

=== Switchback वापस activity2 से == =
ऑनर्यूम

जैसा कि आप देख सकते हैं, मुझे अपने गतिविधि 1 डेटा को कॉल में सहेजने का अवसर है SaveInstanceState पर गतिविधि 2 पर स्विच किया गया है, लेकिन इसे पुनर्स्थापित करने के लिए मुझे कभी भीस्टोर इंस्टेंसस्टेट पर कॉल नहीं मिलता है।

प्रश्न

  1. क्यों एंड्रॉयड एक और गतिविधि का उपयोग करने जा पर मेरी onSaveInstanceState फोन करता है तो यह onRestoreInstanceState कॉल करने के लिए जब यह वापस स्विच का इरादा नहीं है?

  2. मैं अपने गतिविधि 1 में SaveInstanceState/onRestoreInstanceState पर क्यों नहीं मिलता, जबकि गतिविधि 2 दिखाई दे रहा है? मुझे अभी भी डेटा को सहेजना/पुनर्स्थापित करना होगा चाहे वह दिखाई दे या नहीं, हाँ?

  3. इस मामले में डेटा को सहेजने/पुनर्स्थापित करने के लिए सबसे सुरक्षित स्थान कहां है? और यदि यह SaveInstanceState/onRestoreInstanceState पर नहीं है, तो मैं बहाली के लिए बंडल का उपयोग कैसे करूं?

  4. क्या कोई अन्य समाधान है जैसे अन्य कॉलबैक मैं इसे कम करने का लाभ उठा सकता हूं?

किसी भी मदद के लिए धन्यवाद!

ग्रेग

उत्तर

2

यह वास्तव में एक अच्छा सवाल है।

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

दस्तावेज़ों में यह भी कहा गया है कि सहेजने के लिए बनाए गए/सहेजे गए बंडल को क्रेट और ऑनस्टोर इंस्टेंसस्टेट (एक पल में इस पर अधिक) पर पारित किया जाता है जब गतिविधि 'पुनः स्थापित' होती है।

मैं अनुमान लगा रहा हूं क्योंकि रोटेशन के समय गतिविधि 1 छुपा हुआ है, परस्टोर इंस्टेंसस्टेट को नहीं कहा जाता है क्योंकि कोई 'दृश्य' नहीं है (यानी, इसे देखा/देखा नहीं जा सकता)। साथ ही, पोर्ट्रेट/परिदृश्य के लिए 2 पूरी तरह से अलग लेआउट फाइलें पूरी तरह से संभव है, जिनके पास अलग-अलग आईडी के साथ अलग-अलग यूआई तत्व हैं।

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

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

क्या इससे कोई मतलब है? यह एकमात्र तरीका है कि मैं तर्क की व्याख्या कर सकता हूं।

+0

धन्यवाद MisterSquonk ... भले ही मेरी गतिविधि 1 समय rotaion पर दिखाई नहीं दे रहा होता है, यह अभी भी अंत में जब यह दिखाई देने लगता है सही काम करने की आवश्यकता होगी। हां, यह एक बग की तरह दिखता है कि इस मामले में RestoreInstanceState को नहीं बुलाया जाता है। – user695977

+0

मैं ऑनक्रेट में हैंडलिंग करने का प्रयास करूंगा। मुझे आश्चर्य है कि RestoreInstanceState पर क्या बात है? आपकी सहायताके लिए धन्यवाद! – user695977

+0

हम्म, अगर मैं यह बताने में सक्षम था कि मेरी गतिविधि पर ध्यान केंद्रित किया गया है, तो मैं आसानी से इस समस्या को हल कर सकता हूं। दुर्भाग्यवश, ऑन विन्डोफोकस चेंज() को टैब चयन के माध्यम से गतिविधियों के बीच स्विच करते समय नहीं कहा जाता है। क्या यह जानने का कोई और तरीका है कि कोई गतिविधि फोकस कर रही है या नहीं? – user695977

0

onCreate() के माध्यम से राज्य को पुनर्स्थापित करना बिल्कुल ठीक है, बस एक शून्य जांच करना सुनिश्चित करें क्योंकि जब भी कोई सहेजी गई स्थिति नहीं है तो बंडल शून्य हो जाएगा। onRestoreInstanceState() के लिए, यह केवल तभी कहा जाता है जब गतिविधि मारे जाती है। मुझे इसके बारे में सोचना पसंद है क्योंकि आवेदन की स्थिति का बैकअप कर रहा है, बस इसकी आवश्यकता होने पर।

देखें Ogre_BGR के जवाब यहाँ: onSaveInstanceState() and onRestoreInstanceState()

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