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();

198voto

MKJParekh Points 18108
  1. Faites votre activité A dans le fichier manifeste : launchMode = "singleInstance"

  2. Lorsque l'utilisateur clique sur nouveau, faire FirstActivity.fa.finish(); et appeler le nouvel Intent.

  3. Lorsque l'utilisateur clique sur modifier, il appelle la nouvelle intention ou termine simplement l'activité B.

PREMIÈRE VOIE

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

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

utiliser cet objet dans un autre Activity pour terminer la première activité de cette manière,

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

DEUXIÈME VOIE

Lors de l'appel de votre activité FirstActivity que vous souhaitez terminer dès que vous passez à autre chose, Vous pouvez ajouter un drapeau en appelant FirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

Mais en utilisant ce drapeau, l'activité se terminera même si vous voulez qu'elle ne se termine pas. et parfois onBack si vous souhaitez afficher le FirstActivity vous devrez l'appeler en utilisant l'intention.

112voto

Bharat Sharma Points 2016

C'est possible, mais je pense qu'il ne faut pas interrompre le cours normal de l'activité. Si vous voulez terminer votre activité, vous pouvez simplement envoyer une diffusion 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"));

Envoyer une diffusion de l'activité B vers l'activité A lorsque vous voulez terminer l'activité A à partir de B

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

J'espère que cela fonctionnera pour vous...

21voto

Femi Points 42054

Il s'agit d'une question de communication assez classique. 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 la terminer à la demande, comme suit :

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

Essayez quelque chose comme ça.

12voto

Dharmendra Points 14394

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

Étape 1 : Démarrer 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, l'activité A est lancée à l'aide de la fonction FLAG_ACTIVITY_CLEAR_TOP Passez également le drapeau en supplément.

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, l'activité A est lancée à l'aide de la fonction FLAG_ACTIVITY_CLEAR_TOP Passez également le drapeau en supplément. FLAG_ACTIVITY_CLEAR_TOP efface toutes les activités ouvertes jusqu'à la cible et redémarre 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 onCreate() de l'activité A, il faut récupérer ce drapeau.

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

8voto

yaniv maymon Points 219

Commencez votre activité avec le code de demande :

StartActivityForResult(intent,1234);

Et vous pouvez le fermer à partir de n'importe quelle autre activité comme celle-ci :

finishActivity(1234);

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