2010-09-29 9 views
3

Mon application a de nombreuses activités qui peuvent être appelées dans un ordre quelconqueComment effacer toutes les activités dans l'application Android

Exemple Histoire Activité: A -> B -> C -> D -> A -> B -> E

Maintenant, dans l'activité E, je désinscris l'appareil (déconnecte l'utilisateur et efface toutes les données qu'il aurait pu télécharger sur sa carte SD). Le comportement de désir est que l'application «recommence» et que l'utilisateur soit invité à une activité de connexion et que le retour de l'utilisateur renvoie l'utilisateur à l'écran d'accueil. Donc, maintenant, l'activité E doit effacer la pile d'activité d'une certaine manière. Actuellement, je mets FLAG_ACTIVITY_CLEAR_TOP lors du lancement de l'intention de A à partir de E. Le problème est que lorsque l'utilisateur a visité A et est allé aux activités intermédiaires et revisité A avant d'aller à E, il y a toujours des activités sur la pile.

A -> B -> C -> D -> A

Ainsi, l'utilisateur a été déconnecté et ne peut pas utiliser les activités BD, mais si l'utilisateur frappe de retour de l'activité A, ils peuvent accéder à des activités BD. Existe-t-il un moyen simple d'effacer toutes les activités autres que l'activité de connexion de la pile?

Mise à jour:

J'ai essayé de mettre à jour mon BaseActivity (chaque activité dans mes sous-classes d'application celui-ci) pour contenir un isDeregistering drapeau statique qui indique l'activité de se détruire si elle est vraie. Le problème est, chaque activité appelle finish(), et je suis démarré à l'écran d'accueil et ne peut pas redémarrer l'application avant de fermer l'application. Y a-t-il une meilleure manière de faire cela?

+1

C'est bizarre, en lisant les docs sur FLAG_ACTIVITY_CLEAR_TOP, il dit: Par exemple, considérons une tâche composée des activités: A, B, C, D. Si D appelle startActivity() avec un Intention qui résout le composant de l'activité B, alors C et D seront terminés et B recevra l'intention donnée, ce qui fait que la pile est maintenant: A, B. ce qui semble signifier que si vous commencez une intention de A avec ce drapeau, tous les intermédiaires les activités devraient être terminées ... – I82Much

+0

Oui, c'est le comportement, seule l'activité A est dans la pile deux fois. Lorsque la pile est effacée, elle disparaît entre l'activité d'appel et la première instance de l'activité de réception, et donc tout ce qui reste entre les deux instances de l'activité A reste sur la pile. – danh32

Répondre

3

J'ai trouvé une solution réalisable. Le code suivant va dans ma classe BaseActivity.

public boolean killIfDeregistering() { 
    if (isDeregistering) { 
     Log.d(TAG, "deregistering true!"); 
     if (getClass().getName().equals(LoginActivity.class.getName())) { 
      //don't destroy activity, reset flag 
      Log.d(TAG, "stopping deregister process!"); 
      isDeregistering = false; 
     } else { 
      //finish the activity 
      Log.d(TAG, "killing this activity!"); 
      finish(); 
      return true; 
     } 
    } 
    return false; 
} 

l'aide d'un peu de réflexion, je peux décider si oui ou non de tuer l'activité de base, de sorte que le lanceur à domicile peut redémarrer l'application à l'LoginActivity. Je dois juste m'assurer que LoginActivity ne reste pas dans la pile après avoir effectué la connexion en appelant manuellement finish() dessus.

+0

cela fonctionne comme par magie ... – Panache

0

Si vous souhaitez revenir de l'activité E à la première activité A, en détruisant toutes les activités intermédiaires, vous pouvez lancer votre intention avec FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_CLEAR_TOP

Questions connexes