Comment fermer l'activité et revenir à l'activité précédente dans Android


144

J'ai une activité principale, que lorsque je clique sur un bouton, démarre une nouvelle activité, j'ai utilisé le code suivant pour le faire:

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

Le code ci-dessus a été exécuté à partir de l'activité principale.

Maintenant dans ma nouvelle activité qui est appelée par l'activité principale, j'ai un bouton de retour. Lorsque je clique sur ce bouton de retour, je souhaite que ma nouvelle activité se ferme et qu'elle revienne à l'activité principale d'origine.

J'ai essayé d'appeler super.finish()et juste finish() (à partir de la nouvelle activité) mais cela ferme alors toute ma demande (y compris mon activité principale).

Comment puis-je simplement fermer l'activité actuellement ciblée, puis revenir à l'activité principale?

ÉDITÉ

Le fait que le bouton de retour de mon téléphone ferme également toute mon application, me laisse penser que j'ai mal démarré la deuxième activité?


OK j'ai cherché,

J'ai créé une activité Paramètres qui utilise le même code manifeste et le même code pour démarrer l'activité.

Pour les paramètres Activité lorsque j'appuie sur le bouton retour, cela revient à l'activité principale.

Avec l'activité mentionnée ci-dessus dans la question principale, il quitte simplement toute mon application.

Donc le problème ne semble pas être avec le code pour terminer l'activité mais l'activité elle-même.


4
Vous n'avez même pas besoin d'un bouton de retour, laissez simplement l'utilisateur utiliser la touche de retour du téléphone et vous n'avez rien à faire.
Hoan Nguyen

Le bouton de retour du téléphone ferme l'application d'entrée, pas seulement mon activité secondaire. Je ne veux pas fermer l'activité principale.
Zapnologica

1
Le bouton «retour» ne devrait pas faire cela - pouvez-vous afficher plus de votre code?
peejaybee

En réponse à votre modification, l'activité secondaire semble bonne d'après ce que vous avez publié. Je pense que TGMCians a probablement la bonne réponse et vous étudiez votre manifeste.
peejaybee

regarde ça réponse je pense que cela vous aidera
Muhammad Helmi

Réponses:


202

Je pense que vous appelez la finish()méthode MainActivityavant de commencer SettingsActivity.

Le scénario que vous avez décrit se produira de deux manières:

SOIT

Vous avez mis android:noHistory = "true"à l' MainActivityintérieur AndroidManifest.xmlqui provoque MainActivityde finishautomatiquement en appuyant sur la touche retour.

OU

Avant de passer à votre 'SettingsActivity', vous avez appelé finish()votre MainActivity, qui le tue. Lorsque vous appuyez sur le bouton de retour, puisqu'aucune autre activité n'est prédéfinie dans la pile pour apparaître, il revient à l'écran principal.


Cela expliquerait pourquoi le bouton «Retour» du téléphone rejette également l'activité principale.
peejaybee

Lors du débogage, j'ai remarqué que l'exécution continue après finish (), il est donc conseillé de mettre un retour en plus.
jusqu'au

La troisième raison de cette réponse n'est-elle pas juste une répétition de la première?
Pang

60

Vous pouvez revenir à l'activité précédente en appelant simplement finish () dans l'activité dans laquelle vous vous trouvez. Notez que tout code après l'appel de finish () sera exécuté - vous pouvez simplement faire un retour après avoir appelé finish () pour résoudre ce problème.

Si vous souhaitez renvoyer les résultats à l'activité 1, vous avez besoin de:

startActivityForResults(myIntent, MY_REQUEST_CODE);

Dans votre activité appelée, vous pouvez ensuite obtenir l'intention à partir du paramètre onCreate () ou l'utiliser

getIntent();

Pour définir renvoyer un résultat à l'activité 1, puis à l'activité 2, faites

setResult(Activity.RESULT_OK, MyIntentToReturn);

Si vous n'avez pas l'intention de revenir, dites simplement

setResult(Activity.RESULT_OK);

Si l'activité a de mauvais résultats, vous pouvez utiliser Activity.RESULT_CANCELED (ceci est utilisé par défaut). Puis dans l'activité 1 tu fais

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

Pour terminer l'activité deux, utilisez les mêmes méthodes avec finish () que celles décrites ci-dessus avec vos résultats déjà définis.


1
"Notez que tout code après l'appel de finish () sera exécuté - vous pouvez simplement faire un retour après avoir appelé finish () pour résoudre ce problème" Je pense que 'fix' est un mauvais choix de mots ici. C'est plus comme si vous évitiez d'exécuter les lignes suivantes (pas de correction).
Lo-Tan

14

Lorsque vous cliquez sur votre bouton, vous pouvez le faire appeler:

super.onBackPressed();

12

si vous utilisez un fragment, vous devez utiliser

getActivity().onBackPressed();

si vous utilisez une seule activité, vous pouvez utiliser

finish();

7

essayez ce code au lieu de finish:

onBackPressed();


2
Fonctionne bien pour revenir de ActivityB à ActivityA. Pour les fragments et les activités uniques, vous pouvez utiliser la réponse de @Osama Ibrahim.
Eftekhari


4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});


4

Je pense que votre deuxième activité n'est probablement pas liée à votre activité principale en tant qu'activité pour enfants. Vérifiez votre AndroidManifest.xmlfichier et voyez si l' <activity>entrée de votre activité enfant comprend un android:parentActivityNameattribut. Ça devrait ressembler a quelque chose comme ca:

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...

1

Ne faites pas appel finish()à votre MainActivityalors cela élimine le besoin de remplacer votre onBackPressed()dans votre SecondActivitysauf si vous faites d'autres choses dans cette fonction. Si vous vous sentez le « besoin » de ce bouton arrière, vous pouvez simplement appeler finish()le SecondActivityet qui vous mènera à votre MainActivityaussi longtemps que vous ne l' avez pas appelé finish()à ce sujet


