AndroidのAlarmManagerで設定したAlarmが消えてしまうことがあった

(後記。TIME_SET等ではAlarmが消えることはありませんでした。コメント参照してください)

Androidのアプリを作っていた。
AlarmManagerでServiceを定期的に起動するようにしたが、気がついたら、Serviceが動かなくなっている。
なぜ? とググっていたら・・・

rokuta96のAndroidアプリ開発 アラーム3

システム時間変更イベントで、アラームがクリアされてしまうとのこと。

えーそんなのアリかよ・・・でもまあそういうイベント時にクリアしたくなるOSの気持ちもわかるな・・・
え、でもおれ今回のアプリを実験開始してから時刻設定とかタイムゾーン変更とかしたことないし、おかしくね?・・・・・・・・・あっ!

日付と時刻…ネットワーク自動設定!これかあ!

さっそくBroadcastReceiverを付けて確認してみたら、たしかに、ときどき、TIMEZONE_CHANGED や TIME_SET が発生していた。
これ気をつけないといけないのね。

2017/10 追記。
久しぶりに AlarmManagerを使ってみたら、setInexactRepeating() で、ぜんぜん、指定したインターバルで呼ばれない。

ドキュメントを見る…

intervalMillis
interval in milliseconds between subsequent repeats of the alarm. Prior to API 19, if this is one of INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_HALF_DAY, or INTERVAL_DAY then the alarm will be phase-aligned with other alarms to reduce the number of wakeups. Otherwise, the alarm will be set as though the application had called setRepeating(int, long, long, PendingIntent).
As of API 19, all repeating alarms will be inexact and subject to batching with other alarms regardless of their stated repeat interval.

API 19(Android 4.4 kitkat)以前は、INTERVAL_FIFTEEN_MINUTES、INTERVAL_HALF_HOUR、INTERVAL_HOUR、INTERVAL_HALF_DAY、またはINTERVAL_DAYのいずれかである場合、アラームは他のアラームと位相調整されてウェイクアップの回数を減らします。 それ以外の場合は、アプリケーションがsetRepeating(int、long、long、PendingIntent)を呼び出したかのようにアラームが設定されます。
API 19では、繰り返されるすべてのアラームは、指定された繰り返し間隔に関係なく、不正確で、他のアラームとのバッチ処理が行われます。

まじかよ…ひでえな。

コメント

  1. og より:

    はじめまして
    同じ現象にぶちあたりました。
    こちらに書いてある方法で解決しましたか?
    バグと同じ状況になることがまれで、検証が難しい状態なので…

  2. xo より:

    こんにちは。

    私は

    android.intent.action.BOOT_COMPLETED
    android.intent.action.PACKAGE_REPLACED
    android.intent.action.TIME_SET
    android.intent.action.TIMEZONE_CHANGED
    android.intent.action.DATE_CHANGED

    のBroadcastを拾ったら、アラームマネージャ再登録するようにして、解決したと思ってます。
    (BOOT_COMPLETED, PACKAGE_REPLACED は、作ったアプリが、起動時から動作させるようにしてあるものであるため)

  3. og より:

    解決しました。
    タスクキラー系アプリがAlarmManagerの設定を消してしまうことがあるようです。

    TIME_SETやDATE_CHANGEDで定期的にセットし直すというxoさんの解決法で行けそうです。
    どうもありがとうございました。

  4. yuki より:

    こんにちは。アラーム設定方法を検索してここにたどり着きました。

    エントリ内容が少し気になったのですが、リンク先では(事実か否かはともかく)
    「システム時間変更イベントで、アラームがクリアされてしまう」
    とは書かれていないように見えます。

    リンク先で書かれている、アラームが消える条件は下記3ケースのみではないでしょうか。

    端末の電源をオフにした時
    アプリをアンインストールした時
    アプリをバージョンアップインストールした時

    # 古いエントリへのコメントで申し訳ありません。

  5. xo より:

    あれ・・・って、言われてみるとそのとおりですね・・
    TIME_SET等ではalarmそのものは消えませんね。
    何を勘違いしていたんだろう。

    しかしながら、
    たとえば AlarmManager#setInexactRepeating() でリピートタイマを設定後、
    時間が巻き戻るようなことが起きた場合は、
    次のアラームまで意図しない長時間がかかったりすることはあるので、
    TIME_SET等が発生したときも、アラーム再設定するのが無難だとは思います。

タイトルとURLをコピーしました