2012-05-31 15 views
10

मेरे पास एक ऐसी गतिविधि है जिसे स्क्रीन शुरू होने पर स्क्रीन चालू करने की आवश्यकता होती है (बस स्क्रीन बंद होने पर)। तो मेरी onCreate में, मेरे पास है:मेरी गतिविधि लॉन्च होने के बाद ऑनस्ट को सही क्यों कहा जा रहा है?

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
      |WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
      |WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
      |WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 

इस सरल संयोजन का उपयोग करना, मैं प्रदर्शित करने के लिए जब भी यह मेरी पृष्ठभूमि सेवा प्रारंभ हुआ है मेरे गतिविधि का कारण करने में सक्षम हूँ (हाँ, यह एक वैध मामला है)।

समस्या यह है कि, जब मैं इस तरह की स्थिति में अपनी गतिविधि शुरू करता हूं तो समस्या बहुत ही अजीब जीवन चक्र व्यवहार होती है। व्यापक लॉगिंग का उपयोग करना, मैं यह पता लगाने की है कि निम्नलिखित 7 चरणों की प्रक्रिया होता तुरंत में सक्षम के बाद गतिविधि शुरू कर रहा है था:

  1. onCreate
  2. onStart
  3. onResume
  4. onPause
  5. onStop
  6. ऑनस्टार्ट
  7. ऑनर्यूम

इसे देखें? एक साधारण गतिविधि शुरू करने के लिए, स्टार्ट को दो बार बुलाया जाता है। और सबसे महत्वपूर्ण बात यह है कि ऑनस्ट को रहस्यमय तरीके से बुलाया जाता है, भले ही गतिविधि अभी शुरू हुई थी - और कुछ भी नहीं हुआ जिससे यह रुक जाएगा।

मैंने कई अलग-अलग परिदृश्यों में इसका परीक्षण किया है और ऐसा लगता है कि यह अजीब व्यवहार तब होता है जब स्क्रीन बंद होती है और इसे नष्ट होने के बाद गतिविधि लॉन्च की जाती है। यदि स्क्रीन चालू है, या यदि गतिविधि रोक दी गई थी [लेकिन अभी तक नष्ट नहीं हुई] गतिविधि सामान्य रूप से लॉन्च होती है, और ऑनस्टार्ट को केवल एक बार बुलाया जाता है।

निष्कर्ष: ऐसा लगता है कि जब मेरी गतिविधि शुरू की है और स्क्रीन पर मजबूर किया जाता है, एंड्रॉयड, गतिविधि शुरू होता है तो यह बंद हो जाता है, और फिर किसी स्पष्ट कारण के लिए इसे फिर से शुरू होता है।

तो: यह क्यों हो रहा है? और क्या ऐसा कुछ भी है जो मैं इसे हल करने के लिए कर सकता हूं (ताकि जब तक कोई वैध कारण न हो तब तक स्टॉप को तब तक नहीं बुलाया जाता है)?


नोट्स:

  • प्रश्न में गतिविधि singleTask launchmode
  • मैं कीगार्ड/लॉक अक्षम करने की कोशिश की है उपयोग कर रहा है, लेकिन यह कोई प्रभाव नहीं
  • मैं एक पर इस व्यवहार साक्षी रहा है सैमसंग गैलेक्सी टैब 10.1 एंड्रॉइड 3.2 चल रहा है। मैं परीक्षण नहीं किया यह कुछ और करने के लिए लागू होता है कि क्या ...
+0

गतिविधि के घूर्णन की आवश्यकता होने पर मुझे एक समान व्यवहार होता है। मेरे मामले में गतिविधि AndroidManifest में एक अनिर्दिष्ट अभिविन्यास है। क्रिएट के दौरान मैंने अपनी राज्य मशीन के आधार पर अभिविन्यास सेट किया। जब मैंने जो अभिविन्यास सेट किया है वह वर्तमान नहीं है जिसका अर्थ है कि गतिविधि को घुमाने की जरूरत है, तो मैंने आपके द्वारा वर्णित अजीब जीवन-चक्र को देखा है। क्या आपको जवाब मिल गया? – kingston

+0

मैंने यह भी जांच लिया है कि ऑनस्टॉज़ से पहले पोस्टस्टेसम को कॉल किया जाता है। – kingston

+1

यहां वर्णित समाधान मेरे लिए काम करता है: [ऑनपोज़ और ऑनस्टॉप() गतिविधि शुरू करने के तुरंत बाद बुलाया जाता है] (http://stackoverflow.com/questions/25369909/onpause-and-onstop-called-immediately-after-starting-activity) – cyberhuman

उत्तर

-2

आप onStart में स्थिति के लिए जांच कर सकता है, एक स्थिर या ग्लोबल वेरिएबल सेट, और फिर onStop में चर जाँच मानक व्यवहार को ओवरराइड करने के लिए।

+0

लेकिन मैं "अच्छा" मामलों और ऑनस्टॉप के "खराब" मामलों के बीच अंतर कैसे करूं? चर की जांच करके – yydl

+0

। – Mundi

+0

हां, लेकिन जैसा कि मैंने लिखा है, यह हमेशा नहीं होता - केवल स्क्रीन बंद होने पर। तो यदि स्क्रीन चालू है, तो आपकी विधि – yydl

2

मैं एक ऐसी ही समस्या यहाँ था: Activity Lifecycle X Power Button X Lock Screen

समस्या यह है कि के रूप में मेरे गतिविधि परिदृश्य मजबूर किया गया था, जब मैं स्क्रीन पर दिया यह चित्र में लॉक स्क्रीन से पता चला है और यह एक विन्यास परिवर्तन के कारण और इसलिए किया गया था वर्तमान गतिविधि को नष्ट करना।

समाधान एंड्रॉइड जोड़ने के लिए था: configChanges = "Oriroid" मेरे AndroidManifest.xml में गतिविधि पर।

+1

अच्छी कॉल। लेकिन जोड़ने के लिए एक और है: android: configChanges = "keyboardHidden | ओरिएंटेशन"। आईसीएस + के साथ आपको एंड्रॉइड की आवश्यकता होगी: configChanges = "कीबोर्ड हिडन | ओरिएंटेशन | स्क्रीनसाइज"। –

1

जैसा कि @cyberhuman द्वारा सुझाया गया है, इस प्रश्न का उत्तर OnPause and OnStop() called immediately after starting activity ने मुझे सही दिशा में इंगित किया।

वास्तव में उपयोगकर्ता को प्रदर्शित होने से पहले एक पूर्ण 'डमी' जीवन चक्र को पूरा करने वाली गतिविधि के साथ मेरा मुद्दा यह था कि गतिविधि दिखाई देने पर रिंगटोन खेलने का मेरा प्रयास सीधे अतिरिक्त, बाद में "ऑनस्टॉप()" द्वारा म्यूट किया गया था, और स्क्रीन बंद होने पर स्क्रीन लॉन्च होने पर लॉन्च होने पर गतिविधि ठीक से व्यवहार करने के लिए झंडे का उपयोग करते समय/जब स्क्रीन चालू होती है/जब पृष्ठभूमि में गतिविधि चल रही है, तब संभव नहीं था।

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

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