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

Troj
la source
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.

Abhinav
la source
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.

adamp
la source
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.

Umer Rana
la source
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();
AtanuCSE
la source
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

Dmitry Ryadnenko
la source
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

Bryan Denny
la source
19

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

finish();

OU

onBackPressed();
Akshay Paliwal
la source
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);
Ram G.
la source
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);
  }
Darshuu
la source
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.

Thomas Decaux
la source
8

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

finish();
onBackPressed();
Muhammed Fasil
la source
7

Vous pouvez explicitement appeler onBackPressedest le moyen le plus simple.
Reportez- vous à l'activité précédente pour plus de détails.

Labeeb Panampullan
la source
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

Sans nom
la source
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.

Altaf Hussain
la source
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);
}
nikki
la source
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.

ameyx
la source
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();
    }
});
Md Hussain
la source
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 .

Puni
la source
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!

wuxue
la source
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.
Gyan Swaroop Awasthi
la source
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();
}
Monir Zzaman
la source
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

Daniel Nyamasyo
la source
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();
}
byteC0de
la source
continue de planter, les données ne persistent pas je pense
john ktejik