2010年1月24日 星期日

關於AlarmManager之二三事 (2)

setReaping與setInexactRepeating有啥不同?

在這系列的第一篇有提到, 無故的叫醒手機是很耗費電力的, 但有時候卻又不得不這樣做, 如果盡可能的把喚醒的間隔拉長是可以緩解這問題

但真正的問題在於, 一支手機內不會只有一支程式需要每隔一段時間觸發一次, 如果碰到以下這狀況:

程式A, 05:05.00 設定每隔1小時
程式B, 05:06.30 設定每隔1小時
程式C, 05:07.00 設定每隔半小時

雖然看起來每支程式觸發最小間隔要半個小時, 但其實在這狀況, 手機分別會在05:37.00, 06:05.00, 06:06.30, 06:07.00 被喚醒, 次數並不少, 而且在六點多這時候被喚醒的間隔是很短的

在1.5之前, 用setRepeating來設定週期性的Alarm的確會有這情形, 但其實, 常常程式不是真的需要在很精確的時間被執行(除非是鬧鐘), 這樣的作法相當浪費

因此在1.5的時候, 多了setInexactRepeating, 這method照API文件上的說明的意義就是盡量把相近的Alarm集中在一起觸發, 如果不是很要求精確在某一時間觸發的話, 其實應該要選用這個

但setInexactRepeating其實有陷阱的, 它的間隔只有在以下幾種數值內才有作用:

  • INTERVAL_FIFTEEN_MINUTES
  • INTERVAL_HALF_HOUR
  • INTERVAL_HOUR
  • INTERVAL_HALF_DAY
  • INTERVAL_DAY

如果不是落在這五種的範圍內, setInexactRepeating和setRepeating根本就是等義