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?
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. .
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);
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
.
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.
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);
}
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);
utilisez ceci pour vider la pile:
menuIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
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>
Intent intent = new Intent(getContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
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);