Android 4.4(API 19)よりAlarmManagerの挙動が変わったらしい。4.4端末を購入して気付いた。
バッテリー消費を抑えるために登録されたアラームを個別に実行せずに、システムが判断してある程度まとめて実行するようになったようだ。例えば10分の間に複数のアラームがあったら、どこかのタイミングでまとめて実行するためにいくつかのアラームは指定した時刻には実行されないことになる。それがどれくらいずれるのかはシステムの状態によるのだろう。実機で確認したところ最大10分以上の遅延が発生した。
目覚ましアプリ等、正確な時刻に実行させる必要のあるアプリには致命的。
API 19以降で正確に実行させる場合は新しく追加されたsetExact()メソッドを使用する必要があるようだ。ただし、これは間隔指定ができないため、アラームが実行される毎に再度setExact()で次回アラームを登録するような処理が必要となる。
とりあえずの対応として「android:targetSdkVersion=18」にしておけば従来の挙動となるようだ。