web-dev-qa-db-fra.com

Android P Beta - Les notifications AlarmManager ne fonctionnent pas

Je teste mon application sur la version 4 d'Android P beta. Mon targetSdkVersion a 27 ans

Il a été constaté que les notifications du gestionnaire d’alarmes ne fonctionnaient pas comme prévu. J'utilise le code ci-dessous pour définir les notifications - 

           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));
            }

J'ai testé la même logique sur Android 8.0 mais cela fonctionne bien. Dans Android 9.0, les notifications fonctionnent, mais parfois, elles ne fonctionnent pas du tout. En outre, s’ils fonctionnent, ils ne sont pas exacts et prennent trop de temps, ce qui se produit même si l’application est au premier plan.

La logique est la suivante: j'ai les rappels à répéter qui sont réglés sur une heure spécifique et ceux-ci doivent se répéter tous les jours à l'heure spécifiée. De plus, ces rappels sont de haute priorité et doivent atterrir à l'heure exacte. J'utilise donc setExact. Dès que la notification est reçue, elle est affichée et une nouvelle alarme est définie pour la semaine suivante.

J'ai vérifié les documents de l'API Android P, mais je n'ai trouvé aucun lien ayant un impact sur le fonctionnement de AlarmManager et des notifications. La seule chose qui, à mon avis, est la cause du problème est Gestion de l’alimentation sous Android P et les compartiments de priorité. Cependant, les notifications ne fonctionnent pas correctement même si l'application est au premier plan.

Tout ce qui me manque ici. Toute aide est très appréciée.

4
Amrut

Cela se produit à cause de Gestion de l'alimentation fonctionnalité introduite dans Android Pie.

Dans Android P, des restrictions strictes sont introduites pour les applications fonctionnant en arrière-plan. Ces restrictions sont expliquées ici

Comme nous pouvons le voir dans le lien ci-dessus, si nous connectons l'appareil à la charge, aucune restriction n'est imposée à l'appareil et les notifications fonctionnent correctement. Cependant, si nous supprimons l'appareil, le système Android ajoute certaines restrictions aux applications s'exécutant en arrière-plan.

Nous pouvons désactiver ces restrictions en désactivant l'optimisation de la batterie pour notre application à partir des paramètres de l'appareil. Recherchez l'optimisation de la batterie dans les paramètres et désactivez-la pour notre application.

En outre, le fait de tester les notifications en modifiant la date et l'heure de l'appareil était un hack qui fonctionnait jusqu'à présent mais sous Android P, nous devons soit les tester en temps réel, soit désactiver l'optimisation de la batterie pour notre application. pour les tester.

J'espère que cela effacera nos doutes.

0
Amrut

Comme vous l'avez vous-même mentionné, la nouvelle fonctionnalité de App Standby Buckets de la gestion de l'alimentation en est probablement la cause. La nouvelle documentation indique:

Si une application se trouve dans le compartiment fréquent [ ou inférieur ], le système impose des restrictions plus strictes quant à sa capacité à exécuter des tâches et à déclencher des alarmes.

et

En particulier, le compartiment détermine la fréquence d'exécution des travaux de l'application, la fréquence à laquelle l'application peut déclencher des alarmes.

De plus, si vous affichez Détails de l'alimentation , vous pouvez avoir une idée approximative des délais. 

 enter image description here

Il est à noter que votre compartiment semble être basé sur l'utilisation moyenne (et l'apprentissage automatique) not sur l'utilisation actuelle - ce qui signifie que même si votre application vient d'être au premier plan, les compartiments jouent un certain rôle.

3
Nick Cardoso