我在我的應用程序ActivityA和ActivityB中有2個活動和一個倒數計時器。計時器應該在兩個活動之間繼續運行。如果用戶點擊home或back按鈕,計時器將被保存到數據庫,然後將從應用程序重新啓動時的最後一個狀態繼續。倒計時計時器問題
我在onPuse()和onBackPressed()中保存到數據庫。用戶點擊主頁和後退按鈕時保存數據。
我的問題是:如果從ActivityA調用ActivityB,那麼將調用保存到數據庫方法。除非按下主頁按鈕,否則我怎樣才能避免它被調用?
我在我的應用程序ActivityA和ActivityB中有2個活動和一個倒數計時器。計時器應該在兩個活動之間繼續運行。如果用戶點擊home或back按鈕,計時器將被保存到數據庫,然後將從應用程序重新啓動時的最後一個狀態繼續。倒計時計時器問題
我在onPuse()和onBackPressed()中保存到數據庫。用戶點擊主頁和後退按鈕時保存數據。
我的問題是:如果從ActivityA調用ActivityB,那麼將調用保存到數據庫方法。除非按下主頁按鈕,否則我怎樣才能避免它被調用?
創建計時器後,將創建時間存儲在數據庫中,然後在每個活動onResume中重新加載計時器,從當前時間開始 - 創建時間。像這樣的僞代碼
createTimer() {
createTimerEntryInDB();
showTimer();
}
showTimer() {
fetchTimerEntryFromDB();
populateTimerUI();
}
/* In both activity */
onResume() {
if (doesTimerExistInDB) {
showTimer();
}
}
而不是兩個活動之間的一個計時器,爲什麼不爲每個活動使用單獨的計時器和數據庫條目,然後檢查它們的總和是否超過限制。
將計時器的值傳遞給ActivityB
。當返回到ActivityA
時,發送定時器的值並從該值開始重新開始。不要忘記在開始新的意圖之前停下來並保存。
您還可以創建一個服務,並綁定每項活動給它的東西,然後揭露一些普遍約束力的方法來訪問定時器和操縱它按照自己的喜好。
當您關閉應用程序時會解除綁定活動,並且服務將默認自行停止。
正如我理解你的問題,如果從ActivityA
調用ActivityB
,你不想保存在數據庫中的倒數狀態。但在其他任何情況下,你想保存它。
一個相當簡單的解決方案包括使用串行化標記:
ActivityA
:
public class ActivityA extends Activity {
private boolean serializationIsEnabled = true; // The flag
...
private void internalLogicOfYourActivity() {
...
// When ActivityA calls ActivityB, it disables the serialization of the timer
serializationIsEnabled = false;
startActivityForResult(new Intent(this, ActivityB.class), REQUEST_CODE);
...
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == REQUEST_CODE) {
// We'll be happy to have the serialization working again when we'll be back from ActivityB.
// A variant of this would be to reset serializationIsEnabled in onResume()
serializationIsEnabled = true;
...
}
}
@Override
protected void onPause() {
// Save the state of the timer if the serialization is enabled
if (serializationIsEnabled) {
saveCountDownInTheDatabase();
}
super.onPause();
}
@Override
public void onBackPressed() {
// it is not even needed to save the countdown here:
// onPause() will be called anyway if you press back.
super.onBackPressed();
}
}
而且ActivityB
:
public class ActivityB extends Activity {
...
@Override
protected void onPause() {
saveCountDownInTheDatabase();
super.onPause();
}
@Override
public void onBackPressed() {
// Same here: it is not needed to save the countdown:
// onPause() will be called anyway if you press back.
super.onBackPressed();
}
}
這樣,我們是很好的關於你的問題。
如果你不希望保存倒計時無論是從ActivityB
回來ActivityA
的時候,你可以通過修改ActivityB
以下方式應用類似的邏輯:
public class ActivityB extends Activity {
private boolean serializationIsEnabled = true; // The flag
...
private void finishWithResult(int result) {
serializationIsEnabled = false;
setResult(result);
finish();
}
private void internalLogicOfYourActivity() {
...
finishWithResult(RESULT_OK);
...
}
@Override
protected void onPause() {
if (serializationIsEnabled) {
saveCountDownInTheDatabase();
}
super.onPause();
}
@Override
public void onBackPressed() {
finishWithResult(RESULT_CANCELED);
super.onBackPressed();
}
}
這樣,如果用戶除了在ActivityA
和ActivityB
之間進行切換之外,還會執行其他任何操作,倒數保存在數據庫中。否則它不是。
保持定時器在交換過程中運行不是問題,也不是從數據庫內容初始化定時器。由於這裏似乎不是你的問題,請告訴我你是否希望我詳細說明這一點。
如果您按下A中的Home,則它會回到Home中,除非您覆蓋Home Button按下事件來觸發B – Rasel
每次活動變爲「隱藏」時,都會自動調用onPause(),因此每次按下後按鈕。順便說一句,強烈建議不要重寫主頁按鈕事件。 – iDroid
@iDroid其實它不可能覆蓋主頁按鈕 – inazaruk