web-dev-qa-db-fra.com

Ignorer le bouton précédent pour qu'il agisse comme le bouton d'accueil

En appuyant sur le bouton de retour, j'aimerais que mon application passe à l'état arrêté plutôt qu'à l'état détruit.

Dans le Android docs , on lit:

... toutes les activités n’ont pas le comportement qu’elles sont détruites lorsqu’on appuie sur BACK. Lorsque l'utilisateur commence à jouer de la musique dans l'application Musique, puis appuie sur RETOUR, l'application annule le comportement normal du dos, empêchant ainsi la destruction de l'activité du lecteur, et continue de reproduire de la musique, même si son activité n'est plus visible.

Comment répliquer cette fonctionnalité dans ma propre application?

Je pense qu'il doit y avoir trois possibilités ...

  1. Capturez le bouton Précédent (comme ci-dessous), puis appelez la ou les méthodes appelées par le bouton principal.

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.d(this.getClass().getName(), "back button pressed");
        }
        return super.onKeyDown(keyCode, event);
    }
    
  2. Capturez la pression sur le bouton de retour, puis usurpez une pression sur le bouton d'accueil.

  3. Capturez le bouton précédent, appuyez sur, puis démarrez une activité de l'écran d'accueil, mettant effectivement l'activité de mon application à l'état arrêté.

Modifier: Je connais les services et j'en utilise un dans l'application à laquelle ce problème est lié. Cette question concerne spécifiquement le fait de mettre l'activité à l'état arrêté plutôt que l'état détruit en appuyant sur le bouton Précédent.

244
bdls

La plupart du temps, vous devez créer un Service pour effectuer quelque chose en arrière-plan, et votre visible Activity contrôle simplement ce Service. (Je suis sûr que le lecteur de musique fonctionne de la même manière, donc l'exemple dans la documentation semble un peu trompeur.) Si c'est le cas, votre Activity peut finish comme d'habitude et le Service sera toujours en cours d'exécution.

Une approche plus simple consiste à capturer le bouton Back pressé et appelé moveTaskToBack (true) comme suit:

// 2.0 and above
@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

// Before 2.0
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Je pense que l’option privilégiée devrait être que l’activité se termine normalement et puisse se recréer, par exemple. lire l'état actuel d'un service si nécessaire. Mais moveTaskToBack peut être utilisé comme une alternative rapide à l'occasion.

NOTE: comme l'a souligné Dave ci-dessous Android 2.0 a introduit une nouvelle méthode onBackPressed, et ces recommandations sur la façon de gérer le bouton Précédent.

333
Mirko N.

Utilisez le code suivant:

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}
44
Aniruddh Ambarkar

Si vous voulez attraper le bouton Précédent, jetez un œil à ce message sur le Android Blog des développeurs . Il décrit le moyen le plus simple de le faire dans Android 2.0 et le meilleur moyen de le faire pour une application fonctionnant sur les versions 1.x et 2.0.

Toutefois, si votre activité est arrêtée, elle peut toujours être supprimée en fonction de la mémoire disponible sur le périphérique. Si vous souhaitez qu'un processus s'exécute sans interface utilisateur, vous devez créer un Service. La documentation dit ce qui suit à propos des services:

Un service n'a pas d'interface utilisateur visuelle, mais s'exécute en arrière-plan pendant une durée indéterminée. Par exemple, un service peut jouer de la musique de fond lorsque l'utilisateur s'occupe d'autres tâches, ou peut extraire des données sur le réseau ou calculer quelque chose et fournir le résultat aux activités qui en ont besoin.

Cela semble approprié à vos besoins.

22
Dave Webb

essayez de remplacer void onBackPressed() défini dans la classe Android.app.Activity.

17
m-szalik

si cela peut aider quelqu'un d'autre, j'ai eu une activité avec 2 mises en page que j'ai activées et désactivées pour la visibilité, en essayant d'imiter une sorte de structure page1> page2. s'ils se trouvaient à la page 2 et appuyaient sur le bouton retour, je voulais qu'ils reviennent à la page 1; s'ils appuyaient sur le bouton retour à la page 1, ils devraient toujours fonctionner normalement. C'est assez basique mais ça marche

@Override
public void onBackPressed() {
// check if page 2 is open
    RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout);
    if(page2layout.getVisibility() == View.VISIBLE){
        togglePageLayout(); // my method to toggle the views
        return;
    }else{
        super.onBackPressed(); // allows standard use of backbutton for page 1
    }

}

j'espère que ça aide quelqu'un, bravo

13
craigk

Exemple de travail ..

Assurez-vous de ne pas appeler super.onBackPressed ();

@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}

De cette façon, votre bouton Précédent agit comme un bouton Accueil. Il ne termine pas votre activité mais placez-le en arrière-plan

La deuxième façon est d'appeler moveTaskToBack(true); dans onBackPressed et assurez-vous de retirer super.onBackPressed

9
Xar E Ahmer

Encore mieux, que diriez-vous de OnPause () :

Appelée dans le cadre du cycle de vie d'une activité lorsqu'une activité passe en arrière-plan, mais qu'elle n'a pas (encore) été supprimée. La contrepartie de onResume ().

Lorsque l'activité B est lancée devant l'activité A, ce rappel est invoqué sur A. B ne sera pas créé avant le retour de A onPause (). Assurez-vous donc deenter code here ne rien faire de long ici.

Ce rappel est principalement utilisé pour sauvegarder tout état persistant d'édition en cours et pour s'assurer que rien n'est perdu s'il n'y a pas assez de ressources pour démarrer la nouvelle activité sans d'abord tuer celle-ci.

C’est également un bon endroit pour arrêter des animations et d’autres choses qui consomment une quantité importante de CPU afin de passer aussi rapidement que possible à l’activité suivante ou de fermer des ressources à accès exclusif, telles que la caméra.

0
user1524315

Remplacer onBackPressed () après Android 2.0. Tel que

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}
0
SaiLiu