web-dev-qa-db-fra.com

Terminer l'activité parent et actuelle dans Android

J'ai 3 activités. L'activité A qui mène à l'activité B, qui à son tour peut revenir à l'activité A ou démarrer l'activité C. Toutefois, si j'appuie sur l'activité C, l'application devrait se fermer.

Pour résumer:

  • L'activité A commence l'activité B
  • Appuyer sur Retour sur l'activité B devrait conduire à A
  • L'activité B commence l'activité C
  • En appuyant sur Retour sur l'activité C devrait fermer l'application

Comment devrais-je passer de l'activité B à C? Ce code me donne actuellement une exception NullPointerException sur la dernière ligne:

Intent intent=new Intent(ActivityB.this, ActivityC.class);
startActivity(intent);
ActivityB.this.finish();
ActivityB.this.getParent().finish();

Si je permute les deux dernières lignes, j'obtiens aussi un pointeur nul.

45
hpique

Je ne sais pas si cela fonctionnera, mais vous pouvez l'essayer:

  • A partir de l'activité A, démarrez l'activité B pour un résultat utilisant startActivityForResult()

  • Dans l'activité B, lorsque l'utilisateur déclenche l'activité C, démarrez l'activité C.

startActivity() retourne immédiatement, donc 

  • définir un résultat qui informera A de finir également, 

  • Appelez finish() en B. 

  • Lorsque A reçoit ce résultat de B, A appelle également finish() sur lui-même.

À défaut, vous pouvez créer l'activité C dans sa propre application, puis fermer la première application (avec A & B) après le démarrage de la seconde.

P.S. Prenez en compte le commentaire de Falmarri à mesure que vous avancez!
Bonne chance.

53
codinguser

Si vous souhaitez terminer une activité parent à partir d'une activité enfant,

Dans l'activité parent, lors du déclenchement de l'activité enfant, utilisez la commande suivante: -

startActivityForResult(intent_name,any_integer_variable);

et substituez la méthode onActivityResult de la manière suivante: -

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(resultCode==2){
        finish();
    }
}

Maintenant, dans l'activité enfant, remplacez onStop et onDestroy de la manière suivante: -

protected void onStop() {
    setResult(2);
    super.onStop();
}
@Override
protected void onDestroy() {
    setResult(2);
    super.onDestroy();
}

Notez que j'ai défini la valeur 2 dans l'activité enfant et que je la recherche dans l'activité parent. Si la valeur est identique à celle que j'ai définie, l'activité parente se terminera également ..____. Vous pouvez ensuite utiliser des approches récursives pour les activités suivantes.

33
Anuj Agarwal

Vous devez utiliser onActivityResult dans votre activité parent

Supposons que l’activité A soit parent de l’activité B . Si vous souhaitez cliquer sur le bouton Précédent dans l’activité B pour quitter l’application (également pour quitter l’activité A)

Dans votre activité B, dans onStop() ou onDestroy()

tu appelles 

setResult(0); //any int number is fine

cela passera un code de résultat à son activité parente.

Votre parent Actvity A écoute le code de résultat. Vous devrez utiliser la méthode onActivityResult À l’intérieur de la méthode que vous pouvez appeler

if(resultCode == 0) //matches the result code passed from B
{
    ActivityA.this.finish()
}

Ça marche pour moi :)

11
TS.xy

Rien de tout cela n'a fonctionné pour moi. J'ai donc trouvé une solution. L'aide indique clairement que Intent.FLAG_ACTIVITY_CLEAR_TASK doit être utilisé avec Intent.FLAG_ACTIVITY_NEW_TASK. Donc, voici un code qui a fonctionné pour moi.

Intent intent=new Intent(ActivityB.this, ActivityC.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
3
Yugank

Je n'ai rien fait de tout ça. Voici comment je réviserais votre code.

le code que vous utilisez pour entrer une autre intention:

Intent whatEverIntentName = new Intent("Path.to.next.Intent");
startActivity(whatEverIntentName);
finish();

De cette façon, vous quittez toujours lorsque vous appuyez en arrière. Mais attendez! Vous pouvez modifier la manière dont vous souhaitez que votre touche Back réagisse lorsque vous appuyez dessus.

Faire ceci:

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent whatEverIntentName = new Intent("Path.to.the.activity.before.it");
    startActivity(whatEverIntentName);
// Don't add finish here. 
//This is necessary because you finished your last activity with finish();
}
3
LifesAway

Pour démarrer l'activité 'B' à partir de l'activité 'A', utilisez la méthode startActivityForResult comme suit:

       Intent intent2 = new Intent(A.this,B.class);
       startActivityForResult(intent2,2);

Au lieu de 2, vous pouvez utiliser n’importe quel chiffre.

Implémentez la méthode suivante pour attraper le résultat de l'activité enfant:

      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == 2) {
        finish();
    }
}

