Méthode d’appel lorsque le bouton d’accueil est enfoncé

J’ai cette méthode dans l’une de mes activités Android:

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { Log.d("Test", "Back button pressed!"); } else if(keyCode == KeyEvent.KEYCODE_HOME) { Log.d("Test", "Home button pressed!"); } return super.onKeyDown(keyCode, event); } 

Mais même si le KEYCODE_HOME est valide, la méthode de journalisation ne se déclenche jamais. Cela fonctionne pour le bouton de retour si. Est-ce que quelqu’un sait pourquoi c’est et comment cela fonctionne?

Le bouton Home (Accueil) est un bouton très dangereux à remplacer. De ce fait, Android ne vous laissera pas ignorer son comportement de la même façon que vous le faites avec le bouton BACK.

Jetez un oeil à cette discussion.

Vous remarquerez que le bouton d’accueil semble être implémenté en tant qu’invocation d’intention, vous devrez donc append une catégorie d’intention à votre activité. Ensuite, chaque fois que l’utilisateur accède à la page d’accueil, votre application apparaîtra en option. Vous devriez considérer ce que vous cherchez à accomplir avec le bouton d’accueil. Si ce n’est pas pour remplacer l’écran d’accueil par défaut de l’appareil, je me garderais de surcharger le bouton HOME, mais c’est possible (selon la discussion ci-dessus).

Il m’a fallu presque un mois pour y arriver. Tout à l’heure, j’ai résolu ce problème. Dans la onPause de votre activité (), vous devez inclure les éléments suivants si condition:

  if (this.isFinishing()){ //Insert your finishing code here } 

La fonction isFinishing () renvoie un booléen. Vrai si votre application est en train de se fermer, Faux si votre application est toujours en cours d’exécution mais l’écran s’éteint par exemple.

J’espère que cela aide!

Le bouton HOME ne peut pas être intercepté par les applications. Ceci est un comportement de conception dans Android. La raison est d’empêcher les applications malveillantes de prendre le contrôle de votre téléphone (si l’utilisateur ne peut pas revenir en arrière ou rentrer chez lui, il risque de ne jamais pouvoir quitter l’application). Le bouton Accueil est considéré comme la “zone de sécurité” de l’utilisateur et lancera toujours l’application d’accueil configurée par l’utilisateur.

La seule exception à ce qui précède est toute application configurée comme remplacement à domicile. Ce qui signifie que les éléments suivants sont déclarés dans son fichier AndroidManifest.xml pour l’activité concernée:

      

Lorsque vous appuyez sur le bouton d’accueil, l’activité onNewIntent l’application d’accueil actuelle sera appelée.

J’ai trouvé que lorsque j’appuie sur le bouton HOME, la méthode onStop () est appelée. Vous pouvez utiliser le code suivant pour le surveiller:

 @Override protected void onStop() { super.onStop(); Log.d(tag, "MYonStop is called"); // insert here your instructions } 

J’ai une solution simple pour gérer la pression sur un bouton à la maison. Voici mon code, cela peut être utile:

 public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; startActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } 

En résumé, mettez un booléen dans l’activité, lorsque le changement d’activité se produit (événement de début d’activité), définissez la variable et dans l’événement onpause, cochez cette variable.

Utilisez la méthode onPause() pour faire ce que vous voulez faire sur le bouton d’accueil.

KeyEvent.KEYCODE_HOME ne peut PAS être intercepté.

Ce serait très grave si cela était possible.

(Edit) : Je vois juste la réponse de Nicks, qui est parfaitement complète;)

J’ai aussi eu du mal avec le bouton HOME pendant un certain temps. Je voulais arrêter / ignorer un service d’arrière-plan (qui interroge l’emplacement) lorsque l’utilisateur clique sur le bouton HOME.

voici ce que j’ai implémenté en tant que solution “hack-like”;

conserver l’état de l’application sur SharedPreferences en utilisant une valeur booléenne

sur chaque activité

onResume () -> set appactive = true

onPause () -> set appactive = false

et le service d’arrière-plan vérifie l’appstate dans chaque boucle, ignore l’action

SI appactive = false

ça marche bien pour moi, au moins ne plus vider la batterie, j’espère que ça aide …

Utilisation de BroadcastReceiver

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // something // for home listen InnerRecevier innerReceiver = new InnerRecevier(); IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); registerReceiver(innerReceiver, intentFilter); } // for home listen class InnerRecevier extends BroadcastReceiver { final Ssortingng SYSTEM_DIALOG_REASON_KEY = "reason"; final Ssortingng SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; @Override public void onReceive(Context context, Intent intent) { Ssortingng action = intent.getAction(); if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) { Ssortingng reason = intent.getSsortingngExtra(SYSTEM_DIALOG_REASON_KEY); if (reason != null) { if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { // home is Pressed } } } } }