web-dev-qa-db-ja.com

Android P Beta-AlarmManager通知が機能しない

Android Pベータリリース4でアプリケーションをテストしています。私のアプリtargetSdkVersion is 27

アラームマネージャー通知が期待どおりに機能していないことが確認されています。以下のコードを使用して通知を設定しています-

           if (Android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KitKat) {
                alarmManager.set(AlarmManager.RTC_WAKEUP, triggerAtMillis, AlarmIntentBuilder.buildPendingIntent(context, uri));
            } else if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
                alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, AlarmIntentBuilder.buildPendingIntent(context, uri));
            } else {
                alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerAtMillis, AlarmIntentBuilder.buildPendingIntent(context, uri));
            }

私はAndroid 8.0で同じロジックをテストしましたが、正常に機能しています。Android 9.0では、通知は機能していますが、まったく機能しない場合があります。また、これらは正確ではなく機能し、時間がかかりすぎます。これは、アプリケーションがフォアグラウンドにある場合でも発生します。

論理は、私は特定の時間に設定されたリマインダーを繰り返しており、それらは指定された時間に毎日自分でそれらを繰り返す必要があるということです。また、これらは優先度の高いリマインダーであり、正確な時間に着陸する必要があるため、setExactを使用しています。通知を受信すると表示され、同じ日の翌週の新しいアラームが設定されます。

Android P APIドキュメントを確認しましたが、AlarmManagerおよび通知の動作に影響を与えるリンクは見つかりませんでした。問題はAndroid Pの電力管理と優先度バケットです。ただし、アプリケーションがフォアグラウンドにある場合でも通知は正しく機能しません。

ここに欠けているもの。どんな助けでも大歓迎です。

8
Amrut

これは、Android Pieで導入された Power management 機能が原因で発生します。

Android Pでは、バックグラウンドで実行されているアプリに厳しい制限が導入されています。これらの制限について説明します こちら

上記のリンクからわかるように、デバイスを充電に接続した場合、デバイスに課せられる制限はなく、通知は適切に機能しています。ただし、デバイスを削除すると、Androidシステムにより、バックグラウンドで実行されているアプリに特定の制限が追加されます。

デバイスの設定からアプリケーションのバッテリーの最適化をオフにすることで、この制限をオフにすることができます。設定でバッテリーの最適化を検索し、アプリケーションでオフにします。

また、デバイスの日付と時刻を変更して通知をテストすることは、これまで正常に機能するハックでしたAndroid P、リアルタイムシナリオでテストするか、アプリケーションのバッテリー最適化をオフにしてテストする必要があります。

これで私たちの疑問が解消されることを願っています。

5
Amrut

あなた自身が述べたように、電源管理の新しい App Standby Buckets 機能が原因である可能性があります。新しいドキュメントは次のように述べています:

アプリが頻繁なバケットにある場合(以下]、システムはジョブを実行し、アラームをトリガーする機能に対してより強い制限を課します

そして

特に、バケットは、アプリのジョブが実行される頻度、アプリがアラームをトリガーできる頻度を決定します

さらに、 Power Details を表示すると、遅延時間の大まかな情報を得ることができます。

enter image description here

注目に値するのは、バケットが平均使用量(および機械学習)に基づいているように見える現在の使用量ではない-つまり、アプリがフォアグラウンドにあったばかりの場合でも、バケット何らかの役割を果たす

6
Nick Cardoso