N'oubliez pas d'utiliser le même chiffre que vous avez utilisé lors du démarrage de l'activité.

Maintenant, dans l'activité 'B', procédez comme suit: Pour démarrer l'activité 'C'

     Intent intent3 = new Intent(B.this,C.class);
     startActivityForResult(intent3,3);

Mettre en œuvre la méthode

     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == 3) {
                         setResult(2);
        finish();
    }
}

Ici, vous terminez l'activité 'A' en définissant le résultat sur 2 . L'activité de finition 'B' termine donc l'activité 'A'.

Et mettez la ligne suivante dans l’activité 'C':

             setResult(3);

Dès que votre activité "C" commence, vos activités précédentes sont terminées.

Donc, le soutien de l'activité 'C' ferme l'application. 

3
Ajay Randhumal

essaye ça

  Intent intent = new Intent(Intent.ACTION_MAIN);
  intent.addCategory(Intent.CATEGORY_HOME);
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);                
2
Ketan Ahir

si vous êtes sur l'activité A et que vous avez démarré une autre activité appelée activité B . activité A -> activité B

Et maintenant, vous voulez fermer les deux activités.

utilisez ensuite le code ci-dessous dans l'activité B.

B.this.finish();

Et utilisez ce code dans l'activité A:

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

Dès que l'activité B sera terminée, l'activité A sera également terminée.

Il y a un inconvénient, je ne sais pas si vous le souhaitez ou non.

L'inconvénient est que si l'utilisateur est sur l'activité B et qu'il appuie sur le bouton Précédent pour passer à l'activité A. Ensuite, l'activité A se termine également dans ce cas.

2
Ali Shan

Cela fonctionne parfaitement:

btn_back.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {

Player.this.finish();
    }
});
1
dhrupal

Vous pouvez utiliser finishAffinity(), cela fermera les activités courante et parent de l’activité courante.

Remarque: Mais les résultats de l'activité enfant vers l'activité parent ne seront pas traités.

J'espère que ça aide !!

1
Animesh Mangla

A partir de l'activité A, démarrez l'activité B pour un résultat utilisant startActivityForResult (intention, 19)

Dans l'activité B, lorsque l'utilisateur déclenche l'activité C, démarrez l'activité C.

startActivity () retourne immédiatement, donc

définir un résultat qui informera A de finir également,

Appelez la méthode finish () dans B . Et appelez setResult () avant la méthode finish () dans votre activité enfantEn activité parent B, A appelle également finish () sur lui-même.

enter code here
     @Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
    //Added by Ashish to close parent activity
      if(arg1==19){
      finish();
        }
    super.onActivityResult(arg0, arg1, arg2);
}
1
Ashish Saini

À partir de l’écran (B), vous souhaitez démarrer l’écran (C) sans écran arrière, il suffit de lancer l’écran (C) avec:

screenC.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
    | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(screenC);
finish();

Le retour dans screenC va quitter l'application.

1
miroslavign
Intent intent=new Intent(ActivityB.this, ActivityC.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

votre activité C sera l'activité racine et à la fin, les applications seront finies.

1
Vipin Sahu

Vous pouvez simplement remplacer le comportement de la touche back :

L'activité A commence l'activité B
En appuyant sur l'activité B devrait conduire à A
L'activité B commence l'activité C
En appuyant sur Retour sur l'activité C devrait fermer l'application 

Notez que je n'appelle pas super depuis onBackPressed . Cela vous permet également de remplacer le mécanisme de la pile de navigation pour Android, ce qui me semble être un gros avantage, car il ne semble pas actuellement y avoir de moyen d'effacer seul élément le plus ancien de la pile de navigation d'une manière simple.

public class B extends Activity
{
    ...
    @Override
    public void onBackPressed()
    {
        // Start activity A
        Intent aIntent = new Intent(this, A);
        startActivity(bIntent);
    }
    ...
}

public class C extends Activity
{
    ...
    @Override
    public void onBackPressed()
    {
        // Close
        finish();
    }
    ...
}

Vous pouvez également terminer l'activité parente si nécessaire, mais en utilisant cette méthode, vous n'avez pas à vous en préoccuper.

0
Peter Ajtai

Le code suivant devrait le faire pour vous. Presque dans toutes les autres approches, votre application restera dans les applications récentes. Javadoc peut être trouvé à l'adresse, https://developer.Android.com/reference/Android/app/ActivityManager.AppTask.html#finishAndRemoveTask ()

            ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
            if(am != null) {
                List<ActivityManager.AppTask> tasks = am.getAppTasks();
                if (tasks != null) {
                    tasks.get(0).finishAndRemoveTask();
                }
            }
0
Hamzeen Hameem

Demandez à chaque activité d'écouter le résultat de l'activité suivante et de se terminer si cela se produit.

Vous pouvez utiliser un code de résultat spécial pour indiquer que vous souhaitez que l'activité se termine.

0
Cheryl Simon