2014-06-09 5 views
9

मैंस्टोर इंस्टेंसस्टेट विधि पर परीक्षण करने की कोशिश कर रहा हूं और जब (बिल्कुल) इसे कहा जाता है। तो मैंने इन चरणों का पालन किया है:ऑनस्टार्ट के बाद रेस्टोर इंस्टेंसस्टेट पर क्यों नहीं है?

  1. मेरी गतिविधि शुरू करें। onCreate -- > onStart --> onResume बुलाए गए थे।
  2. एमुलेटर पर होम बटन दबाएं। onPause --> onSaveInstanceState --> onStop बुलाए गए थे।
  3. लॉन्चर में आइकन पर क्लिक करें और मेरी गतिविधि को दोबारा लॉन्च करें। onRestart --> onStart --> onResume बुलाए गए थे।

मेरे जावा कोड:

package com.test.demostate.app; 

import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 


public class MainActivity extends ActionBarActivity { 
    private int visiters=0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d("TAG","onCreate"); 

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     Log.d("TAG","onPause"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.d("TAG","onStop"); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.d("TAG","onStart"); 
    } 

    @Override 
    protected void onRestart() { 
     super.onRestart(); 
     Log.d("TAG","onRestart"); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     visiters++; 
     Log.d("TAG","onResume"); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("visiters",visiters); 
     Log.d("TAG",visiters+" visiters was saved "); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     visiters=savedInstanceState.getInt("visiters"); 
     Log.d("TAG",visiters+" visiters was restored"); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.d("TAG","onDestroy"); 
    } 
} 

डॉक्स से: Instead of restoring the state during onCreate() you may choose to implement onRestoreInstanceState(), which the system calls after the onStart() method .

तो onRestoreInstanceState

  • कहा जाता है के बाद गतिविधि के लिए onPause --> onStop --> onDestroy तो onCreate --> onRestoreInstanceState --> onResume (स्क्रीन रोटेशन के कारण नष्ट हो गया था उदाहरण)
  • गतिविधि के बाद onPause --> onStop --> onRestart --> onStart --> onRestoreInstanceState --> onResume

(घर उदाहरण के लिए दबाने आइकन के कारण) बंद कर दिया गया था लेकिन क्यों यह onStart के बाद कहा जाता है नहीं है?

धन्यवाद

+0

".. जिस पर सिस्टम ऑनस्टार्ट() विधि के बाद * कॉल करता है।" - समस्या के लिए प्रासंगिक शीर्षक लिखें। – user2864740

+0

@ user2864740, मेरे प्रश्न का शीर्षक संपादित किया गया था "क्यों नहीं है ..." –

+0

चरण दो के बाद, फिर से होम बटन दबाएं और अपने ऐप में खोले क्लिक करें। अपने ऐप को स्मार्टफोन पर भी निष्पादित करने का प्रयास करें। –

उत्तर

1

onStart() के बाद ही अगर onSaveInstanceState() बुलाया गया है।

डॉक्स से:

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

इस विधि को ऑनस्टार्ट() और पोस्टपोस्टेट (बंडल) के बीच बुलाया जाता है।

Activity#onRestoreInstanceState()

+0

ठीक समझा। मेरे कोड में मैंने दोनों को SaveInstanceState और onRestoreInstanceState पर कॉल किया है। और मैंने परीक्षण किया है कि onRestoreInstanceState को Log.d विधि के साथ बुलाया गया था लेकिन कुछ भी नहीं दिखाया गया है (मैं एंड्रॉइड स्टूडियो 0.5.2 का उपयोग कर रहा हूं) –

+0

@JamesDaniel क्या आपने'SaveInstanceState() 'पर ओवरराइड करते समय किसी भी राज्य को सहेजा था? –

+0

हाँ @ कोड-अपरेंटिस और आप मेरा जावा कोड –

1

आधिकारिक दस्तावेज onRestoreInstanceState (Bundle savedInstanceState) के बारे में कहते हैं:

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

इस विधि को ऑनस्टार्ट() और पोस्टपोस्टेट (बंडल) के बीच बुलाया जाता है।

जब गतिविधि को फिर से शुरू किया जाता है?

  • उपकरण के ओरिएंटेशन अपनी गतिविधि में परिवर्तन जब फिर से आरंभ नहीं हो जाता।
  • जब आपके ऐप के सामने एक और गतिविधि होती है और ओएस किसी कारण से आपके ऐप को मारता है, उदाहरण के लिए मुफ्त संसाधन हो सकते हैं।

प्रयास करें एमुलेटर का ओरिएंटेशन बदलने: + F12

उपयोगकर्ता की answer देखो @GAThrawn

होम बटन दबाने से आप अपने अनुप्रयोग छोड़ने के लिए और

Ctrl पृष्ठभूमि में चल रहे अपने ऐप को छोड़कर होम स्क्रीन पर जाएं, । यह विंडोज पीसी पर विंडोज़ के बीच स्विचिंग जैसा थोड़ा सा है।

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

तो मैं अपने दूसरे तर्क साबित नहीं कर सकते, क्योंकि यह निर्णय लेता है यह ओएस है, कम से कम पता नहीं कैसे साबित करने के लिए।

+0

देख सकते हैं, आप केवल पहला सुझाव साबित करते हैं (गतिविधि नष्ट होने के बाद) और यह ठीक है। लेकिन दूसरे सुझाव के बारे में (गतिविधि को नष्ट किए बिना बंद कर दिया गया था)? –

+0

मैंने अपना जवाब संपादित किया, देखो। अगर यह उसके लिए उपयोगी था और अपना प्रश्न ठीक कर लिया तो कृपया मेरा जवाब स्वीकार करें। –

+0

अपने ऐप को फिर से खोलने के बाद होम बटन दबाएं और अपने ऐप को मार दें, देखें कि यह मेरा दूसरा तर्क साबित करता है या नहीं। –

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