Lorsque mon application démarre, je souhaite qu'elle vérifie si une alarme particulière (enregistrée via AlarmManager) est déjà définie et en cours d'exécution. Les résultats de Google semblent indiquer qu'il n'y a aucun moyen de le faire. Est-ce toujours correct? Je dois effectuer cette vérification afin d'avertir l'utilisateur avant toute action pour créer une nouvelle alarme.
231
Réponses:
Suite au commentaire publié, voici la solution détaillée. Supposons que vous ayez enregistré une alarme répétitive avec une intention en attente comme celle-ci:
La façon dont vous vérifieriez s'il est actif est la suivante:
La clé ici est celle
FLAG_NO_CREATE
qui, comme décrit dans le javadoc:if the described PendingIntent **does not** already exists, then simply return null
(au lieu d'en créer un nouveau)la source
alarmManager.cancel(pendingIntent)
etpendingIntent.cancel()
pour que cette solution retourne false.Pour ceux qui pourraient en avoir besoin, voici une réponse.
Utilisation
adb shell dumpsys alarm
Vous pouvez savoir que l'alarme a été réglée et quand vont-ils déclencher une alarme et un intervalle. Aussi combien de fois cette alarme a été invoquée.
la source
adb shell dumpsys alarm | grep <e.g. package name of your app>
Fonctionne également sur les nouveaux systèmes Windows (j'utilise Win10)Exemple de travail avec récepteur (la première réponse était juste avec action).
Il convient de mentionner:
En bref, votre PendingIntent devrait avoir les mêmes fonctionnalités (structure d'opération et d'intention) pour en prendre le contrôle.
la source
Notez cette citation des documents pour la méthode définie de Alarm Manager:
Si vous savez que vous voulez régler l'alarme, vous n'avez pas besoin de vous soucier de vérifier si elle existe déjà ou non. Il suffit de le créer à chaque démarrage de votre application. Vous remplacerez toutes les alarmes passées par les mêmes
Intent
.Vous avez besoin d'une approche différente si vous essayez de calculer le temps restant sur une alarme créée précédemment, ou si vous avez vraiment besoin de savoir si une telle alarme existe même. Pour répondre à ces questions, pensez à enregistrer les données pref partagées au moment où vous créez l'alarme. Vous pouvez stocker l'horodatage de l'horloge au moment où l'alarme a été définie, l'heure à laquelle vous vous attendez à ce que l'alarme se déclenche et la période de répétition (si vous configurez une alarme répétitive).
la source
J'ai 2 alarmes. J'utilise l'intention avec des extras au lieu de l'action pour identifier les événements:
le fait est qu'avec les extras diff, l'intention (et l'alarme) ne sera pas unique. Donc pour pouvoir identifier quelle alarme est active ou non, j'ai dû définir des diff
requestCode
-s:et voici comment l'alarme a été créée:
la source
PendingIntent.getService
Je viens de trouver une autre solution, cela semble fonctionner pour moi
la source
Alors que presque tout le monde ici a donné la bonne réponse, aucun organisme n'a expliqué sur quelle base fonctionnent les alarmes
Vous pouvez en fait en savoir plus sur
AlarmManager
son fonctionnement ici . Mais voici la réponse rapideVous voyez
AlarmManager
essentiellement des horaires unPendingIntent
à un moment donné dans le futur. Donc, pour annuler l'alarme programmée, vous devez annuler laPendingIntent
.Notez toujours deux choses lors de la création du
PendingIntent
PendingIntent
Maintenant, pour vérifier si l'alarme est déjà programmée ou pour annuler l'alarme, il vous suffit d'y accéder
PendingIntent
. Cela peut être fait si vous utilisez le même code de demande et utilisezFLAG_NO_CREATE
comme indiqué ci-dessousAvec
FLAG_NO_CREATE
il reviendranull
si lePendingIntent
n'existe pas déjà. S'il existe déjà, il renvoie la référence à l'existantPendingIntent
la source
J'ai fait un simple script bash (stupide ou pas), qui extrait les longs du shell adb, les convertit en horodatages et les affiche en rouge.
essayez-le;)
la source
FLAG_NO_CREATE ne crée pas d'intention en attente de sorte qu'il donne la valeur booléenne false.
Après que AlarmManager vérifie la valeur de Pending Intent, il donne la valeur true car AlarmManager met à jour le drapeau de Pending Intent.
la source
Im sous l'impression qu'il n'y a aucun moyen de le faire, ce serait bien cependant.
Vous pouvez obtenir un résultat similaire en enregistrant un Alarm_last_set_time quelque part et en ayant un truc On_boot_starter BroadcastReciever: BOOT_COMPLETED.
la source