2010-10-31 62 views
3

我在我的android應用中實現了一個啓動計時器的服務(使用標準的java.util.Timer和java.util.TimerTask機制)在預定義的時間間隔內在後臺執行一些處理。在Android中實現一個始終處於活動狀態的計時器(即使在屏幕超時期間)

public class BackgroundProcessingService extends Service { 

private int interval; 
private Timer timer = new Timer(); 

public void onCreate() { 
    super.onCreate(); 
    startTimer(); 
} 

@Override 
public void onDestroy() { 
    timer.cancel(); 
    super.onDestroy(); 
} 

public int getInterval() { 
    return interval; 
} 

public void setInterval(int interval) { 
    this.interval = interval; 
} 

private void startTimer() { 

    timer.scheduleAtFixedRate(new TimerTask() { 

     public void run() { 
      // perform background processing   
     } 

    }, 0, getInterval()); 

    ; } 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

}

服務啓動/用我的應用程序是這樣停止。

backgroundProcessingService = new Intent(getApplicationContext(), BackgroundProcessingService .class); 

startService(backgroundProcessingService); 

只要電話處於活動狀態(沒有屏幕超時發生),該服務被細運行,並且所述定時器在定義的時間間隔執行它的工作。即使我退出應用程序(使用後退按鈕),計時器仍然保持活動狀態。

但是,一旦手機進入超時狀態,計時器任務不再穩定運行。如果我在幾個小時(晚上)超時的情況下離開電話,我會在隨機場合(有時間隔幾個小時)看到計時器已加入。

此外,當手機再次啓動時,所有計時器都會運行已經排隊的隊伍在恢復到正常間隔之前突然執行一次。

即使在電話進入超時狀態後,實現定時器仍能正常運行的正確方法是什麼?我是否應該使用PowerManager和WAKE_LOCKS(如此處所述http://code.google.com/android/reference/android/os/PowerManager.html),還是有其他機制?

+0

和我一模一樣! – 2012-11-21 18:37:37

回答

4

這就是AlarmManager的用途。

+0

這確實做了蜱...整個晚上平穩。感謝指針。 – ddewaele 2010-11-01 06:23:57

+1

所以請接受答案。 – 2010-11-01 07:46:00

+1

它不是它的意思,該文檔說:注意:Alarm Manager適用於希望讓應用程序代碼在特定時間運行的情況,即使您的應用程序當前未在運行。對於正常的定時操作(滴答,超時等),使用Handler更容易,效率更高。 – 2012-11-21 18:42:04

0

有點毫無意義的把另一個答案放在這裏,但會出於哲學原因。

AlarmManager肯定不是這裏的答案,但之後,Handler也不是。如果您擔心有可運行的線程可以在除您正在運行的線程之外的線程上運行(如本答覆Updating GUI: Runnables vs Messages中所述),則可以執行處理程序。

真正的答案是,如果你在你自己的應用程序的理由時的東西,這意味着,你需要將其納入無論你的模型可能域事件,所以舉例來說,如果我要發送電子郵件,我會有一些關於電子郵件狀態/轉換的事件。這就是「反應式編程」:將對事物的響應過程提升到軟件的設計層面,而不僅僅是將調度作爲一個嵌入一層「對象」之下的鍋爐房細節來處理。

相關問題