J'ai essayé cette voie, mais j'ai environ 10 écrans en séquence qui utilisent des PNG haute résolution. Le problème est que, vers l'écran 7, l'appareil n'a plus de mémoire à cause de toutes les activités de la pile arrière. J'ai décidé d'appeler finish sur chaque activité, et cela a résolu le problème en autorisant le ramassage des ordures, mais maintenant le comportement arrière doit être codé manuellement car la pile arrière est maintenant vide. Avez-vous rencontré ce problème ou connaissez-vous des mécanismes dans Android pour résoudre ce problème?
Lo-Tan

Que voulez-vous que le bouton de retour fasse? Revenez à ce qui était le précédent Activityou revenez toujours au MainActivity? De plus, si vous manquez de mémoire avec, Bitmapsvous devriez lire cette partie de Docs . Ça m'a aidé
codeMagic

@ Lo-Tan si vous souhaitez revenir à l'activité précédente, je pense que vous devez déterminer la gestion de la mémoire pour vos images et ne pas terminer les activités (peut-être avec le lien que j'ai fourni). Sinon, vous devrez recréer une nouvelle instance de l'activité et essayer de déterminer à laquelle revenir
codeMagic

Je voudrais que le bouton de retour passe simplement à l'écran précédent. Il s'agit d'une série d'écrans de didacticiel, en gros, et l'utilisateur peut avancer / reculer. Chaque écran est conçu et utilise beaucoup de png - parfois des png qui occupent la majeure partie de l'écran (pas seulement de petites vignettes), donc il consomme beaucoup de mémoire pour chaque écran.
Lo-Tan

@ Lo-Tan Je pense que vous voulez remplacer la méthode onBackPressed (), puis créer manuellement l'activité à laquelle vous voulez vous rendre. Vous pouvez ensuite mettre fin à celui sur lequel vous vous trouvez et démarrer le précédent.
Zapnologica

1

Je ne sais pas si cela est même utile ou non mais je me débattais avec le même problème et j'ai trouvé un moyen assez simple, avec seulement une variable booléenne globale et une action onResume (). Dans mon cas, mon activité C si vous cliquez sur un bouton spécifique, elle devrait déclencher la fin () de l'activité B!

Activity_A -> Activity_B -> Activity_C

Activity_A (ouvre normalement Activity_B)

Activity_B (sur un bouton, un clic ouvre Activity_C):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

Ainsi, chaque fois que je clique sur le bouton de l'activité C, il exécute la fonction «onResume ()» de l'activité B et retourne à l'activité A.


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

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

        return super.onOptionsItemSelected(item);
    }

Essayez ceci, cela fonctionne à la fois sur le bouton de retour de la barre d' outils et sur le bouton de retour matériel .


Celui-ci a fonctionné pour moi. J'avais aussi une MainActivity et une SettingsActivity avec android:parentActivityName=".MainActivity"pour le second. Ce code gère ce bouton Accueil / Précédent dans le toolbat et termine simplement l'activité en cours en revenant à la précédente dans la pile. Merci.
mortalis

1

Terminer ferme toute l'application, c'est quelque chose que je déteste dans le développement Android, pas finir c'est bien mais qu'ils ne suivent pas la syntaxe correcte qu'ils ont

startActivity(intent)

Pourquoi pas

closeActivity (intention)?


1
Cela répond-il à la question? Ou est-ce seulement une suggestion à essayer? Dans les deux cas, la diatribe est inutile et probablement pas la bienvenue sur SO
Gilles Gouaillardet

1

Nous avons rencontré une situation très similaire.

Activité 1 (Ouverture) -> Activité 2 (Aperçu) -> Activité 3 (Détail)

Réponse incorrecte "à l'arrière"

  • L'appui arrière sur l'Activité 3 fermera également l'Activité 2.

J'ai vérifié toutes les réponses publiées ci-dessus et aucune d'elles n'a fonctionné. La syntaxe Java pour la transition entre l'activité 2 et l'activité 3 a été revue pour être correcte.

Frais de codage lors de l'appel d'une application tierce. par une activité. Nous avons décidé d'étudier l'angle de configuration, ce qui nous a finalement permis d'identifier la cause profonde du problème.

Portée : Configuration de l'activité 2 (appelant).

Cause première :

android:launchMode="singleInstance"

Solution :

android:launchMode="singleTask"

Apparemment, sur ce numéro de «contre-presse», singleInstance considère les activités invoquées dans une instance avec l'activité appelante, alors que singleTask permettra aux activités invoquées ayant leur propre identité suffisante pour que la contre-presse prévue fonctionne comme il se doit.


0
{ getApplicationContext.finish();   }

Essayez cette méthode.


Bien que ce bloc de code puisse répondre à la question, il serait préférable que vous fournissiez une petite explication pour expliquer pourquoi il le fait.
David

0

il est possible que vous appeliez finish (); dans l'événement de bouton de clic afin que l'activité principale soit fermée juste après avoir cliqué sur le bouton et lorsque vous revenez de l'activité suivante, l'application est fermée car l'activité principale est déjà fermée et il n'y a pas d'activité active.


0

sur la méthode onCreate de votre activité, écrivez le code suivant.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

Remplacez ensuite la méthode sélectionnée onOptionsItem de votre activité comme suit

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

Et vous êtes prêt à partir.


0

Vous devez l'utiliser dans votre MainActivity

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

Le drapeau lancera plusieurs tâches qui conserveront votre MainActivity, lorsque vous appellerez finish, il tuera l'autre activité et vous ramènera à MainActivity

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.