2010-03-14 89 views
14

我有一個小測試應用程序,我正在其中有一個計時器,更新textview從100倒數到0.這工作正常,但現在我試圖暫停應用程序,如果用戶按下手機上的後退按鈕,然後在他們重新打開應用程序時從停止的位置重新啓動計時器。這裏是我使用的代碼:onPause/onResume活動問題

@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 int變量。

CountDownTimer和_timer_time_remaining都在類級別這樣的聲明:

private CountDownTimer timer; 
private int _timer_time_remaining; 

從Log.v()打印我看到_timer_time_remaining變量時的onPause被稱爲存儲秒正確的號碼,但是當onResume開始時它被設置回0。爲什麼變量被重置?我認爲應用程序會繼續在背景中以相同的值運行。我錯過了什麼嗎?這是在擴展Activity的類中聲明的。

在此先感謝!

注:編輯清理代碼複製

回答

16

如果你看看圖表爲Activity lifecycle,你會認識到,有沒有你在onPause保證被稱爲活動後。 Android甚至可以在不調用onDestroy的情況下殺死你的Activity。您必須使用onSaveInstanceState保存您的狀態,並使用onRestoreInstanceState將其恢復。

This可能是有用的。

編輯:

生命週期涵蓋不同的情況。如果您只有一個活動,則按下返回等同於退出您的應用程序。如果您有活動A啓動活動B,則爲活動A調用onSaveInstanceState。當您在活動B中回退時,它只是退出並且爲活動A調用onRestoreInstanceState。您正嘗試在應用程序的兩個不同運行之間保存數據,而您爲此需要使用某種persistent storage

+0

首先,感謝您的迴應。 我用onSaveInstanceState(Bundle savedInstancestate)方法替換了我的onPause方法,但是當我按下後退按鈕離開我的應用程序時,這似乎不會被調用。我的LogCat消息中沒有任何消息顯示出來,所以我認爲它根本不會被調用。我是否需要onPause和onSaveInstanceState實現?或者應該onSaveInstanceState處理它? – Blather 2010-03-14 20:56:59

+0

文檔解釋了這種情況:「調用onPause()和onStop()時的一個示例,而不是此方法是當用戶從活動B返回到活動A時:不需要在B上調用onSaveInstanceState(Bundle),因爲特定的實例永遠不會被恢復,所以系統避免調用它。「 按下後面不會調用onSaveInstanceState,但按Home鍵。 – 2010-03-14 22:21:15

+0

感謝您的回覆。我確實看到了這一點,但如果在按下後退按鈕時不調用onSaveInstanceState,它將不會照顧我的問題,是嗎?我只是希望倒計時計時器在按下後退按鈕時停止,然後當應用程序從主屏幕再次啓動時從相同位置重新啓動。我可能會誤解,但似乎並沒有這樣做。 再次感謝您迄今爲止所採取的幫助,我在這裏只是想念一些東西。 – Blather 2010-03-14 22:41:17

0

您可以簡單地將時間寫入onPause中的數據庫或文件並在onResume中讀回。

1

我不是在Android方面的專家,只是從我如何期望告訴計時器的行爲

this.timer.cancel(): - 將取消計時器,但不暫停

start_timer(this._timer_time_remaining): - 將「重啓「計時器,不能從最後的位置繼續。

所以你看到的是正確的。每次重新開始時。 找出暫停計時器的api是什麼(如果有的話)。

0

您還可以嘗試聆聽按鍵(onKeyDown())來攔截後退按鈕並將數據保存到SQLite表中。

2

這是我怎麼會保存價值:(四行代碼)

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); 

我適應這個從一些我的工作代碼,但沒有實際測試它在這個確切的格式。搜索sharedPreferences的文檔以瞭解其工作原理。