Android: revenir à l'activité précédente


525

Je veux faire quelque chose de simple sur l'application Android. Comment est-il possible de revenir à une activité précédente.

De quel code ai-je besoin pour revenir à l'activité précédente


5
Gardez une trace de la dernière activité ouverte
Vuk

54
Vous venez d'appeler simplement finish (); Santé
Nguyen Minh Binh

super.finish (); si vous l'appelez depuis l'intérieur de l'activité!
happyhardik

5
Une question ici: si Android a détruit l'activité précédente en raison de moins de mémoire ou d'autres problèmes, alors cette activité ne serait plus là dans le backstack et alors que se passe-t-il?
Sunny

@Sunny Je suppose que le garbage collector commence par l'activité la plus élevée de la pile. Donc, s'il n'y a pas d'activité précédente, il n'y aura pas non plus d'activité en cours. Mais je suppose simplement que parce que ce comportement aurait plus de sens que de libérer de la mémoire dans une pile sans ordre particulier. Corrigez mon commentaire, si quelqu'un le sait exactement.
Sedat Kilinc

Réponses:


486

Les activités Android sont stockées dans la pile d'activités. Revenir à une activité précédente pourrait signifier deux choses.

  1. Vous avez ouvert la nouvelle activité à partir d'une autre activité avec startActivityForResult . Dans ce cas, vous pouvez simplement appeler la fonction finishActivity () à partir de votre code et cela vous ramènera à l'activité précédente.

  2. Gardez une trace de la pile d'activités. Chaque fois que vous démarrez une nouvelle activité avec une intention, vous pouvez spécifier un indicateur d'intention comme FLAG_ACTIVITY_REORDER_TO_FRONTou FLAG_ACTIVITY_PREVIOUS_IS_TOP. Vous pouvez l'utiliser pour basculer entre les activités de votre application. Je ne les ai cependant pas beaucoup utilisés. Jetez un œil aux drapeaux ici: http://developer.android.com/reference/android/content/Intent.html

Comme mentionné dans les commentaires, si l'activité est ouverte avec startActivity()alors on peut la fermer avec finish(). Si vous souhaitez utiliser le bouton Haut, vous pouvez attraper cela en onOptionsSelected(MenuItem item)vérifiant l'ID de l'article android.R.id.homecontrairement R.id.homeà ce qui est mentionné dans les commentaires.


