web-dev-qa-db-fra.com

Existe-t-il un moyen de vérifier si une alarme est déjà réglée?

Je suis coincé. Lorsque mon application démarre, je veux vérifier si une alarme est en cours que j'ai définie précédemment. Sinon, je veux le régler.

J'ai fait référence à cette solution . J'essaie de faire correspondre l'intention comme ceci:

Intent intent = new Intent();
        intent.setAction("com.vit.upload");
        PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE);

Mais ça ne marche pas. Quoi d'autre fonctionnerait?

31

Tout d'abord, un petit tutoriel sur la façon d'accéder aux alarmes précédemment créées:

Vous pouvez différencier les alarmes en créant chacune avec un identifiant unique tel que:

Intent intent = new Intent(this, AlarmReceiverActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,UNIQUE_ID_GOES_HERE, intent, 0);
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi);

Lorsque vous souhaitez accéder à cette alarme, vous devez créer le même PendingIntent avec le même identifiant unique. Par exemple, les éléments suivants accéderont uniquement à une alarme que vous avez créée avec l'ID PendingIntent 1234. Ensuite, elle annulera la précédente et la réinitialisera.

Intent intent = new Intent(this, AlarmReceiverActivity.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 1234, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi);

L'idée est simple. Gardez une trace des identifiants, puis utilisez-les pour accéder à leurs alarmes respectives. Si vous créez plusieurs alarmes avec le même identifiant, la plus récente annulera la précédente.

Pour en venir à votre problème principal, au lieu de vérifier si votre alarme est active à chaque lancement de votre application, il vous suffit de la réinitialiser dans la méthode onCreate() de votre activité. avec le même PendingIntent que j'ai décrit ci-dessus. Cela vous évite d'avoir à vérifier si l'alarme est déjà réglée ou non. Étant donné que votre objectif est de maintenir l'alarme en vie, cela ne fera pas de mal de remplacer celle précédemment définie à chaque lancement de l'application. Assurez-vous simplement d'utiliser le même identifiant pour créer votre PendingIntent.

N'oubliez pas de vérifier si l'heure de votre alarme est déjà passée ou non afin d'éviter d'essayer de régler une alarme pour un temps passé, ce qui la déclenchera immédiatement.

Prenons un autre cas: lorsque vous éteignez votre appareil, toutes vos alarmes seront annulées. Cela ne vous laisse pas d'autre choix que de les redéfinir au redémarrage. Pour ce faire, vous devrez utiliser un BroadcastReceiver .

Cette réponse vous aidera à le faire. Recréez simplement votre alarme dans la méthode onReceive () de votre BroadcastReceiver comme suggéré ci-dessus.

73
Erol
  • La première alarme ne fonctionnera pas lorsque vous redémarrez votre appareil Android.
  • Vous pouvez utiliser les préférences partagées booléennes pour vérifier si l'alarme est créée ou non.
  • L'intention en attente d'Android utilise l'ID unique

    int REQUEST_CODE=2344; // Unique ID  
    PendingIntent pIntent = PendingIntent.getBroadcast(context, REQUEST_CODE, intent, PendingIntent.FLAG_NO_CREATE);

vous devez utiliser la diffusion Boot Receiver lors du redémarrage du système, puis recréer alaram avec le même code de requête REQUEST_CODE=2344;

5
Munish Kapoor

Fondamentalement, d'après mon expérience, si vous utilisez la même intention et FLAG_UPDATE_CURRENT , vous pouvez être sûr que vous n'aurez pas deux alarmes définies pour la même intention. Vous pouvez également regarder de près FLAG_NO_CREATE qui est utilisé avec les fonctions get et renvoie null s'il existe déjà une intention en attente avec l'intention décrite.

N'oubliez pas non plus d'utiliser le même identifiant de demande pour l'intention en attente, car ils peuvent être distingués.

3
Jakub Szczygieł

Sur la base des informations ici , il ne semble pas y avoir d'appel que vous puissiez faire pour vérifier directement si une alarme existe ou non, mais ils proposent quelques solutions.

1
Eliezer