105 votes

Détecter le bouton d'accueil, appuyez sur Android

Cela a été me rend fou pendant un certain temps maintenant.

Est-il possible de détecter de manière fiable si le bouton a été pressé dans une application android?

À défaut, est-il un bon moyen de dire ce qui a causé une activité à aller dans onPause? j'.e Peut-on détecter si elle a été causée par une nouvelle activité de lancement ou en appuyant sur la touche back/home.

Une suggestion que j'ai vu, c'est de remplacer onPause() et d'appeler isFinishing() mais cela renvoie false lorsque vous appuyez sur le bouton de la maison comme il le ferait si une nouvelle activité de départ est donc cela ne fait pas la distinction entre les deux.

Toute aide appréciée.

** Mise à jour** : Grâce à @android-faim pour ce lien: http://nisha113a5.blogspot.com/

Overiding la méthode suivante:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);           
}

Ensuite, l'événement se faire virer de la maison appuie sur un bouton:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {     

    if(keyCode == KeyEvent.KEYCODE_HOME)
    {
       //The Code Want to Perform. 
    }
});

Je ne sais pas si il y a des effets secondaires avec cette ligne:

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);   

Il semblerait donc que, contrairement à la croyance populaire, vous pouvez, en effet, être à l'écoute pour la touche d'accueil. Inquiétant, vous pouvez retourner false et ont la touche accueil ne rien faire.

Mise à jour: Comme prévu, il y a quelques effets secondaires avec ce - qu'il semble que les vidéos intégrées et google maps ne sont pas visibles avec ce mode activé.

Mise à jour: Soi-disant ce hack ne fonctionne plus comme d'Android 4.0 à partir de

28voto

Pratik Bhat Points 1928

Avez-vous traversé ça ?: détectez le bouton home

Je ne suis pas l'auteur, mais je l'ai découvert récemment

espérons que cela vous aide!

* EDIT * Cela ne fonctionne plus à partir de 4.0. Le dernier commentaire sur ce post: groups.google.com/forum/#!topic/android-developers/trRI99-HszQ

7voto

Jave Points 14930

Il est impossible de détecter et / ou d'intercepter le bouton HOME depuis une application Android. Ceci est intégré au système pour empêcher les applications malveillantes qui ne peuvent pas être quittées.

7voto

Blackhex Points 763

J'avais besoin pour démarrer/arrêter la musique de fond dans ma demande lors de la première activité s'ouvre et se ferme ou lors de toute activité est suspendue par le bouton accueil, puis reprise à partir du gestionnaire des tâches. Pur la lecture de l'arrêt/reprise en Activity.onPause() et Activity.onResume() interrompu la musique pendant un moment, donc j'ai dû écrire le code suivant:

@Override
public void onResume() {
  super.onResume();

  // start playback here (if not playing already)
}

@Override
public void onPause() {
  super.onPause();

  ActivityManager manager = (ActivityManager) this.getSystemService(Activity.ACTIVITY_SERVICE);
  List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(Integer.MAX_VALUE);
  boolean is_finishing = this.isFinishing();
  boolean is_last = false;
  boolean is_topmost = false;
  for (ActivityManager.RunningTaskInfo task : tasks) {
    if (task.topActivity.getPackageName().startsWith("cz.matelier.skolasmyku")) {
      is_last = task.numRunning == 1;
      is_topmost = task.topActivity.equals(this.getComponentName());
      break;
    }
  }

  if ((is_finishing && is_last) || (!is_finishing && is_topmost && !mIsStarting)) {
    mIsStarting = false;
    // stop playback here
  }
}

ce qui interrompt la lecture uniquement lorsque l'application (l'ensemble de ses activités) est fermé ou lorsque le bouton est pressé. Malheureusement je n'ai pas réussi à changer l'ordre des appels d' onPause() méthode de démarrage de l'activité et de l' onResume() de l'actvity lorsqu' Activity.startActivity() est appelé (ou de détecter en onPause() de l'activité est d'en lancer une autre activité autre façon) donc, ce cas doit être traité spécialement:

private boolean mIsStarting;

@Override
public void startActivity(Intent intent) {
  mIsStarting = true;
  super.startActivity(intent);
}

Un autre inconvénient est que cela exige GET_TASKS autorisation ajouté AndroidManifest.xml:

<uses-permission
  android:name="android.permission.GET_TASKS"/>

La modification de ce code qu'il ne réagit sur le bouton home de la presse est compliqué.

2voto

lalosoft Points 35

Essayez de créer un compteur pour chaque écran. Si l'utilisateur touche HOME, le compteur sera à zéro.

 public void onStart() {
  super.onStart();
  counter++;
}

public void onStop() {
  super.onStop();
  counter--;    
  if (counter == 0) {
      // Do..
  }
}
 

0voto

Andi Jay Points 1166

C'est une mauvaise idée de changer le comportement de la touche home. C'est pourquoi Google ne vous permet pas de remplacer la clé de base. Je ne voudrais pas jouer avec la clé de la maison en général. Vous devez donner à l'utilisateur un moyen de sortir de votre application si elle se répand dans les mauvaises herbes pour une raison quelconque.

J'imagine que n'importe quel travail aura des effets secondaires indésirables.

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