アラーム マネージャーを使用して、アプリで 30 分ごとにアラームを発生させようとしてsetExactAndAllowWhileIdle
いますが、機能していません。
アラーム信号を受信するたびにプッシュ通知を発行して、機能をテストします。
問題は、デバイスがしばらくアイドル状態になった後に居眠りモードに入ると、アラームを受信しなくなることです。ただし、画面をオンにするとすぐに通知が届きます。私のアプリには正確なアラームが必要で、30 分ごとに正確に時間通りに配信される必要があります。デバイスが Doze モードになっているため、アラームの遅延や欠落を受信する余裕はありません。
コードで次を使用しました。
- アプリを開いたときにアラームを設定します。
- WakefulBroadcastReceiver を使用してアラーム信号を受信します。その
onReceive()
方法で、次のアラームを設定しました。また、プッシュ通知のみを発行する startWakefulService を開始し、その後停止します。 - onReceive() の最後で completeWakefulIntent を呼び出します。
- 両方をテストしてみました: RTC_WAKEUP & ELAPSED_REALTIME_WAKEUP
ノート:
- マニフェストには wakefulbroadcastReceiver クラスが登録されています。
- 次の権限を追加しました:
android.permission.WAKE_LOCK
- アプリをホワイトリストに登録しようとしましたが、結果は同じです
setAlarmClock()
50 アラームごとに 1 つのドロップ/遅延アラームで、居眠りモード中でも常に機能するものを使用してみました。したがって、それも完璧ではありません。また、ユーザーに常にアラーム アイコンを表示させたくありません。- setExactAndAllowWhileIdle() は居眠り中に機能しないだけでなく、機能しているときの精度もひどいものです。私は通常、
1 ~ 3 分後または 1 ~ 3 分前に多くのアラーム信号を受け取ります。 - Huawei Mate 8 と android 7.0 Nougat を使用してテストしています。
追伸: 回答する前に、Android 6.0 M および Doze モードの開始時に課せられた制限を認識していることを確認してください。
リンク 1: https://developer.android.com/training/monitoring-device-state/doze-standby.html
要約すると、次のように述べています。
- Doze 中に起動するアラームを設定する必要がある場合は、setAndAllowWhileIdle() または setExactAndAllowWhileIdle() を使用します。
- setAlarmClock() で設定されたアラームは、通常どおり起動し続けます。システムは、これらのアラームが起動する直前に Doze を終了します。
では、なぜ 30 分ごとに正確なアラーム信号を受信しないのsetExactAndAllowWhileIdle()
でしょうか?! そして、なぜsetAlarmClock()
100% 信頼できないのでしょうか?!