Remplacer le bouton de retour pour agir comme le bouton d'accueil

253

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 les documents Android, il indique:

... toutes les activités n'ont pas le comportement qu'elles sont détruites lorsque vous appuyez sur BACK. Lorsque l'utilisateur commence à jouer de la musique dans l'application Musique, puis appuie sur RETOUR, l'application remplace le comportement normal du dos, empêchant l'activité du lecteur d'être détruite et continue à jouer 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 de retour, appuyez sur (comme ci-dessous), puis appelez la ou les méthodes appelées par le bouton d'accueil.

    @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 Retour, puis usurpez une pression sur le bouton Accueil.

  3. Capturez la pression sur le bouton de retour, puis démarrez une activité de l'écran d'accueil, mettant effectivement l'activité de mon application à l'état arrêté.

Edit: 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é en état d'arrêt plutôt que l'état détruit en appuyant sur le bouton de retour.

bdls
la source
voir une réponse similaire stackoverflow.com/questions/5914040/…
Zar E Ahmer

Réponses:

338

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

Une approche plus simple consiste à capturer la Backpression sur le bouton et à appeler 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 préférée devrait être qu'une activité se termine normalement et puisse se recréer, par exemple en lisant l'état actuel d'un service si nécessaire. Mais moveTaskToBackpeut être utilisé comme une alternative rapide à l'occasion.

REMARQUE : comme l'a souligné Dave ci-dessous, Android 2.0 a introduit une nouvelle onBackPressedméthode et ces recommandations sur la façon de gérer le bouton Retour.

Mirko N.
la source
1
moveTaskToBack () semble fonctionner comme vous le souhaitez. Quels pourraient être les inconvénients de l'utilisation de cette méthode? Y a-t-il des cas où cela pourrait ne pas fonctionner comme prévu?
bdls
1
Après avoir lu son doc plus attentivement, je pense que cela devrait fonctionner correctement. (Au début, je pensais que cela s'appliquait à l'activité, mais en fait, cela indique la «tâche contenant cette activité».) Mais vous devez bien sûr la tester par vous-même. :)
Mirko N.
Merci Mirko, la méthode semble bien fonctionner. Cela pourrait être cool si vous accordez plus d'importance à votre montage au bas de votre réponse pour ceux qui regarderont cette question plus tard - car c'est le peu que je cherchais!
bdls
4
Veuillez lire android-developers.blogspot.com/2009/12/… pour la méthode recommandée pour gérer la touche retour.
hackbod
1
@bdls en théorie, votre activité en arrière-plan pourrait être détruite par le système s'il manque de ressources, donc pour être sûr, il devrait être capable de se recréer de toute façon. J'ai jeté un coup d'œil au code source de l'application Android Music et je ne vois aucune manipulation particulière du bouton de retour.
Mirko N.
46

Utilisez le code suivant:

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

Si vous voulez attraper le bouton Retour, jetez un œil à ce post sur le blog des développeurs Android . Il couvre la manière la plus simple de le faire dans Android 2.0 et la meilleure façon de le faire pour une application qui s'exécute sur 1.x et 2.0.

Cependant, si votre activité est arrêtée, elle peut quand même être supprimée en fonction de la disponibilité de la mémoire sur l'appareil. Si vous souhaitez qu'un processus s'exécute sans interface utilisateur, vous devez créer un fichier Service. La documentation dit ce qui suit sur les services:

Un service n'a pas d'interface utilisateur visuelle, mais s'exécute plutôt en arrière-plan pendant une période indéfinie. Par exemple, un service peut jouer de la musique de fond pendant que l'utilisateur s'occupe d'autres questions, ou il peut récupérer des données sur le réseau ou calculer quelque chose et fournir le résultat aux activités qui en ont besoin.

Ceux-ci semblent adaptés à vos besoins.

Dave Webb
la source
18

essayez de remplacer le vide onBackPressed()défini dans la classe android.app.Activity.

m-szalik
la source
1
depuis Android 2.0, c'est la bonne chose à remplacer. developer.android.com/sdk/android-2.0.html
jay
14

si cela aide quelqu'un d'autre, j'ai eu une activité avec 2 dispositions que j'ai activées et désactivées pour la visibilité, en essayant d'émuler une sorte de structure page1> page2. s'ils étaient à la page 2 et appuyaient sur le bouton de retour, je voulais qu'ils reviennent à la page 1, s'ils appuyaient sur le bouton de retour à la page 1, cela devrait 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

craigk
la source
10

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 Retour agit comme un bouton Accueil. Cela ne termine pas votre activité, mais prenez-la en arrière-plan

Deuxième façon est d'appeler moveTaskToBack(true);dans onBackPressedet assurez - vous d'enleversuper.onBackPressed

Zar E Ahmer
la source
0

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

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

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

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

C'est également un bon endroit pour faire des choses comme arrêter des animations et d'autres choses qui consomment une quantité notable de CPU afin de passer le plus rapidement possible à l'activité suivante, ou pour fermer des ressources qui sont un accès exclusif comme la caméra.

user1524315
la source
0

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

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

J'ai essayé toutes les solutions ci-dessus, mais aucune n'a fonctionné pour moi. Le code suivant m'a aidé lors de la tentative de retour à MainActivity d'une manière appelée onCreate:

Intent.FLAG_ACTIVITY_CLEAR_TOP est la clé.

  @Override
  public void onBackPressed() {
      Intent intent = new Intent(this, MainActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
  }
ubulon
la source
-1

J'ai utilisé @Mirko N. répondeur en utilisant le nouveau Custom EditText

 public class EditViewCustom extends EditText {

    Button cancelBtn;
    RelativeLayout titleReleLayout;
    public EditViewCustom(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public EditViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditViewCustom(Context context) {
        super(context);
    }

    public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){
        this.cancelBtn = cancelBtn;
        this.titleReleLayout = titleReleLayout;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            Log.d("KEYCODE_BACK","KEYCODE_BACK");
            cancelBtn.setVisibility(View.GONE);
            this.setFocusableInTouchMode(false);
            this.setFocusable(false);
            titleReleLayout.setVisibility(View.VISIBLE);

            return super.onKeyPreIme(keyCode, event);
          }

        return super.onKeyPreIme(keyCode, event);
    }

}

Ensuite, définissez les données de votre activité

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

Je vous remercie.

Sameer Z.
la source