2012-04-26 74 views
2

AlarmManagers應該被聲明和初始化的適當上下文是什麼,以便它們無限期地持續下去(或直到系統重新啓動或直到任務殺手完全清除掉)並避免垃圾集合 - 但也允許在整個應用程序範圍內更改警報。Android AlarmManager長時間停止射擊

我使用AlarmManager的全部原因是爲了解決需要隨時運行服務的問題。然而要完成這個壯舉,AlarmManager創建在哪裏?我會想象它不能在一個服務中創建,然後關閉/銷燬,因爲報警對象最終會消失,並且報警會停止發射 - 不是嗎?

我喜歡從不同問題文章中的AlarmManager例子的想法,其中MyAlarm類被創建爲警報的onReceive的BroadcastReceiver的擴展,並且AlarmManager在這個類的構造函數中初始化。但是,如果跨多個上下文需要MyAlarm實例,該實現如何工作。例如,從多個Activity對象的事件處理程序中。來自多個Widgets的事件處理程序。來自工人服務。所有這些都可能必須禁用或啓用警報。我的猜測是,在需要處理警報的地方創建一個本地實例,並且因爲所有實例的pendingIntent都是相同的,所以實際上您將使用虛擬「單例」。

這只是在這一點上的概念,因爲我不知道如何測試可能發生的報警管理器的「垃圾回收」8,12?幾小時後,當我的鬧鈴隨機停止射擊時。我的目標是,如果手機沒有重新啓動,並且我的任務不會被用戶手動殺死,以保持無限期地發出警報。謝謝

回答

0

在android中,操作系統會自動關閉它認爲沒有被使用的服務......很多應用程序和特別的小部件都在爲此而煩惱。我不知道是否有確定的方式來確保服務不會自行關閉。您可以通過偶爾做一些事情來延長它,因此係統不認爲這是無用的任務。

是的,你會爲所有這些使用相同的掛起意圖,所以你可以運行一個服務與多個處理程序鏈接到它,這是操作系統設置方式的好處的一部分。您可以在單一服務開始時用您的簽名更新所有小部件,該服務還可以從小部件接收所有處理程序。

+0

對不起,我的目標是使用AlarmManager,以便我的服務不需要繼續運行。警報實際上會啓動服務,服務完成後會關閉。真正的問題是,我在哪裏初始化給定的pendingIntent的AlarmManager實例,以便它始終保持運行,即使它最初聲明的服務不再運行? – gauglerb 2012-04-26 23:40:19

+0

服務只是一個持續存在的後臺進程,這樣您就可以執行諸如保持偵聽器打開的功能。您無法初始化AlarmManager,以便它在服務中初始化並保持該服務在運行時「永久運行」。就像我說的,你可以通過偶爾做一些事情來堅持它,所以操作系統不認爲這是一個死的過程。人們在屏幕上使用喚醒手柄很多,這樣,每當用戶喚醒手機時,你就可以做一些事情。由於這通常足以確保操作系統不會終止服務,所以我會嘗試。 – 2012-04-27 21:32:41

0

但是要完成這項壯舉,AlarmManager創建在哪裏?

AlarmManager是一個系統服務。它由操作系統「創建」。

我會想象它不能在服務中創建,然後關閉/銷燬,因爲報警對象最終會消失,並且報警將停止發射 - 是不是?

AlarmManager是一個系統服務。 「警報」由操作系統保存。

我的猜測是,到處都創建一個本地實例,你需要處理的報警,因爲是的PendingIntent所有實例一樣,你實際上將有一個虛擬的「單身」的工作。

正確。

+0

由OS創建的系統服務。這有助於概念化,謝謝!因此,一旦計劃了重複警報(pendingIntent),除非應用程序強制關閉,任務中斷,程序取消警報或設備重新啓動,否則警報應無限期熄滅?從哪裏調用setRepeating(PI)並不重要? PI是否必須是靜態對象或任何特殊的東西才能使此警報在正常情況下永遠持續。謝謝 – gauglerb 2012-04-26 23:46:59

+1

@ user1359312:*可能導致警報問題的唯一其他情況是應用程序升級時的情況,儘管我無法重現該情況。否則,你的清單看起來相當完整。 「setRepeating(PI)從哪裏調用並不重要?」 - 正確。 「PI是否必須是一個靜態對象或任何特殊的東西,才能使這個警報在正常情況下永遠持續下去。」 - 沒有。 – CommonsWare 2012-04-26 23:52:44