web-dev-qa-db-fra.com

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

J'ai cette méthode dans l'une de mes Android Activités:

@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);
}

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

52
ingh.am

Le bouton Accueil est un bouton très dangereux à remplacer et, à cause de cela, Android ne vous laissera pas modifier son comportement de la même manière que vous utilisez le bouton RETOUR.

Jetez un oeil à ceci discussion.

Vous remarquerez que le bouton d'accueil semble être implémenté en tant qu'invocation d'intention. Vous devrez donc éventuellement ajouter une catégorie d'intention à votre activité. Ensuite, chaque fois que l'utilisateur rentre chez lui, votre application apparaîtra en option. Vous devriez envisager 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 méfierais de surcharger le bouton ACCUEIL, mais c’est possible (par discussion dans le fil précédent).

32
Nick Campion

Il m'a fallu presque un mois pour passer à travers cela. Tout à l'heure, j'ai résolu ce problème. Dans votre activité onPause (), vous devez inclure la condition suivante si:

    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 par exemple, l'écran s'éteint.

J'espère que ça aide!

22
Raphael

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 appuyer sur la touche retour ou à la maison, il pourrait ne jamais être en mesure de quitter l'application). Le bouton Accueil est considéré comme la "zone sécurisée" de l'utilisateur et lancera toujours l'application d'accueil configurée de l'utilisateur.

La seule exception à cette règle concerne toute application configurée pour le remplacement du domicile. Ce qui signifie qu'il a déclaré ce qui suit dans son fichier AndroidManifest.xml pour l'activité concernée:

<intent-filter>
   <action Android:name="Android.intent.action.MAIN" />
   <category Android:name="Android.intent.category.HOME" />
   <category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>

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

12
Lior

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
    }
7
Aderito Brinca

tilisation 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 String SYSTEM_DIALOG_REASON_KEY = "reason";
    final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
            String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
            if (reason != null) {
                if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                    // home is Pressed
                }
            }
        }
    }
}
3
d0ye

KeyEvent.KEYCODE_HOME ne peut PAS être intercepté.

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

(Edit): Je viens de voir Nicks répondre, ce qui est parfaitement complet;)

3
Oliver

J'ai une solution simple sur la manipulation du bouton d'accueil. Voici mon code, ça 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é, placez un booléen dans l'activité, lorsque le changement d'activité se produit (événement startactivity), définissez la variable et, dans l'événement onpause, vérifiez cette variable.

2
barisatbas

utilisez la méthode onPause() pour faire ce que vous voulez faire avec le bouton home.

2
Jawad Amjad

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

voici ce que j’ai implémenté comme une solution de type "bidouille";

conserver l'état de l'application sur SharedPreferences à l'aide d'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'état de l'application dans chaque boucle, ignore l'action

SI appactive = false

cela fonctionne bien pour moi, au moins ne plus vider la batterie, espérons que cela aide ...

1
guleryuz