2011-04-06 16 views
5

यह मेरी समझ थी, स्पष्ट रूप से गलत, onPause() को जब भी बैक बटन दबाया जाता है? अब मेरी कोड में मैं इस onPause() घटना डाल दिया है:चालू होने पर वापस बटन दबाए जाने पर कॉल नहीं किया जाता है?

@Override 
protected void onPause(){ 
    super.onPause();   

    if(!_END_GAME){ 
     Builder _alert = new AlertDialog.Builder(this) 
     .setMessage("onPause, with game NOT over!"); 
     _alert.setNeutralButton("OK.", 
       new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface arg0, int arg1) { 
       arg0.dismiss(); // Kills the interface 
       System.runFinalizersOnExit(true); 
       finish(); 
      } 
     }); 
     _alert.setTitle("Your Score!"); 
     _alert.show(); 
    } 

}

अब समस्या है, संवाद कोड त्रुटियों का शुभारंभ नहीं है क्या-तो-कभी, और उसके बाद। मैंने वहां onPause( कहां देखने के लिए संवाद करने के लिए संवाद दिया था) और मुझे कुछ अन्य चर और डीबग करने में मदद करने के लिए कहा गया था। फिर भी मैंने कहा कि यह कभी भी दिखाया नहीं जाता है। कोई विचार यह क्यों होगा? क्या कोई ऐसा फ़ंक्शन है जो onPause() से पहले लॉन्च किया गया है जब बैक बटन दबाया जाता है? किसी भी जानकारी के लिए अग्रिम धन्यवाद।

+0

यह सच है है ऑन पॉज़() 'को तब नहीं कहा जाता है जब एक टुकड़ा अब दिखाई नहीं दे रहा है! मुझे एक ही समस्या है, लेकिन एक अलग स्थिति है। ऐसा लगता है कि FragmentManager अभी भी स्मृति में टुकड़े टुकड़े कर सकते हैं। जब उपयोगकर्ता बैक बटन हिट करता है, तो वह एफएम को सुपरसीड कर सकता है, फ्रेगमेंट्स के पूरे सेट को स्वैप कर सकता है और पिछली स्थिति प्रदर्शित कर सकता है। यह उन Fragments के लिए सभी ऑन पॉज़, ऑनस्टॉप, और ऑनस्ट्राय विधियों को याद कर सकता है। - क्या मैं गलत हूँ? –

उत्तर

2

आपको onKeyDown ओवरराइड करके बैक बटन की जांच करनी चाहिए, में परीक्षण नहीं करना चाहिए। जब भी आपकी गतिविधि पृष्ठभूमि में नहीं है अग्रभूमि छोड़ देता है; यह जरूरी नहीं है कि खत्म हो रहा है। (आप इसके लिए isFinishing() देख सकते हैं।) बैक कुंजी को संभालने के बारे में अधिक जानकारी के लिए here देखें।

+1

बैक बटन की जांच न करें। यह एक भयानक हैक और कई मामलों में तोड़ने के लिए बाध्य है। गतिविधि को पृष्ठभूमि में लाने के अनगिनत अन्य तरीके हैं (आने वाली फोन कॉल, होम बटन, आदि)। – EboMike

+0

बहुत बहुत धन्यवाद, मैंने इस पथ को शुरू कर दिया है और जल्दी से महसूस किया कि मैं गलत कहां जा रहा था। हालांकि तेज प्रतिक्रिया के लिए धन्यवाद! –

+0

@EboMike - बैक बटन को एक हैक की जांच क्यों कर रही है और कई मामलों में तोड़ने के लिए बाध्य है?यह वास्तव में रणनीति है कि डियान हैकबर्न ने ब्लॉग पोस्ट में संदर्भित किया है। 'OnPause()' के दौरान ऐसी चीजों की जांच करने से यह _much_ बेहतर है। –

3

हमेशा कॉल किया जाएगा जब आपकी गतिविधि अब अग्रभूमि में नहीं है, इसकी गारंटी है। शायद आपका _END_GAME गलत नहीं है? अपनी ऑन-पॉज़ विधि में एक डीबग लॉग आउटपुट जोड़ें, आप देखेंगे कि यह हमेशा कॉल हो जाता है।

मुझे ध्यान रखना चाहिए कि ऑनपॉज़ के दौरान एक संवाद प्रदर्शित करना बेहद खराब रूप है - उपयोगकर्ता आपके ऐप से छुटकारा पाने की कोशिश कर रहा है (आने वाली फोन कॉल के कारण भी हो सकता है)। आप तब एक संवाद नहीं चाहते हैं। यह एंड्रॉइड डिजाइन के खिलाफ चला जाता है।

वास्तव में, एंड्रॉइड ओएस आपके ऐप को शॉर्ट-सर्किट करेगा यदि आप ऑनस्ट्राय या ऑन पॉज़ में लंबे शेंगेनिंग करने का प्रयास करते हैं। असल में, अगर उन्हें बुलाया जाता है, तो आपको चुपचाप गायब होना चाहिए।

यदि आप वास्तव में बैक बटन को अवरुद्ध करना चाहते हैं, तो आप टेड जैसे बटन की जांच कर सकते हैं, लेकिन ध्यान रखें कि आपका ऐप कई अन्य तरीकों से पृष्ठभूमि में जा सकता है - होम बटन, चयनित अधिसूचना, आने वाली फोन कॉल , आदि

+0

हां, जैसा कि कहा गया है कि मैं बस डिबगिंग कर रहा था, अंत में उपयोग में संवाद नहीं होने वाला था। –

2

कॉल किया जा रहा है, और आपका संवाद दिखा रहा है, केवल एंड्रॉइड खत्म होने से पहले एक छोटे से विभाजित दूसरे के लिए। अगर आप देखना चाहते हैं कि क्या हो रहा है तो वहां लॉग स्टेटमेंट रखें। वहाँ स्थितियों में, जहां `:

आप एक संवाद जब वापस बटन तो सबसे आसान तरीका है (एंड्रॉयड पर काम करता है 2.1+) दबाया जाता है दिखाना चाहते हैं तो अपनी गतिविधि में onBackPressed विधि ओवरराइड करने के लिए

@Override 
public void onBackPressed() { 
    if (gameRunning) { 
     // show dialog 
    } else { 
     // exit 
     super.onBackPressed(); 
    } 
} 
संबंधित मुद्दे