我的程式有些批次的事情要做,大概是每五分鐘要去檢查有沒有任務要做,有的話就做,沒的話就等下一個五分鐘,我的任務是有可能會失敗的(例如傳送資料),需要在下一次 Service
內再去嘗試執行,而且要在背景執行。講到這裡聰明的你可能會想到要用 Service
搭配 AlarmManager
來做,就給他設定每隔五分鐘呼叫一次,我也是這樣想的,但遇到一個問題,這樣做非常非常非常非常耗電,就算沒任務也要把 Service
叫起來這可不行。
所以我把程式改為在 Service
的 onDestroy
時去判斷還有沒有任務沒完成的,如果有就設定五分鐘後再次執行,若沒有就不設定了,有新任務加入時再去把 Service
叫起來。
這次的重點就在這!
- 假設上一次的
Service
結束時已經沒有任務要做了,就不會有下一次的自動執行,這時候有新的任務加入,我把Service
叫起來然後執行,OK!沒問題。
- 假設上一次的
Service
結束時還有任務要做,所以五分鐘後會自動執行,在執行之前有新的任務加入,這時候我該叫起Service
嗎?叫起的話就破壞了我每五分鐘執行一次的規律生活了。
這樣說起來就是我需要知道目前這個 Service
有沒有被註冊自動執行囉?
拜請 Google 大神的結果是,沒辦法知道 AlarmManager
目前註冊了哪些 PendingIntent
,所以我無法透過 AlarmManager
知道這個 Service
有沒有可以自起爬起來工作。
好吧從另一個目標下手,PendingIntent
!
他的 getService
第四個參數若設定為 PendingIntent.FLAG_NO_CREATE
,可以用來查詢這個 Intent 有沒有存在 PendingIntent,若存在會回傳該 PendingIntent
,反之會回傳 null
。
if (null == PendingIntent.getService(context, requestCode, intent, PendingIntent.FLAG_NO_CREATE)) {
// register service
}
然後在 Service
執行時立馬把這個 PendingIntent
刪掉。
@Override
public void onCreate() {
PendingIntent pi = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_NO_CREATE);
if (pi != null)
pi.cancel();
}
如此便完成我的需求
「當該 Service
已經註冊下次喚醒時間時,不再重覆註冊或直接喚醒以避免破壞其規律的生理時鐘」
Written with StackEdit.
沒有留言:
張貼留言