237
Ou si vous avez ouvert une activité avec startActivity (), vous pouvez fermer avec finish () (vous n'avez pas besoin de passer de paramètre)
neworld

3
Pouvez-vous clarifier où et comment vous utilisez la finition (), donc lorsque l'utilisateur appuie sur le bouton haut, il le ramène à l'activité précédente
RicNjesh

4
@RicNjesh Dans votre méthode onOptionsItemSelected si le menuitem cliqué a l'id R.id.home alors appelez finish (). Il fermera l'activité en cours et vous ramènera à l'activité qui l'a démarrée avec startActivity ()
Anders Ullnæss

Je demande à l'utilisateur de passer par de nombreuses activités l'une après l'autre à travers des intentions. Dois-je faire quoi que ce soit pour m'assurer que l'application ne plante pas avec trop d'activités sur la pile? Merci!
Ruchir Baronia

1
êtes-vous sûr que l'activité 1 ne mourra pas à un moment donné avant même d'avoir terminé l'activité 2?
user924

225

Essayez Activity#finish(). C'est plus ou moins ce que fait le bouton de retour par défaut.


1
Pourquoi #? ou c'est un point?
Nabin

8
Je crois qu'il voulait direthis.finish();
Jens Bodal

69
Le #est un indicateur qui finish()est une méthode non statique de la classe Activity. Ce n'est pas du Java valide, mais cela aide à expliquer comment utiliser la méthode.
Bryan Herbst, le

2
@ Tanis.7x Existe-t-il un indicateur pour les méthodes statiques?
Benten

8
@Benten ce serait ., c'est-à-dire:Activity.someStaticMethod()
JonnyReeves

81

Il suffit d'écrire à la fin du clic () . Cela vous amènera à l'activité précédente.


1
Bien que onBackPressed () fonctionne également, je pense que cette solution est meilleure pour penser à quitter une activité dont vous avez besoin juste un peu .. par exemple le scanner OCR dans mon cas. Merci!
Gene Bo

Cela satisfait mon besoin .. Merci.
Roon13

68

Juste ça

super.onBackPressed();

2
Cet appel ne fait que terminer l'activité en cours, il affichera donc la dernière activité visible. Cependant, s'il n'y a pas d'activité précédente ou s'il est détruit entre-temps, l'application peut se fermer.
r1k0

22
C'est hackish. Vous n'êtes pas censé l'appeler directement. C'est l'une des méthodes du cycle de vie et devrait être appelée par le système Android.
Dheeraj Bhaskar

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Cela vous amènera à une activité précédente en gardant sa pile et en supprimant toutes les activités qui la suivent de la pile.

Par exemple, si la pile était A-> B-> C-> D et que vous démarrez B avec cet indicateur, la pile sera A-> B


C'est ce qui fonctionne de mon côté. J'adorerais savoir ce qui empêcherait finish () de ne pas fonctionner.
Relm

20

Voulez-vous prendre le contrôle du comportement du bouton de retour? Vous pouvez remplacer le bouton de retour (pour accéder à une activité spécifique) via l'une des deux méthodes.

Pour Android 1.6 et inférieur:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

Ou si vous ne supportez qu'Android 2.0 ou supérieur:

@Override
public void onBackPressed() {
    // do something on back.
    return;
}

Pour plus de détails: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html


19

Appelez simplement ces méthodes pour terminer l'activité en cours ou pour revenir en arrière par onBackPressed

finish();

OU

onBackPressed();

Je demande à l'utilisateur de passer par de nombreuses activités l'une après l'autre à travers des intentions. Dois-je faire quoi que ce soit pour m'assurer que l'application ne plante pas avec trop d'activités sur la pile? Merci!
Ruchir Baronia

13

si vous voulez aller juste pour aller à l'activité précédente, utilisez

finish();

OU

onBackPressed();

si vous voulez passer à la deuxième activité ou en dessous, utilisez ce qui suit:

intent = new Intent(MyFourthActivity.this , MySecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//Bundle is optional
Bundle bundle = new Bundle();
bundle.putString("MyValue1", val1);
intent.putExtras(bundle);
//end Bundle
startActivity(intent);

1
J'ai trouvé que finish () et onBackPressed () fonctionnent tous les deux, mais, dans mon application au moins, finish () est très lent et onBackPressed () est beaucoup plus rapide. Curieuse.
scrayne

Je demande à l'utilisateur de passer par de nombreuses activités l'une après l'autre à travers des intentions. Dois-je faire quoi que ce soit pour m'assurer que l'application ne plante pas avec trop d'activités sur la pile? Merci!
Ruchir Baronia

13

Ajoutez ceci dans votre méthode onCLick (), cela reviendra à votre activité précédente

terminer();

ou Vous pouvez l'utiliser. Cela a parfaitement fonctionné pour moi

 @Override
  public boolean onOptionsItemSelected(MenuItem item) {
  int id = item.getItemId();

      if ( id == android.R.id.home ) {
         finish();
         return true;
       }

  return super.onOptionsItemSelected(item);
  }

11

Si vous avez correctement configuré le fichier AndroidManifest.xml avec l'activité parent, vous pouvez utiliser:

NavUtils.navigateUpFromSameTask(this);

Où c'est votre activité enfant.


8

Essayez ceci est agir comme vous devez appuyer sur le bouton de retour

finish();
onBackPressed();


7

J'ai le même problème et

finish();  OR super.onBackPressed();

a bien fonctionné pour moi, les deux ont travaillé de la même façon, mais pas de chance avec return


6

Commencez la deuxième activité en utilisant l'intention (soit utiliser startActivityou startActivityForResultselon vos besoins). Maintenant, lorsque l'utilisateur appuie sur le bouton de retour, l'activité actuelle en haut sera fermée et la précédente sera affichée.

Supposons maintenant que vous ayez deux activités, l'une pour sélectionner certains paramètres pour l'utilisateur, comme la langue, le pays, etc., et après l'avoir sélectionné, l'utilisateur clique sur le bouton Suivant pour accéder au formulaire de connexion (par exemple). Maintenant, si la connexion échoue, alors l'utilisateur sera sur l'activité de connexion, que se passe-t-il si la connexion réussit?

Si la connexion réussit, vous devez alors démarrer une autre activité. Cela signifie qu'une troisième activité sera lancée et qu'il y a toujours deux activités en cours. Dans ce cas, il sera bon de l'utiliser startActivityForResult. Une fois la connexion réussie, renvoyez les données OK à la première activité et fermez l'activité de connexion. Maintenant, lorsque les données sont reçues, démarrez la troisième activité et fermez la première activité en utilisant terminer.


Je demande à l'utilisateur de passer par de nombreuses activités l'une après l'autre à travers des intentions. Dois-je faire quoi que ce soit pour m'assurer que l'application ne plante pas avec trop d'activités sur la pile? Merci!
Ruchir Baronia

5

Vous pouvez essayer ceci:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

4

Toutes les nouvelles activités / intentions par défaut ont un comportement précédent / précédent, sauf si vous avez codé un finish()sur l'activité appelante.


4
@Override
public void onBackPressed() {
    super.onBackPressed();
}

et si vous voulez cliquer sur le bouton revenir en arrière, simplement mettre

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});

