Android, onReceive dans BroadCastReceiver s'appelle plusieurs fois

J'ai une question sur AlarmManager et BroadcastReceiver !

Je souhaite utiliser AlarmManager pour mettre à jour certaines données toutes les 15 minutes (ce n'est pas le cas dans le code car j'essaie toujours d'améliorer la fonctionnalité) mais quelque chose que je ne comprends pas vraiment s'est produit.

  • Pourquoi l'application meurt-t-elle au hasard?
  • Comment gérer l'événement de clic dans Listview dans Android?
  • Projet basé à Cordoue sur le tissu
  • Quel est le meilleur langage pour la programmation graphique en temps réel sur Android?
  • Android: Ajout du texte de l'élément secondaire ListView
  • Dessin de bitmap tourné avec anti alias
  • Chaque fois que la méthode onReceive est appelée par la minuterie, elle s'appelle 3-5 fois rapidement, le message LogCat est écrit 3-5 fois. Est-ce que quelque chose ne va pas avec mon code?

    Code:

    Méthode dans la classe MainActivity :

     private void setCloseByChecker() { AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar cal=Calendar.getInstance(); Intent intent = new Intent(this, CloseByReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast( this.getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + 15000, 15000, pendingIntent); } 

    Et la classe BroadcastReceiver :

     @Override public void onReceive(Context context, Intent intent) { Log.i("hello","hello"); } 

    2 Solutions collect form web for “Android, onReceive dans BroadCastReceiver s'appelle plusieurs fois”

    Les annule-t-il de quelque façon? Rappelez-vous que chaque fois que vous appelez setRepeating() avec différents ID (le deuxième paramètre), vous répéterez votre alarme.

    Essayez d'annuler toutes vos alarmes en appelant alarmManager.cancel(pendingIntent) .

    À partir de la documentation.

    If the stated trigger time is in the past, the alarm will be triggered immediately, with an alarm count depending on how far in the past the trigger time is relative to the repeat interval.

    À des fins de test, modifiez le nombre public void setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) du public void setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) set intervaloMillis à 5 minutes ou quelque chose, puis répétez l'opération. Si vous recevez encore plus d'une diffusion, c'est autre chose.

    En outre, à partir de la documentation:

    This alarm continues repeating until explicitly removed with cancel(PendingIntent). Ce qui signifie que vous devriez annuler l'intention en attente chaque fois qu'il remplit ce qu'il doit faire, sinon vous pouvez utiliser le rappel pour configurer une opération jusqu'à ce que vous l'achetiez. Pour vérifier cela, exécutez votre code pendant quelques minutes, puis vérifiez si le montant de BroadCast a augmenté. Si c'est le cas, vous commencez une nouvelle alarme avant que la dernière ne soit terminée. Ensuite, à partir de la même documentation:

    If your application wants to allow the delivery times to drift in order to guarantee that at least a certain time interval always elapses between alarms, then the approach to take is to use one-time alarms, scheduling the next one yourself when handling each alarm delivery.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.