2011-07-15 155 views
3

我在我的應用程序ActivityA和ActivityB中有2個活動和一個倒數計時器。計時器應該在兩個活動之間繼續運行。如果用戶點擊home或back按鈕,計時器將被保存到數據庫,然後將從應用程序重新啓動時的最後一個狀態繼續。倒計時計時器問題

我在onPuse()和onBackPressed()中保存到數據庫。用戶點擊主頁和後退按鈕時保存數據。

我的問題是:如果從ActivityA調用ActivityB,那麼將調用保存到數據庫方法。除非按下主頁按鈕,否則我怎樣才能避免它被調用?

+0

如果您按下A中的Home,則它會回到Home中,除非您覆蓋Home Button按下事件來觸發B – Rasel

+2

每次活動變爲「隱藏」時,都會自動調用onPause(),因此每次按下後按鈕。順便說一句,強烈建議不要重寫主頁按鈕事件。 – iDroid

+2

@iDroid其實它不可能覆蓋主頁按鈕 – inazaruk

回答

4

創建計時器後,將創建時間存儲在數據庫中,然後在每個活動onResume中重新加載計時器,從當前時間開始 - 創建時間。像這樣的僞代碼

createTimer() { 
    createTimerEntryInDB(); 
    showTimer(); 
} 

showTimer() { 
    fetchTimerEntryFromDB(); 
    populateTimerUI(); 
} 

/* In both activity */ 
onResume() { 
    if (doesTimerExistInDB) { 
     showTimer(); 
    } 
} 
+0

這是正確的做法。不要忘記onPause(){storeTimer();}雖然。另外,在您致電onResume時,您的計時器可能已過期。如果您按Home鍵,等待足夠的時間,然後重新輸入您的應用程序(通過長按Home鍵),則可能會發生這種情況。因此,請確保在onResume中仔細檢查數據庫中的計時器值,以確保您不會受到負面影響。 – Josh

+0

我想它一旦存儲在數據庫中就沒有必要在onPause中恢復它,但是需要檢查它是否過期以及是否它過期了,它需要從數據庫中刷新。 – PravinCG

+0

哦,是的,你是對的,當你創造它時,你保存了原作! – Josh

1

而不是兩個活動之間的一個計時器,爲什麼不爲每個活動使用單獨的計時器和數據庫條目,然後檢查它們的總和是否超過限制。

1

將計時器的值傳遞給ActivityB。當返回到ActivityA時,發送定時器的值並從該值開始重新開始。不要忘記在開始新的意圖之前停下來並保存。

3

您還可以創建一個服務,並綁定每項活動給它的東西,然後揭露一些普遍約束力的方法來訪問定時器和操縱它按照自己的喜好。

當您關閉應用程序時會解除綁定活動,並且服務將默認自行停止。

1

正如我理解你的問題,如果從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(); 
    } 
} 

這樣,如果用戶除了在ActivityAActivityB之間進行切換之外,還會執行其他任何操作,倒數保存在數據庫中。否則它不是。

保持定時器在交換過程中運行不是問題,也不是從數據庫內容初始化定時器。由於這裏似乎不是你的問題,請告訴我你是否希望我詳細說明這一點。