2010-08-04 17 views
19

पर जीवन चक्र को समझने में समस्याएं जानकारी: मेरा डिवाइस 2.2 के साथ एक नेक्सस वन है और मैंने दो परियोजनाओं का परीक्षण किया है, एक 1.5 पर और एक 2.1 पर।स्क्रीन बंद होने पर और

समस्या: स्क्रीन बंद होने पर और मेरे आवेदन के जीवन चक्र को समझने में मुझे परेशानी है।

यहाँ मेरी उत्पादन

// activity starts 
08-04 17:24:17.643: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:24:17.643: ERROR/PlayActivity(6215): onResume executes ... 
// screen goes off 
08-04 17:24:28.943: ERROR/PlayActivity(6215): onPause executes ... 
08-04 17:24:32.113: ERROR/PlayActivity(6215): onStop executes ... 
08-04 17:24:32.113: ERROR/PlayActivity(6215): onDestroy executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onResume executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onPause executes ... 
// screen goes on 
08-04 17:24:47.683: ERROR/PlayActivity(6215): onResume executes ... 
// lock removed 
08-04 17:24:56.943: ERROR/PlayActivity(6215): onPause executes ... 
08-04 17:24:59.663: ERROR/PlayActivity(6215): onStop executes ... 
08-04 17:24:59.663: ERROR/PlayActivity(6215): onDestroy executes ... 
08-04 17:25:00.943: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:25:00.943: ERROR/PlayActivity(6215): onResume executes ... 

मैं पूरी तरह उलझन में हूँ है। स्क्रीन बंद होने पर गतिविधि को पुनरारंभ क्यों करें? और जब स्क्रीन पहले से चालू थी और केवल ताला हटा दिया गया था तो इसे फिर से क्यों रोकना और फिर से शुरू करना?

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

public class LifeCycleTest extends Activity { 

    private final static String DEBUG_TAG = "FirstLifeLog"; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.e(DEBUG_TAG, "onCreate executes ..."); 
     setContentView(R.layout.main); 
    } 

    protected void onRestart() { 
     super.onRestart(); 
     Log.e(DEBUG_TAG, "onRestart executes ..."); 
    } 

    protected void onStart() { 
     super.onStart(); 
     Log.e(DEBUG_TAG, "onStart executes ..."); 
    } 

    protected void onResume() { 
     super.onResume(); 
     Log.e(DEBUG_TAG, "onResume executes ..."); 
    } 

    protected void onPause() { 
     super.onPause(); 
     Log.e(DEBUG_TAG, "onPause executes ..."); 
    } 

    protected void onStop() { 
     super.onStop(); 
     Log.e(DEBUG_TAG, "onStop executes ..."); 
    } 

    protected void onDestroy() { 
     super.onDestroy(); 
     Log.e(DEBUG_TAG, "onDestroy executes ..."); 
    } 
} 

क्या किसी के पास कोई विचार है?

आज से अद्यतन (समझ में क्यों यह पिछली बार की तरह नहीं व्यवहार करता है न, हो सकता है और अधिक मुक्त संसाधनों?)

// activity starts 
08-09 12:14:03.122: ERROR/FirstLifeLog(15406): onCreate executes ... 
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onStart executes ... 
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onResume executes ... 
// screen off 
08-09 12:14:07.412: ERROR/FirstLifeLog(15406): onPause executes ... 
// screen on 
08-09 12:14:11.722: ERROR/FirstLifeLog(15406): onResume executes ... 
// no log for removed screen lock 
+0

अजीब बात यह है कि मैं डेस्ट्राय(), ऑनस्टार्ट(), ऑनस्यूम() कॉल पर देखता हूं लेकिन मुझे कोई भी क्रिएट() कॉल नहीं दिखाई देता है। मैं व्यवहार को समझने में भी रूचि रखता हूं। –

+0

Thats क्योंकि मेरे ऑनक्रेट ने लॉग स्टेटमेंट को याद किया ... इसके अलावा मैंने आज भी कोशिश की ... अब मेरे गेम का एक ही व्यवहार है, लेकिन टेस्टप्रोजेक्ट के पास अपेक्षित व्यवहार है (अपडेट देखें) – WarrenFaith

उत्तर

-2

, जीवन चक्र का अच्छा वर्णन के लिए Activity Lifecycle दस्तावेज़ देखें चित्र के साथ।

संभवतः संसाधनों (बैटरी पावर) को बचाने के लिए स्क्रीन के साथ आपकी गतिविधि की मौत हो जाती है। प्रलेखन के अनुसार, आप मूल रूप से किसी भी समय मार सकते हैं कि एंड्रॉइड संसाधनों को मुक्त करना चाहता है। इसलिए, आपको हमेशा अपनी गतिविधियों को किसी भी समय रोका जा सकता है और फिर से शुरू करने में सक्षम होना चाहिए।

+1

