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();
Faites votre activité A dans le fichier manifeste: launchMode = "singleInstance"
Lorsque l'utilisateur clique sur nouveau, faites FirstActivity.fa.finish();
et appelez la nouvelle intention.
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.
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 ...
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.
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
}
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.
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);
}
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);
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);
}
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.
Premier appel startactivity () que use finish ()