Intention d'alarme entrant dans une boucle infinie rapide

Duroska

J'essaie de coder un bloc de code qui doit se réveiller plusieurs fois par jour et notifier un serveur. J'essaie d'utiliser une intention d'alarme et un récepteur de diffusion, mais le récepteur se déclenche rapidement à l'infini et je n'arrive pas à l'arrêter.

Tout mon code se trouve dans un seul fichier. Le déroulement du processus est simple. Réveillez-vous au démarrage, vérifiez si nous devons communiquer, essayez de communiquer, sinon configurez l'une des deux conditions d'attente, activez l'alarme. Réveillez-vous en cas d'alarme, essayez de communiquer, réactivez l'alarme si nécessaire, sinon tuez-la.

Quand je construire et déployer ce apk sur mon appareil le flux de processus suivant se produit:
reboot
récepteur reçoit l' intention très bien démarrage
alarme se prévue
intention d'alarme se déclenche au bout de 80 secondes comme prévu
puis après les 80 secondes,
puis connectez-chat montre le récepteur de radiodiffusion étant déclenché très rapidement.
Plusieurs fois par seconde, comme s'il s'agissait d'un spam.

Je suis complètement déconcerté de savoir pourquoi il se comporte comme ça

private PendingIntent pendingIntent;
/**
 * Receive a signal, in our case, the device has booted up
 * @param context The Context in which the receiver is running.
 * @param intent  The Intent being received.
 */
@SuppressLint("UnsafeProtectedBroadcastReceiver")
@Override
public void onReceive(Context context, Intent intent) {
    Log.d("autostart", "broadcast received");
    if(intent.getAction()==null)return;
    Intent alarmIntent = new Intent(context, autostart.class);
    alarmIntent.setAction("device.activation.alarm");
    pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);//cancel flag seems to be ignored
    cancel(context);//cancel command seems to be ignored
    if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
        // Set the alarm here.
        Log.d("autostart","We have booted");
        RegisterActivation registerActivation = new RegisterActivation(context);
        if(registerActivation.AlreadyActivated())
            return;//no need
        if(registerActivation.ActivationPending()){
            //perform regular activation
            return;
        }
        if(registerActivation.canComplete()){
            boolean success = registerActivation.sendActivation();//talk to server
            if(success) {
                registerActivation.markCompleted();
                cancel(context);
            }
            else {
                registerActivation.markFileWaiting();
                startPending(context);
            }
            return;
        }
        if(registerActivation.shouldWait()){//if can complete fails, then shouldWait will immediately return true
            Log.d("autostart", "waiting");
            registerActivation.markFileSimWait();
            startWait(context);
            return;
        }
    }
    if(intent.getAction().equals("device.activation.alarm")){
        Log.d("autostart","alarm triggered");
        cancel(context);
        RegisterActivation registerActivation = new RegisterActivation(context);
        if(registerActivation.AlreadyActivated()){//for now always false
            cancel(context);
            return;
        }
        if(registerActivation.ActivationPending()){//for now always false
            //same as before
            return;
        }
        if(registerActivation.canComplete()){//glitch happens here
            if(registerActivation.sendActivation()){
                registerActivation.markCompleted();
                cancel(context);
            }else{
                registerActivation.markFileWaiting();
                startPending(context);//this immediatly triggers the broadcast recieve
            }
            return;
        }
        if(registerActivation.shouldWait()){
            registerActivation.markFileSimWait();
            startWait(context);
        }
    }
}

public void startPending(Context context) {
    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    int interval = 80000;//will later become 4 hours
    manager.set(AlarmManager.RTC_WAKEUP,interval,pendingIntent);
    Log.d("autostart", "alarm activated");
}

public void startWait(Context context) {//same function but different time interval
    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    int interval = 90000;// will later become 12 hours
    manager.set(AlarmManager.RTC_WAKEUP, interval, pendingIntent);
}

public void cancel(Context context) {
    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    manager.cancel(pendingIntent);
}
Duroska

merci à Mike M. https://stackoverflow.com/users/2850651/mike-m

Je marquerais votre commentaire comme réponse mais vous avez seulement commenté

Je suis parti de

manager.set(AlarmManager.RTC_WAKEUP,interval,pendingIntent);

à:

manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+interval, interval, pendingIntent);

J'ai dû ajouter l'intervalle au paramètre intervalMillis.
Et comme testé, la fonction manager.set (...) ne répond vraiment pas trop bien à ce que je veux qu'elle fasse donc je dois juste déclencher une annulation au début.

Merci encore Mike :)

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

ReactJs: rendu sur changement d'état entrant dans une boucle infinie

ReactJs hook useState entrant dans une boucle infinie

Manipulation rapide d'objets dans une boucle for

Envoyer l'intention de créer une alarme dans l'application par défaut

Pourquoi un optionnel dans l'énumération rapide provoque-t-il une boucle infinie?

IdentityServer entre dans une boucle infinie d'authentification

Systemd et Puma dans une boucle de démarrage infinie

Impossible de revenir d'une boucle infinie dans la routine

Comment arrêter un déclencheur dans une boucle infinie?

Créer une boucle infinie dans Unity avec délai

Création d'objets Java dans une boucle infinie

Python asyncio - démarrage de coroutines dans une boucle infinie

Impossible de détecter la cause d'une boucle infinie dans une 'boucle while' dans JS

Coincé dans une boucle infinie avec plusieurs conditions If à l'intérieur d'une boucle

Traverse JavaFileObjects entre dans une boucle infinie

Topshelf start bloqué dans une boucle infinie

Comment éviter une boucle infinie dans BFS?

React onChange coincé dans une boucle infinie

Coincé dans une boucle pas si infinie?

Comment interrompre une boucle infinie dans Prolog

Meta refresh entre dans une boucle infinie

Fonction Sleep() dans une boucle while infinie

Analyseur applicatif bloqué dans une boucle infinie

OnResume () provoquant une boucle infinie dans MainActivity

Python coincé dans une boucle While infinie ?

C - continuez à courir dans une boucle infinie

onDataChange bloqué dans une boucle infinie

Gérer une boucle infinie dans componentDidUpdate

Pris dans une boucle infinie potentielle

TOP liste

  1. 1

    comment afficher un bouton au-dessus d'un autre élément ?

  2. 2

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  3. 3

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

  4. 4

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  5. 5

    Conversion double en BigDecimal en Java

  6. 6

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Passer la taille d'un tableau 2D à une fonction ?

  9. 9

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  10. 10

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  11. 11

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  12. 12

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  13. 13

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  14. 14

    Exporter la table de l'arborescence vers CSV avec mise en forme

  15. 15

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  16. 16

    Créer un système Buzzer à l'aide de python

  17. 17

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  18. 18

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  19. 19

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  20. 20

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  21. 21

    Microsoft.WebApplication.targets

chaudétiquette

Archive