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.

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

Ajay S
la source
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.

jjNford
la source
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();
Zabador
la source
12

si vous utilisez un fragment, vous devez utiliser

getActivity().onBackPressed();

si vous utilisez une seule activité, vous pouvez utiliser

finish();
Oussama Ibrahim
la source
7

essayez ce code au lieu de finish:

onBackPressed();

Sanaz Afzali
la source
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

Vous rendez cela trop difficile. Si je comprends ce que vous essayez de faire correctement, le bouton `` retour '' intégré et Android lui-même feront tout le travail pour vous: http://developer.android.com/guide/components/tasks-and-back- stack.html

De plus, la mise en œuvre d'un bouton "retour" personnalisé enfreint le guide de qualité des applications de base UX-N1: http://developer.android.com/distribute/googleplay/quality/core.html

peejaybee
la source
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();
    }
});
KEYSAN
la source
4

Cela ferme toute l'application:

this.finish();
Logar314159
la source
Cela ferme l'application entière comme indiqué dans la question, pas seulement l'activité actuelle, comme le bouton de retour du téléphone?
Zapnologica
Comment accéder à l'activité précédente à partir de l'activité de l'appareil photo.
coderpc
2
Non, ce n'est pas le cas. Il ne ferme que l'activité en cours. Voir: developer.android.com/reference/android/app/…
Firzen
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>
...
Trevor
la source
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

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

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

Puni
la source
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)?

Kent Hansen
la source
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.

Corbeau
la source
0
{ getApplicationContext.finish();   }

Essayez cette méthode.

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

raman rayat
la source
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.

Hagos Alema
la source
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

Rafat
la source