web-dev-qa-db-fra.com

Android supprimer l'activité de la pile arrière

Bon alors je suis un peu perplexe sur ce qu'il faut faire avec ça. J'ai donc MainActivity, et à partir de là, une activité peut être lancée sur DegreePlanActivity, et à partir de là, une autre activité peut être lancée sur EditDegreePlan. J'ai EditDegreePlan défini sur noHistory dans le Manifeste Android. Le problème est qu'après avoir sauvegardé le EditDegreePlan, il lance une activité sur DegreePlan. Donc, si l'utilisateur appuie sur Retour, il doit appuyer deux fois pour revenir à MainActivity. Je veux m'en débarrasser pour qu'ils n'aient à appuyer qu'une seule fois. Je suis perplexe sur la façon de faire cela.

Si je règle DegreePlanActivity sur noHistory, ils ne pourraient pas appuyer sur Back to it pendant qu’il était dans EditDegreePlan.

J'ai essayé d'ignorer la méthode onBackPressed et de lancer une intention vers MainActivity. Le problème est qu’ils doivent appuyer plusieurs fois sur Retour pour quitter l’application.

Que devrais-je faire?

63
Emrys90

FLAG_ACTIVITY_CLEAR_TOP efface votre pile d'activités, vous pouvez utiliser le code ci-dessous:

Intent intent = new Intent(this, Activity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Rappelez-vous que ce drapeau efface uniquement les activités intermédiaires, par exemple si vous avez A, B, C dans votre Back Stack puis passer de l’activité C à D avec cet indicateur ceci n’efface pas l’effacement Back Stack et la pile serait A, B, C, D mais si vous passez de l’activité D à l’activité A avec ce drapeau, B, C, D, les activités surgissent de la pile et vous n’avez qu’un A dans la pile arrière. .

125
Arash GM

solution simple pour API> = 15 à API 23 nom de l'activité de l'utilisateur dans l'intention.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);
11
Kamal Bunkar

Je suggérerais que vous utilisiez startActivityForResult(), au lieu de simplement startActivity(), lorsque vous lancez EditDegreePlan-Activity, comme décrit dans le tutoriels Android .

Dans l’activité EditDegreePlan, vous appelez ensuite

setResult(RESULT_OK);
finish();

Si vous n'attendez aucune donnée de la part de EditDegreePlan-Activity, vous n'avez pas nécessairement à implémenter le onActivityResult.

10
Soana

Il semble que vous obtiendrez le comportement souhaité si vous ne spécifiez aucun indicateur. Le bouton de retour ferait juste la bonne chose. Pour terminer une activité à partir de votre code, utilisez la méthode finish(), qui a le même effet que l'utilisateur qui appuie sur le bouton Précédent. Donc, vous arriverez automatiquement à DegreePlan lorsque vous aurez terminé EditDegreePlan, inutile d’appeler le Intents non plus.

6
Henry

Voici votre flux:

MainActivity -> DegreePlanActivty -> EditDegreePlan -> DegreePlan -> MainActivty

Remplacez ces méthodes dans votre "DegreePlan"

public void onBackPressed() {
   super.onBackPressed();
   Intent goToMainActivity = new Intent(getApplicationContext(), MainActivity.class);
   goToMainActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // Will clear out your activity history stack till now
   startActivity(goToMainActivity);
}
5
Vikalp Patel

Vous pouvez appeler la fin avant de commencer votre nouvelle activité. Cela déchargera l'activité en cours. Ainsi, lorsque vous appuierez sur le bouton Précédent lors de la prochaine activité, la première activité ne sera plus là.

Intent i = new Intent(MainActivity.this, NextActivity.class);
finish();  
startActivity(i);
2
live-love

utilisez ceci pour vider la pile:

 menuIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
2
Heena Arora

Pour supprimer l'activité de la pile arrière dans le manifeste, ajoutez Android:noHistory="true" à votre activité dans le fichier manifeste.

Voir exemple ci-dessous.

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
      package="com.example.activity"
      Android:versionCode="1"
      Android:versionName="1.0">
 <application Android:name="MyApp" Android:label="My Application">
    <activity Android:name=".LoginActivity" 
      Android:noHistory="true"> //add this line to your activity inside manifest
     <intent-filter>
        <action Android:name="Android.intent.action.MAIN"/>
        <category Android:name="Android.intent.category.LAUNCHER"/>
      </intent-filter>
   </activity>
 </application>
</manifest>
1
Isaac Sekamatte
Intent intent = new Intent(getContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

startActivity(intent);
0
Luis Muñoz

Vous pouvez ajouter des drapeaux comme suit et démarrer Activity, essayez ci-dessous le code

Intent i = new Intent(activity, Payment.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
activity.startActivity(i);
0
Rachit Mishra