2010-03-14 10 views
14

मेरे पास एक छोटा परीक्षण एप्लिकेशन है जिस पर मैं काम कर रहा हूं जिसमें एक टाइमर है जो 100 से 0 तक उलटी गिनती के लिए टेक्स्टव्यू अपडेट करता है। यह ठीक काम करता है, लेकिन अब मैं एप्लिकेशन को रोकने की कोशिश कर रहा हूं यदि उपयोगकर्ता दबाता है फोन पर बैक बटन और उसके बाद टाइमर को पुनरारंभ करें जहां से उन्होंने ऐप को फिर से खोल दिया था।ऑन पॉज़/ऑनर्यूज़ गतिविधि समस्याएं

@Override 
public void onPause() 
{ 
    if(this._timer_time_remaining > 0) { 
     this.timer.cancel(); 
    } 
    super.onPause(); 
    Log.v("Pausing", String.format("Pausing with %d", this._timer_time_remaining)); 
} 

@Override 
public void onResume() 
{ 
    Log.v("Resuming", String.format("Resuming with %d", this._timer_time_remaining)); 

    if(this._timer_time_remaining > 0) { 
     start_timer(this._timer_time_remaining); 
    } 
    super.onResume(); 
} 

start_timer() प्रणाली CountDownTimer जो onTick विधि में TextView अद्यतन करता है और this._timer_time_remaining पूर्णांक चर अद्यतन करता है बनाता है: यहाँ कोड मैं का उपयोग कर रहा है।

CountDownTimer और _timer_time_remaining दोनों वर्ग इस तरह के स्तर पर घोषित किया गया है:) प्रिंट

private CountDownTimer timer; 
private int _timer_time_remaining; 
Log.v से

(मुझे लगता है कि _timer_time_remaining चर जब onPause कहा जाता है संग्रहीत सेकंड की सही संख्या है, लेकिन जब रीस्यूम शुरू होता है तो यह 0 पर वापस सेट होता है। चर रीसेट क्यों हो जाता है? मैंने सोचा कि एप्लिकेशन पृष्ठभूमि में समान मानों के साथ चलना जारी रखेगा। क्या मैं कुछ भूल रहा हूँ? यह सब एक कक्षा में घोषित किया गया है जो गतिविधि को बढ़ाता है।

अग्रिम धन्यवाद!

नोट: कोड को कॉपी

उत्तर

16

साफ करने के लिए संपादित आप Activity lifecycle के लिए चित्र पर एक नज़र लेने के लिए यदि आप गतिविधि के बाद onPause कहा जाता है आप के बारे में कोई गारंटी देखते हैं कि एहसास होगा। एंड्रॉइड आपको डेस्ट्रॉय पर कॉल किए बिना गतिविधि को मार सकता है। आपको onSaveInstanceState का उपयोग करके अपना राज्य सहेजना होगा और इसे onRestoreInstanceState का उपयोग करके पुनर्स्थापित करना होगा।

This उपयोगी हो सकता है।

संपादित करें:

जीवन चक्र विभिन्न परिदृश्यों को शामिल करता है। यदि आपके पास बैक दबाने वाली केवल एक गतिविधि है जो आपके आवेदन से बाहर निकलने के बराबर है। यदि आपके पास एक्टिविटी ए है जो गतिविधि बी शुरू करता है तो SaveInstanceState को गतिविधि ए के लिए बुलाया जाता है। जब आप एक्टिविटी बी में वापस दबाते हैं तो यह बाहर निकलता है और RestoreInstanceState को गतिविधि ए के लिए बुलाया जाता है। आप अपने एप्लिकेशन के दो अलग-अलग रनों के बीच डेटा को सहेजने की कोशिश कर रहे हैं और आप इसके लिए किसी प्रकार का persistent storage उपयोग करने की आवश्यकता है।

+0

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

+0

दस्तावेज़ीकरण यह बताता है: "ऑन पॉज़() और ऑनस्टॉप() पर एक उदाहरण कहा जाता है और यह नहीं है कि यह विधि तब होती है जब कोई उपयोगकर्ता गतिविधि बी से गतिविधि ए पर वापस जाता है: बी पर SaveInstanceState (बंडल) पर कॉल करने की आवश्यकता नहीं है क्योंकि वह विशेष उदाहरण कभी भी बहाल नहीं किया जाएगा, इसलिए सिस्टम इसे कॉल करने से बचाता है। " वापस दबाकर SaveInstanceState पर कॉल नहीं करता है लेकिन होम दबाता है। –

+0

जवाब देने के लिए धन्यवाद। मैंने देखा कि मैंने उल्लेख किया है, लेकिन यदि बैक बटन दबाया जाता है तो SaveInstanceState को कॉल नहीं किया जाता है, तो यह मेरी समस्या का ख्याल नहीं रखेगा, है ना? मैं सिर्फ बैक बटन दबाए जाने पर रोकने के लिए टाइमर को गिनना चाहता हूं और फिर उसी स्थान से पुनरारंभ करना चाहता हूं जब ऐप होम स्क्रीन से फिर से शुरू होता है। मैं गलतफहमी हो सकता हूं, लेकिन ऐसा नहीं लगता है कि यह पूरा करेगा। अब तक मदद करने के लिए धन्यवाद, धन्यवाद, मुझे बस कुछ ऐसा याद आ रहा है जो मुझे लगता है। – Blather

0

आप बस डेटाबेस या फ़ाइल को समय पर लिख सकते हैं और इसे रीज़्यूम में वापस पढ़ सकते हैं।

1

मैं एंड्रॉयड पर एक विशेषज्ञ नहीं हूँ, लेकिन सिर्फ मैं कैसे उम्मीद से कह टाइमर व्यवहार करने के लिए

this.timer.cancel(): - टाइमर रद्द होगा, लेकिन नहीं थामने यह

start_timer(this._timer_time_remaining): - होगा "पुनः आरंभ "टाइमर, अंतिम स्थिति से जारी नहीं है।

तो आप जो देखते हैं वह सही है। हर बार समय शुरू होता है। पता लगाएं कि टाइमर को रोकने के लिए एपीआई क्या है (यदि कोई है)।

0

आप बैक बटन को रोकने और अपने डेटा को SQLite तालिका में सहेजने के लिए कुंजी प्रेस (ऑनकेडाउन) पर) को सुनने का भी प्रयास कर सकते हैं।, (कोड की चार लाइनें)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE); 
SharedPreferences.Editor edit = example.edit(); 
edit.putInt("time_remaining", (Integer)this._timer_time_remaining); 
edit.commit(); 

फिर से शुरू पर ऐसा करते हैं: (कोड की दो पंक्तियां)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE); 
int time_remaining = example.getInt("time_remaining", 0); 

मैं कुछ से अनुकूलित

2

यह कैसे मैं मूल्य की बचत होगी है मेरे कामकाजी कोड के, लेकिन वास्तव में इस सटीक प्रारूप में इसका परीक्षण नहीं किया। यह कैसे काम करता है यह जानने के लिए साझा संदर्भों के लिए प्रलेखन खोजें।

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