2010年1月24日 星期日

關於AlarmManager之二三事 (1)

Alarm type分為四種

  • ELAPSED_REALTIME
  • ELAPSED_REALTIME_WAKEUP
  • RTC
  • RTC_WAKEUP
RTC類別的, 計算時間的方式是以實際的系統時間, 因此, 當User變動系統時間(或另一種狀況, 系統時間被自動更動), 就會影響到排程, 此時可能就需要寫一支BroadcastReceiver去聽Intent.ACTION_TIME_CHANGED來做重新排程的工作, 此種類的用途通常是用在真的需要在某個特定的系統時間作為觸發

ELAPSED_REALTIME則不同, 它計時的方式是以手機開機後開始計算, 不會受到系統時間變更所影響, 只是它的缺點在於它與系統時間沒有絕對關係, 較適合定時觸發的動作

而有WAKEUP和沒WAKEUP的差別呢? 手機在待機時是有可能進入休眠狀態的, 此時整個系統是不會有動作的, 在有WAKEUP的Alarm被觸發後, 此時Alarm Manager會去把手機給叫醒, 並且請求Wake lock鎖住手機不立刻進入休眠, 直到intent receiver的onReceive做完才會釋放wake lock, 而RTC, ELAPSED_REALTIME是不會強行叫醒手機的, 而是會等到手機真的醒了之後才會有機會被觸發

無端端叫醒手機, 其實對手機電力的影響不小的, 所以在使用Alarm manager必須要很小心去避免無故的叫醒正在沈睡的手機