113 votes

Terminer une activité à partir d'une autre activité

Je veux terminer une activité à partir d'une autre activité, par exemple :

Dans l'activité [A], lorsque je clique sur un bouton, j'appelle l'activité [B] sans terminer l'activité [A].

Dans l'activité [B], il y a deux boutons, Nouveau y Modifier . Lorsque l'utilisateur clique sur modifier, une activité [A] apparaît dans la pile avec toutes les options cochées.

Mais lorsque l'utilisateur clique sur Nouveau de l'activité [B], je devrai terminer l'activité [A] de la pile et recharger cette activité [A] dans la pile.

J'essaie, mais je n'arrive pas à terminer l'activité [A] de la pile... Comment faire ?

J'utilise le code suivant :

À partir de l'activité [A] :

Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);

Autre méthode dans la même activité

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if (requestCode == 1)
    {
        if (resultCode == 1) {
            Intent i = getIntent();
            overridePendingTransition(0, 0);
            i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();

            overridePendingTransition(0, 0);
            startActivity(i);
        }
    }
}

Et dans l'activité [B], sur le clic de bouton :

setResult(1);
finish();

5voto

DArkO Points 5974

Voir ma réponse à la question de Stack Overflow Terminer toutes les activités précédentes .

Ce qu'il faut, c'est ajouter l'élément Intent.FLAG_CLEAR_TOP . Cet indicateur permet de s'assurer que toutes les activités situées au-dessus de l'activité ciblée dans la pile sont terminées et que l'une d'entre elles est affichée.

Une autre chose dont vous avez besoin est le SINGLE_TOP drapeau. Avec celui-ci, vous empêchez Android de créer une nouvelle activité s'il en existe déjà une dans la pile.

Attention, si l'activité a déjà été créée, l'intention avec ces drapeaux sera délivrée dans la méthode appelée onNewIntent(intent) (vous devez le surcharger pour le gérer) dans l'activité cible.

Ensuite, dans onNewIntent vous avez une méthode appelée restart ou quelque chose du genre qui appellera finish() et lancer une nouvelle intention vers elle-même, ou avoir une repopulate() qui définira les nouvelles données. Je préfère la deuxième approche, elle est moins coûteuse et vous pouvez toujours extraire la méthode onCreate dans une méthode distincte que vous pouvez appeler pour le remplissage.

5voto

koras Points 623

Je viens d'appliquer la solution de Nepster et cela fonctionne à merveille. Il y a une modification mineure pour l'exécuter à partir d'un Fragment.

A votre Fragment

// sending intent to onNewIntent() of MainActivity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putExtra("transparent_nav_changed", true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Et à votre OnNewIntent() de l'activité que vous souhaitez redémarrer.

// recreate activity when transparent_nav was just changed
if (getIntent().getBooleanExtra("transparent_nav_changed", false)) {
    finish(); // finish and create a new Instance
    Intent restarter = new Intent(MainActivity.this, MainActivity.class);
    startActivity(restarter);
}

2voto

Nepster Points 893

Je pense que j'ai l'approche la plus simple... en appuyant sur nouveau dans B..

Intent intent = new Intent(B.this, A.class);
intent.putExtra("NewClicked", true);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

et en A l'obtenir

  if (getIntent().getBooleanExtra("NewClicked", false)) {
        finish();// finish yourself and make a create a new Instance of yours.
      Intent intent = new Intent(A.this,A.class);
      startActivity(intent);
    }

2voto

Tony Kutzler Points 345

Je sais qu'il s'agit d'une vieille question, mais certaines de ces méthodes n'ont pas fonctionné pour moi, alors pour ceux qui cherchent à l'avenir ou qui ont les mêmes problèmes que moi, voici ce qui a fonctionné pour moi.

J'ai passé outre onPause et a appelé finish() à l'intérieur de cette méthode.

-3voto

Dharmik Ghori Points 164

Premier appel startactivity() puis utiliser finish()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X