2 votes

Vider la pile d'activités avant de lancer une autre activité

Bonjour (ma première question ici ;-)

Il y a peut-être des questions similaires, mais aucune d'entre elles ne semble répondre à ma question ou me donner une véritable solution...


Problème
A (Racine) commence B . B peut commencer d'autres activités. A décide de mettre fin à la pile (perte de connexion au réseau) et de démarrer. C . Cela semble être une décision drastique, mais l'utilisateur s'y attendrait et cela a vraiment du sens dans ce cas...

Pregunta
Comment faire ? Je m'attendrais à ce que l'on utilise un certain drapeau ou que l'on appelle simplement quelque chose comme dismissStack . Mais je n'arrive pas à trouver le droit (voir la recherche ci-dessous).

Recherche
J'ai lu beaucoup de documentation mais les drapeaux disponibles ne correspondent pas à mes besoins (ou je n'ai pas bien compris). D'autres réponses me disent de mémoriser les activités commencées (par exemple dans un tableau) et de les terminer quand c'est nécessaire. Mais cela me semble sale et, d'une certaine manière, je ne peux pas accepter que ce soit la bonne solution. Il doit y avoir quelque chose de plus propre, j'espère !
(Le stockage de la pile me semble encore plus erroné. Votre application peut être tuée par le système, donc vos données statiques, mais votre historique sera chargé à nouveau au démarrage. Vous devriez donc conserver votre pile sauvegardée. Cela devient encore plus sale...)

Mise à jour
Mon code et ce que j'ai essayé (abstrait) :

// in A
startActivityForResult(new Intent(this, B.class), REQUEST_B);

// network fail in A
// setting any flags on C has no influence
startActivityForResult(new Intent(this, C.class), REQUEST_C);

( FLAG_ACTIVITY_CLEAR_TOP n'est pas une solution, veuillez lire la documentation...)

J'appuie Back en C y B apparaît toujours et est donc toujours là...

Je peux supprimer l'activité en appelant finishActivity(REQUEST_B) . Mais lorsque B a commencé une autre activité D il apparaîtra toujours si je clique sur Back en C plus tard. B n'est plus là mais D est toujours là...


Je suis sûr qu'il y a quelque chose que je n'ai pas encore compris ou que j'ai manqué. Quelqu'un peut-il me donner un indice ou approuver mes recherches si c'est vraiment ainsi qu'il faut procéder...

1voto

BMo Points 331

Je pense que vous recherchez le FLAG_ACTIVITY_CLEAR_TOP à utiliser avec vos intentions.

Un exemple est fourni dans la documentation du lien ci-dessus :

Prenons l'exemple d'une tâche composée des activités suivantes : A, B, C, D : A, B, C, D. Si D appelle startActivity() avec un Intent qui se résout au composant de l'activité B, alors C et D seront terminés et B recevra l'Intent donné, ce qui fait que la pile est maintenant : A, B.

Pour en savoir plus sur les tâches et la pile arrière d'Android, consultez le site suivant ce lien dans les documents de développement Android

0voto

Knickedi Points 5881

C'est ce que j'ai obtenu jusqu'à présent et cela fonctionne plutôt bien :

Utilisation startActivityForResult . Créez un code de demande fictif si vous n'avez pas besoin d'attendre un résultat. Faites-le alors dans onDestroy de chaque activité.

if (isFinishing()) {
    finishActivity(REQUEST_CODE);
}

Par exemple : Vous avez A, B, C, D sur la pile, appeler finishActivity(REQUEST_B) de A , ce qui enchaînera les onDestroy appelle ainsi B tue C y C tue D .


C'est la meilleure solution à laquelle je puisse penser. Les autres solutions existantes perturbent le cycle de vie de l'activité et/ou sont sujettes à des erreurs.

J'espère toujours qu'il existe un moyen plus propre...

0voto

Nightwish1986 Points 63

Vous pouvez utiliser les drapeaux de nouvelle tâche et d'effacement de tâche pour effacer toutes les activités précédentes de la pile.

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

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