web-dev-qa-db-fra.com

Terminer une activité d'une autre activité

Je veux terminer une activité d'une autre, comme:

Dans l'activité [A], lors d'un clic de bouton, j'appelle l'activité [B] sans terminer l'activité [A].

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

Mais lorsque l'utilisateur clique sur le bouton Nouveau de l'activité [B], je dois terminer l'activité [A] à partir de la pile et recharger à nouveau cette activité [A] dans la pile.

Je l'essaie, mais je ne parviens pas à terminer l'activité [A] de la pile ... Comment puis-je le faire?

J'utilise le code comme:

De l'activité [A]:

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

Une 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 du bouton:

setResult(1);
finish();
81
Kanika
  1. Faites votre activité A dans le fichier manifeste: launchMode = "singleInstance"

  2. Lorsque l'utilisateur clique sur nouveau, faites FirstActivity.fa.finish(); et appelez la nouvelle intention.

  3. Lorsque l'utilisateur clique sur Modifier, appelez la nouvelle intention ou terminez simplement l'activité B.

PREMIER CHEMIN

Dans votre première activité, déclarez un Activity object comme ceci,

public static Activity fa;
onCreate()
{
    fa = this;
}

maintenant, utilisez cet objet dans une autre Activity pour terminer la première activité comme ceci,

onCreate()
{
    FirstActivity.fa.finish();
}

DEUXIÈME VOIE

Tout en appelant votre activité FirstActivity que vous souhaitez terminer dès que vous passez à autre chose, vous pouvez ajouter un indicateur en appelant FirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

Mais en utilisant ce drapeau, l'activité sera terminée même si vous ne le souhaitez pas. et parfois onBack si vous voulez afficher FirstActivity, vous devrez l'appeler en utilisant l'intention.

176
MKJParekh

Vous pouvez le faire, mais je pense que vous ne devriez pas interrompre le flux normal des activités. Si vous souhaitez terminer votre activité, vous pouvez simplement envoyer une émission de votre activité B à l’activité A.

Créez un récepteur de diffusion avant de commencer votre activité B:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if (action.equals("finish_activity")) {
            finish();
            // DO WHATEVER YOU WANT.
        }
    }
};
registerReceiver(broadcastReceiver, new IntentFilter("finish_activity"));

Envoyez la diffusion de l’activité B à l’activité A lorsque vous souhaitez terminer l’activité A de B

Intent intent = new Intent("finish_activity");
sendBroadcast(intent);

J'espère que ça marchera pour toi ...

71
Bharat Sharma

C'est une question de communication assez standard. Une approche consisterait à utiliser un ResultReceiver dans l'activité A:

Intent GotoB=new Intent(A.this,B.class);
GotoB.putExtra("finisher", new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        A.this.finish();
    }
});
startActivityForResult(GotoB,1);

puis dans l'activité B, vous pouvez simplement le terminer à la demande, comme suit:

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());

Essayez quelque chose comme ça.

16
Femi

Il existe une approche que vous pouvez utiliser dans votre cas.

Étape 1: Commencez l’activité B à partir de l’activité A

startActivity(new Intent(A.this, B.class));

Étape 2: Si l’utilisateur clique sur le bouton Modifier, démarrez l’activité A à l’aide du FLAG_ACTIVITY_CLEAR_TOP. Passez également le drapeau en plus.

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "modify");
startActivity(i);
finish();

Étape 3: Si l’utilisateur clique sur le bouton Ajouter, démarrez l’activité A à l’aide du FLAG_ACTIVITY_CLEAR_TOP. Passez également le drapeau en plus. FLAG_ACTIVITY_CLEAR_TOP effacera toutes les activités ouvertes jusqu'à la cible et redémarrera si aucun mode de lancement n'est défini dans l'activité cible 

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "add");
startActivity(i);
finish();

Étape 4: Maintenant, la méthode onCreate() de l’activité A, doit extraire cet indicateur.

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}
10
Dharmendra

Voir ma réponse à la question de débordement de pile Terminer toutes les activités précédentes .

Ce dont vous avez besoin est d’ajouter le Intent.FLAG_CLEAR_TOP. Cet indicateur garantit que toutes les activités situées au-dessus de l'activité ciblée dans la pile sont terminées et que celle-ci est affichée.

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

Méfiez-vous simplement que si l'activité a déjà été créée, l'intention avec ces indicateurs sera fournie dans la méthode appelée onNewIntent(intent) (vous devez la surcharger pour la gérer) dans l'activité cible.

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

5
DArkO

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

À 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);
}
4
koras

Commencez votre activité avec le code de demande:

StartActivityForResult(intent,1003);

Et vous pouvez le fermer à partir de toute autre activité comme celle-ci:

FinishActivity(1003);
2
yaniv maymon

Je pense que j'ai l'approche la plus facile ... 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 obtenir le 

  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);
    }
2
Xar E Ahmer

Je sais que c’est une vieille question, quelques-unes de ces méthodes ne fonctionnaient pas pour moi alors pour ceux qui regardent dans le futur ou qui ont des problèmes, cela a fonctionné pour moi

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

1
Tony Kutzler

Premier appel startactivity () que use finish ()

0
Dharmik Ghori