2015年12月7日 星期一

在 Android 中判斷該 Service 有無被註冊喚醒的方法

在 Android 中判斷該 Service 有無被註冊喚醒的方法

我的程式有些批次的事情要做,大概是每五分鐘要去檢查有沒有任務要做,有的話就做,沒的話就等下一個五分鐘,我的任務是有可能會失敗的(例如傳送資料),需要在下一次 Service 內再去嘗試執行,而且要在背景執行。講到這裡聰明的你可能會想到要用 Service 搭配 AlarmManager 來做,就給他設定每隔五分鐘呼叫一次,我也是這樣想的,但遇到一個問題,這樣做非常非常非常非常耗電,就算沒任務也要把 Service 叫起來這可不行。

所以我把程式改為在 ServiceonDestroy 時去判斷還有沒有任務沒完成的,如果有就設定五分鐘後再次執行,若沒有就不設定了,有新任務加入時再去把 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.

沒有留言:

張貼留言