3
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
      int id = item.getItemId();

      if ( id == android.R.id.home ) {
          finish();
          return true;
      }

      return super.onOptionsItemSelected(item);
 }

Essayez cela, il fonctionne aussi bien sur le bouton de retour de la barre d' outils que sur le bouton de retour du matériel .


2

Je suggère le NavUtils.navigateUpFromSameTask (), c'est facile et très simple, vous pouvez l'apprendre du développeur google. J'aimerais pouvoir vous aider!


1

Il y a peu de cas pour revenir à votre activité précédente:

Cas 1: si vous voulez ramener le résultat à votre activité précédente, alors ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivityForResult(intent,2);

FBHelperActivity.java

 Intent returnIntent = new Intent();
 setResult(RESULT_OK, returnIntent);
 finish();

Cas 2: Activité A -> FBHelperActivity ----> Activité A

ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivity(intent);

FBHelperActivity.java

after getting of result call finish();
 By this way your second activity will finish and because 
 you did not call finish() in your first activity then
 automatic first activity is in back ground, will visible.

1

Tout d'abord, chose que vous devez garder à l'esprit, si vous souhaitez revenir à une activité précédente. N'appelez ensuite pas la méthode finish () lorsque vous passez à une autre activité en utilisant Intent.

Après cela, vous avez deux façons de revenir de l'activité en cours à l'activité précédente:

Appelez simplement: finish()sous l'écouteur de clic de bouton, ou remplacez la méthode suivante pour sauvegarder en utilisant le bouton de retour du système:

@Override
public void onBackPressed() {
    super.onBackPressed();
}

0

Outre toutes les réponses mentionnées, leur est toujours une façon alternative de le faire, disons que vous avez deux classes, la classe A et la classe B.

Classe A, vous avez sélectionné certaines activités comme la case à cocher, imprimé certaines données et l'intention de la classe B. Classe B, vous souhaitez transmettre plusieurs valeurs à la classe A et conserver l'état précédent de la classe A, vous pouvez utiliser, essayez cette alternative ou téléchargez le code source pour le démontrer

http://whats-online.info/science-and-tutorials/125/Android-maintain-the-previous-state-of-activity-on-intent/

ou

http://developer.android.com/reference/android/content/Intent.html


0

Essayez-le, première activité

Intent mainIntent = new Intent(Activity1.this, Activity2.class);
this.startActivity(mainIntent);

Dans votre deuxième activité

@Override
public void onBackPressed() {
    this.finish();
}

continue de planter, les données ne persistent pas je pense
john ktejik
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.