web-dev-qa-db-fra.com

Android Notifications déclenchées par Alarm Manager ne se déclenchant pas lorsque l'application est en mode Doze

J'ai les exigences suivantes. Un utilisateur doit pouvoir planifier un rappel récurrent dans mon application qui déclenchera une notification Push à une heure exacte chaque jour.

C'est une de ces questions que j'espérais finir par ne pas soumettre car des questions similaires ont été recommandées lors de sa rédaction. Cependant, plusieurs membres de l'équipe ont passé des heures et des heures à parcourir les documents Android Developer Docs et Stackoverflow et nous ne semblons pas plus proches d'une réponse, alors nous y sommes.

Si je crée un rappel et que je le configure pour déclencher la notification 5 minutes plus tard, la notification se déclenche très bien.

Je soupçonne que cela peut être un problème provoqué par les changements d'économie de batterie, de verrouillage de réveil, etc. introduits dans Android P car nous n'avons pas eu ce problème avant de mettre à jour notre SDK cible à 28. Cela étant dit que je ne suis pas certain que ce soit le seul problème, mais je peux toujours reproduire le problème sur un Pixel et un Pixel 3 XL exécutant Android P.

Un exemple où la notification ne se déclenche pas se produit lorsque, par exemple, un utilisateur définit le rappel à un moment donné au milieu de la nuit (probablement lorsque l'utilisateur est endormi et n'aura donc pas utilisé le téléphone pendant plusieurs heures). Ces rappels ne se déclenchent jamais.

J'essaie actuellement d'accomplir cela en utilisant le gestionnaire d'alarmes.

Ce problème semble être similaire à une autre question qui utilise la méthode Alarm Manager's setRepeating que nous avons trouvée ne fonctionne pas. Nous utilisons plutôt la méthode setExactAndAllowWhileIdle du gestionnaire d'alarmes. Nous avons également essayé cette même implémentation avec la méthode Alarm Managers setAlarmClock qui, selon la Android "sera autorisée à se déclencher même si le système est à faible consommation d'énergie) mode inactif (alias somnoler) "mais cela n'a pas réussi non plus.

Je soupçonne que la raison pour laquelle cela ne fonctionne pas est que setExactAndAllowWhileIdle ne se déclenche pas lorsque le téléphone est en mode somnolence, similaire aux problèmes exprimés dans cette question . Cette question recommande d'utiliser Firebase JobDispatcher mais comme il s'agit d'une notification interne, je suis obligé de déclencher la notification avec ou sans connectivité réseau, ce qui semble éliminer Firebase JobDispatcher en option. Cette question a également indiqué qu'une fois que le téléphone quitte le mode somnolence, l'utilisateur reçoit la notification, mais que nous ne recevons jamais la notification, ils semblent perdus faute d'un meilleur terme.

J'ai ajouté l'autorisation de verrouillage de réveil à mon AndroidManifest.xml:

<uses-permission Android:name="Android.permission.WAKE_LOCK" />

Voici comment mon récepteur est enregistré dans AndroidManifest.xml

<receiver Android:name="com.myapp.receiver.AlarmReceiver">
    </receiver>

Voici ma mise en œuvre actuelle:

Intention en attente de traitement des notifications

Intent i = new Intent(context, ScheduleAllReceiver.class);
    PendingIntent scheduleAllPendingIntent = PendingIntent.getBroadcast(context, SCHEDULER_DAILY_ALL, i, PendingIntent.FLAG_UPDATE_CURRENT);

J'appelle ensuite une méthode "createAlarm" comme suit

createAlarm(context, scheduleAllPendingIntent, calendar.getTimeInMillis());

Création des alarmes

public static void createAlarm(Context context, PendingIntent pendingIntent, long timeinMilli) {
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    if(alarmManager != null) {

        if (Build.VERSION.SDK_INT >= 23) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeinMilli, pendingIntent);
        } else {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeinMilli, pendingIntent);
        }
    }
}
7
pat8719

Ceci est la bibliothèque qui a fonctionné pour moi.

1
RSauther

Oui, tu as raison. Maintenant, Google recommande d'utiliser WorkManager au lieu de AlarmManager. AlarmManager a de nombreuses limites dans son travail. Vous pouvez trouver plus d'informations ici (mode somnolence)
De plus, le téléphone pixel a un bug avec alarmManager

0
Alexander