4 votes

BroadcastReceiver.onReceive est appelé deux fois pour user_present

J'ai un problème étrange ( ?), j'ai mis en place BroadcastReceiver pour USER_PRESENT Il fonctionne bien sur ma tablette mais sur mon Galaxy S, il se déclenche deux fois, quelqu'un peut-il m'éclairer ?

<receiver android:name="XYZBroadcastReceiver" >
   <intent-filter>                              
     <action android:name="android.intent.action.USER_PRESENT"/>                
  </intent-filter>              
</receiver>

J'ai une simple déclaration dans onReceive et elle est imprimée deux fois, dans le logcat je vois ce qui suit deux fois également :

11-23 17:36:35.603: INFO/Launcher(2632): ACTION_USER_PRESENT

0voto

Hicham Points 448

Il se peut que vous ayez installé l'application deux fois sur l'appareil (le récepteur de diffusion existe dans deux applications différentes).

Veuillez vérifier et désinstaller toutes vos applications de test. Ensuite, faites le test et voyez si la déclaration est imprimée dans le journal. Installez ensuite votre application et voyez ce qui se passe.

J'espère que cela pourra vous aider.

0voto

user1063108 Points 325

Ok, en l'absence de réponse à temps, j'ai dû aller de l'avant et j'ai trouvé une solution. La solution consiste à vérifier la base de données et à s'assurer qu'il y a une différence de temps entre deux événements d'au moins >=1.

Ainsi, chaque fois qu'un appel rapide est effectué (ce qui ne se produit que sur Galaxy pour l'instant), aucune action n'est entreprise pour le deuxième appel rapide.

0voto

Zeev G Points 560

J'ai adopté cette solution. J'ai créé un sémaphore simple. créer une classe publique

public class Global {

public static  Boolean IS_RUNNING= false;
}

et dans le BroadcastReceiver

public class ConnectivityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

    if (Global.IS_RUNNING){
        //allready running!!! do nothing
        return;
    }
    Global.sendToLog("run the update");

    ... do stuff, in the end set Global.IS_RUNNING=false;

}

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X