2011-11-02 106 views
1

我已經創建了一個服務(S),它承載一個ContentObserver(C)。 C跟蹤一些數據並記錄對數據庫所做的更改(D)。睡眠服務與內容服務器

S還有一個定時器,它將D的內容按定時間隔轉儲到文件中。

我有我的服務在我的手機上運行,​​一段時間(一兩個小時左右)似乎都很好。然後突然停止記錄對數據所做的更改並停止將其轉儲到文件。 我試着改變數據(在C上挑起onChange)並在手機中瀏覽以保持設備清醒,但沒有發生任何事 - 服務stil不活動。 S仍在運行,當我連接到我的筆記本電腦時,我在日誌中看到沒有錯誤。

我的猜測是該服務正在休眠(不會獲得CPU片)。我已經讀了一些關於喚醒鎖,但我不想強迫手機一直醒着。 ()。 另一種方法是創建一個重複的警報,每T分鐘執行一次C的工作(輪詢)。 我更喜歡ContentObservers的想法,因爲用戶可以更改(尤其是刪除)更新之間的數據。通過ContentObserver,我將獲得所有更改,而不僅僅是定時間隔內的快照。

關於如何在常規基礎上喚醒我的服務的任何想法?

問候 弗雷德裏克

回答

0

可以使用AlarmManager廣播在設定的時間間隔掛起的意圖。如果您使用RTC_WAKEUP類型,則在設備處於睡眠狀態時甚至會發送它。

Intent intent = new Intent("android.intent.action.DO_SOMETHING"); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); 

AlarmManager alarmManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE); 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60*60*1000, pendingIntent); 

然後只需註冊一個廣播接收機的意圖,並做你必須做的。 請注意,廣播接收器在aprox後超時。 10秒,所以如果你有一個長期的任務,使用服務

+0

嗨埃裏克。該應用程序已經是服務(如我的問題所述)。我的問題是,這項服務睡着了,因此停止監測數據。我試圖用相應的接收器註冊一個鬧鐘。接收者然後以意圖呼叫該服務。有沒有其他解決方法呢? – Frederik

+0

@Frederik Di你得到的回答是「我的問題是這個服務睡着了,因此停止監視數據,我試圖用相應的接收器註冊一個警報,然後接收者打算用意圖調用服務。在這附近?「。 – dira

+0

@ becomputer06不,我沒有得到任何答案。正如你所建議的那樣,我的解決方法是創建一個警報。自從我問這個問題已經有一段時間了,我希望更新的API能夠適應這種需求。 – Frederik