1

J'essaie de détecter si le bouton d'alimentation est enfoncé trois fois en moins de 4 secondes. Le code ci-dessous ne fonctionne pas.Écran Android Manipulation et désactivation à l'aide du bouton d'alimentation

public class PowerButtonReceiver extends BroadcastReceiver{ 

    static int count = 0; 
    long initialTime,finishTime; 

    @Override 
    public void onReceive(final Context context, Intent intent) { 

     Log.v("onReceive", "Power button is pressed."); 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      if (count == 0){ 
       initialTime = System.currentTimeMillis(); 
      } 
      count++; 
      if (count == 3){ 
       finishTime = System.currentTimeMillis(); 

       if (finishTime - initialTime <= 4000){ 
        Toast.makeText(context, "POWER BUTTON CLICKED 3 TIMES", Toast.LENGTH_LONG).show(); 
        count = 0; 
       } 
      } 

     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 

      if (count == 0){ 
       initialTime = System.currentTimeMillis(); 
      } 
      count++; 
      if (count == 3){ 
       finishTime = System.currentTimeMillis(); 

       if (finishTime - initialTime <= 4000){ 
        Toast.makeText(context, "POWER BUTTON CLICKED 3 TIMES", Toast.LENGTH_LONG).show(); 
        count = 0; 
       } 
      } 
     } 
    } 
    } 

le code exécute sans erreur et il ne montre pas de pain grillé

+0

déplacez votre code à intentservice, parce que brodcast appelé chaque fois que le bouton d'alimentation est pressé, donc votre temps initial , finishTime; réinitialise. utiliser sharedpreference à la place –

Répondre

1
  1. espère que vous enregistrez le récepteur dynamiquement.
    ACTION_SCREEN_OFF -

    Vous ne pouvez pas recevoir ce grâce à des composants déclarés dans les manifestes, ...

  2. Sauf le scénario suivant:

    if (finishTime - initialTime <= 4000){ Toast.makeText(context, "POWER BUTTON CLICKED 3 TIMES", Toast.LENGTH_LONG).show(); count = 0; }

rien d'autre re -affecte le compte à 0, donc si vous avez manqué un toast une fois ... le compteur ne se réinitialise pas à 0 en un seul passage et les événements suivants pour la condition <=4000 ne pas entrer dans la if, peut-être vous devriez réattribuer nombre à 0 si elle est supérieure à 3 (?)

  1. Qu'est-ce qui se passe si votre toast est apparu pendant le clic lorsque l'écran a été éteint - ne pense pas qu'il sera visible
  2. Devrait envisager d'utiliser || en remplaçant le if-else, fonctionne mieux si vous voulez seulement détecter les événements de bouton d'alimentation indépendamment de l'écran éteint ou allumé; comme:

    if (intent.getAction() est égal à (Intent.ACTION_SCREEN_OFF) || intent.getAction() equals (Intent.ACTION_SCREEN_ON)..) {...

si 1. n'est pas un problème, à l'heure actuelle votre code semble bien, c'est une combinaison de 2. et 3. 4. est juste une suggestion

+1

J'ai enregistré le récepteur dynamiquement et j'apprécie vos suggestions et mettra à jour le code. Merci. –