मुझे जीवन चक्र दस्तावेज पता है। संसाधनों को बचाने के लिए हत्या का कारण नहीं हो सकता क्योंकि यह तुरंत पुनरारंभ होता है। और यह वास्तव में मेरी समस्या है। मैं यह नहीं समझता कि यह क्यों मारा जाता है और तुरंत पुनः प्रारंभ किया जाता है। जब मैं ऑनड्रॉय() ट्रिगर होता हूं तो डेटाबेस में बहुत कुछ स्टोर करता है ... अनावश्यक ऐप लंबे समय तक प्रतिक्रियाओं को नष्ट कर देता है ... – WarrenFaith

+0

मैं देखता हूं ... मैंने वास्तव में इस सिद्धांत का परीक्षण नहीं किया है, लेकिन दस्तावेज कुछ चर्चा करता है configChanges: http://developer.android.com/reference/android/R.attr.html#configChanges जो ऐप को पुनरारंभ करने का कारण बनता है। यह संभव है कि स्क्रीन चालू और बंद करना uiMode के तहत फिट बैठता है? भले ही, आप देखना चाहें कि क्या आप डेस्ट्रॉय को और अधिक कुशल बना सकते हैं। शायद पूरे राज्य को बचाओ, तो उस समय बचाने के लिए कम है? –

0

रास्ते है। यदि आप गतिविधि जीवन चक्र पढ़ते हैं तो आप देखेंगे कि चरणों को इस तरह से बहुत अधिक आदेश दिया गया है। यह तब नहीं होता जब आपकी स्क्रीन चालू और बंद हो जाती है, लेकिन जब आप फोन के ओरेन्टेशन का पीछा करते हैं। एंड्रॉइड ने उपर्युक्त चरणों का पालन करने के बाद गतिविधि को फिर से बनाया। आपको स्क्रीन घूर्णन करने का प्रयास करें, फिर आप देखेंगे! =)

+0

मुझे लगता है कि आपका प्रावधान ऊपर वर्णित स्थिति के समान है। इसे बदलने के विचारों के साथ कुछ होना चाहिए ताकि गतिविधि को मार दिया जा सके और बिना स्क्रीन के चलाने के लिए फिर से बनाया जा सके! यह सिर्फ मेरा अनुमान है ... – Shouvik

30

मुझे अपने खेल के साथ एक ही समस्या थी। मेरा गेम केवल परिदृश्य में काम करता है, और स्क्रीन बंद करते समय, एंड्रॉइड स्क्रीनसेवर नियंत्रण (पोर्ट्रेट मोड में) लेता है, इस प्रकार एक अभिविन्यास भेजता है जो गतिविधि को नष्ट कर देता है और पुन: प्रयास करता है।

एक सरल समाधान घोषित करने के लिए है कि आप अपने आप को स्क्रीन अभिविन्यास परिवर्तनों को प्रबंधित जाएगा:

<activity ... android:configChanges="orientation" ... > 

यह काफी आसान है, तो अपनी गतिविधि (आप कुछ भी नहीं करना है) केवल परिदृश्य घोषित किया है, लेकिन प्राप्त कर सकते हैं कठिन यदि आपकी गतिविधि घूम सकती है ...

+0

धन्यवाद! मुझे शायद यह पता लगाने के लिए कुछ समय लगेगा। लैंडस्केप ऐप के साथ खुश होने की पुष्टि कर सकते हैं: पोर्ट्रेट में बदलाव के लिए एक बार फिर से बनाया गया, स्क्रीन से वापस आने के बाद दूसरी बार फिर से बनाया गया। ConfigChanges सामान भी काम करता है। यह वास्तव में दस्तावेज किया जाना चाहिए (प्रमुख रूप से) दस्तावेज। – oberstet

+3

यह शायद स्वीकार्य उत्तर के रूप में डिज़ाइन किया जाना चाहिए, हालांकि यह एक महीने बाद आया था, यह दूसरे में रहस्यमय छोड़ने के कारण की पहचान करता है। –

+0

क्या किसी को इस तरह के जीवन चक्र का पता लगाने के लिए * कैसे * पता है? मेरा मतलब यह है कि ऑन-स्टॉप को स्क्रीन पर जाने की वजह से कहा जाता है और ऑनस्टार्ट जल्द ही निष्पादित किया जा रहा है। – Snicolas

4

Ruben's answer पूरी तरह से सही है, लेकिन केवल तभी आपका एप्लिकेशन एपीआई स्तर 12 या को लक्षित करता है।

लेकिन orientation विकल्प के अलावा एपीआई 13 के स्तर के बाद से, आप, screenSize विकल्प घोषित करने के लिए है, क्योंकि यह भी ट्रिगर किया जाता है जब पोर्ट्रेट और लैंडस्केप झुकाव के बीच एक डिवाइस स्विच:

<activity ... android:configChanges="orientation|screenSize" ... > 

अन्यथा , एपीआई 13 या उच्च मंच पर स्क्रीन बंद होने पर आपकी गतिविधि को एक अतिरिक्त समय फिर से बनाया जाएगा।

संदर्भ के लिए, API docs, android:configChanges अनुभाग नोट देखें।

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