2012-05-30 26 views
96

क्या कोई मुझे Bundle savedInstanceStateonCreate(Bundle savedInstanceState) में जानने में मदद कर सकता है मैं एंड्रॉइड में नौसिखिया हूं। मैं इसे developer.android.com से समझने की कोशिश करता हूं। लेकिन मैं समझने में सक्षम नहीं हूँ। क्या कोई इसे सरल बना सकता है?क्या है क्रिएट (बंडल सेव किया गया इंस्टेंसस्टेट)

+2

यह अच्छा वीडियो है: https://www.youtube.com/watch?v=kkYIMZw9gzQ –

उत्तर

91

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

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

source

+1

क्या अन्य गतिविधियां एक ही बंडल साझा करती हैं? अगर मैं एक और गतिविधि शुरू करता हूं, तो क्या यह पहले से बंडल पास करता है? –

12

onCreate(Bundle savedInstanceState) आप करेंगे जब गतिविधियां प्राप्त पहली बार शुरू होता है और जब गतिविधि उन्मुखीकरण बदल जाओ यह उपयोग में मिल जाएगा Bundle अशक्त मिल .......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

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

हम onCreate विधि पर तर्क के रूप में पारित बंडल से सहेजी गई इंस्टेंस स्थिति लोड कर सकते हैं। हम सहेजे गए इंस्टेंस स्थिति को onRestoreInstanceState विधि में भी लोड कर सकते हैं। लेकिन पाठकों के बारे में पता लगाने के लिए मैं इसे छोड़ दूंगा।

+8

'savedInstanceState'' 'सहेजे गए इंस्टेंसस्टेट() को पहले कॉल किया गया था, तो 'अनइल्ड' होगा। अभिविन्यास परिवर्तन केवल एक उदाहरण है जिसमें यह हो सकता है। –

+0

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

+1

@batbrat हां ... मैंने जो टिप्पणी की (लगभग दो साल पहले) पूरी तरह से सही नहीं है। मुझे लगता है कि इसे बनाने के लिए सबसे अच्छा तरीका है 'क्रिएट (बंडल)' पर 'बंडल' तर्क 'गैर-शून्य' होगा और केवल तभी होगा जब 'गतिविधि' के पास पहले से कहा गया था 'SaveInstanceState' विधि। यह अभिविन्यास परिवर्तन के दौरान होता है ... और तब भी होता है जब ओएस द्वारा मारने के बाद गतिविधि वापस आ रही है, और जब आप अपने डिवाइस पर किसी भी अन्य कॉन्फ़िगरेशन परिवर्तन को ट्रिगर करते हैं। स्पष्टीकरण एलेक्स के लिए –

3

onCreate(Bundle) कहा जाता है जब गतिविधि पहले शुरू होता है है। आप उपयोगकर्ता इंटरफ़ेस बनाने जैसे एक बार प्रारंभ करने के लिए इसका उपयोग कर सकते हैं। onCreate() एक पैरामीटर लेता है जो या तो onSaveInstanceState द्वारा सहेजा गया शून्य या कुछ राज्य जानकारी है।

0

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

7

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

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

तो, हम के बाद आप उन्मुखीकरण "onCreate" विधि सही कहा जाएगा बनाने के राज्य इस

int counter = 0; 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("value",counter); 
} 

की तरह है कि बंडल में बदल पाठ मूल्य का मतलब बचा सकता है? इसलिए हम यह

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if(savedInstanceState == null){ 
     //it is the first time the fragment is being called 
     counter = 0; 
    }else{ 
     //not the first time so we will check SavedInstanceState bundle 
     counter = savedInstanceState.getInt("value",0); //here zero is the default value 
    } 
} 

अब, आप अभिविन्यास के बाद अपना मूल्य खो नहीं पाएंगे। संशोधित मान हमेशा प्रदर्शित किया जाएगा।

+0

ध्यान दें कि यह गतिविधि पर भी सच है। क्या आप (गतिविधि की बंडल) और बंडल ऑफ फ्रैगमेंट के अंतर पर अधिक व्याख्या कर सकते हैं? – laalaguer

+0

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

1

OnCreate (बंडल savedInstanceState) एंड्रॉयड में फंक्शन:

1) जब एक गतिविधि पहली कॉल या शुरू की तो OnCreate (बंडल savedInstanceState) विधि गतिविधि बनाने के लिए जिम्मेदार है।

2) जब कभी भी अभिविन्यास (यानी क्षैतिज से ऊर्ध्वाधर या ऊर्ध्वाधर से क्षैतिज तक) गतिविधि बदल जाती है या जब किसी गतिविधि को किसी भी ऑपरेटिंग सिस्टम द्वारा मजबूती से समाप्त कर दिया जाता है तो सहेजे गए इंस्टेंसस्टेट i.e. बंडल क्लास का ऑब्जेक्ट एक गतिविधि की स्थिति को बचाएगा।

3) ओरिएंटेशन के बाद क्रिएट (बंडल सेव किया गया इंस्टेंसस्टेट) गतिविधि को कॉल और पुनर्निर्मित करेगा और सहेजे गए इन्स्टेंसस्टेट से सभी डेटा लोड करेगा।

4) मूल रूप से बंडल क्लास का उपयोग गतिविधि के डेटा को संग्रहीत करने के लिए किया जाता है जब भी ऊपर की स्थिति ऐप में होती है।

5) ऐप्स के लिए क्रिएट() की आवश्यकता नहीं है। लेकिन ऐप में इसका उपयोग करने का कारण यह है क्योंकि प्रारंभिक कोड डालने के लिए यह विधि सबसे अच्छी जगह है।

6) आप अपना प्रारंभिक कोड ऑनस्टार्ट() या ऑनस्यूम() पर भी डाल सकते हैं और जब आप ऐप पहले लोड करेंगे, तो यह क्रिएट() पर काम करेगा।