2010-10-28 3 views
2

Je développe une application où une seule activité est instanciée plusieurs fois par elle-même. Je suppose que vous pourriez penser à un livre où chaque activité est une page. A la fin de la page (activité), l'utilisateur appuie sur un bouton pour accéder à une nouvelle page. Je déclenche une Intention pour la même activité, mais je pousse différentes données dans le Bundle afin qu'une page différente soit chargée.Y a-t-il quelque chose que je dois prendre en compte lorsque je répète plusieurs fois la même activité?

Cela fonctionne bien, et j'aime le fait que l'utilisateur peut sauvegarder à un point précédent, mais ma question est de savoir si cela va éventuellement être un problème? Que se passe-t-il si cette activité est instanciée 10 fois, 50 ou 100? L'appareil va-t-il manquer de mémoire, le GC viendra-t-il nettoyer les vieilles activités, ou quoi?

Si GC les nettoie, que se passe-t-il lorsque l'utilisateur appuie sur Retour et que l'activité précédente n'est plus dans la pile? Est-il préférable de suivre le chemin de l'utilisateur, de terminer() l'activité et de remplacer le bouton Précédent pour que l'utilisateur avance ou recule, je ne charge qu'une seule activité? Une autre approche que je pourrais prendre est de rafraîchir toutes les données sur la page afin que ce soit toujours la même activité, mais avec de nouvelles données. Le bouton Précédent ne fonctionnerait pas comme prévu dans ce cas.

Pensées?

Répondre

1

avez-vous envisagé d'utiliser peut-être la même activité et de simplement changer le contenu qu'il rend.

Donc, dans l'exemple de livre. Vous auriez un livre Activity qui aurait un ViewViewGroup quelque part dans sa hiérarchie de vue qui restitue le contenu de la page. Ensuite, quand un utilisateur va à la page suivante ou à la page précédente, le Page ViewGroup rend simplement le contenu de la page désirée. Vous pouvez ensuite utiliser une structure de données pour gérer votre pile de pages et la position actuelle des utilisateurs.

Vous ne savez pas exactement ce que votre application essaie de faire, alors je comprends que cela ne fonctionne pas pour votre usage particulier. Cependant, je m'attendrais à ce que cela ait une meilleure performance d'exécution qu'instancier des activités entières.

Les anciennes activités qui ne sont plus visibles seront détruites si leur mémoire est nécessaire. Cependant, Android dispose d'un mécanisme de persistance d'état qui permet de reconstruire correctement une activité redémarrée (en retournant à la page qui a été détruite dans votre cas). Cela peut être effectué via le mécanisme shared preferences ou l'objet bundle transmis dans Activity.onCreate. Cependant, vous devrez sauvegarder explicitement hors de l'état dans Activity.onStop(...) et Activity.onSaveInstanceState(...), puis restaurer l'état dans Activity.onCreate(...) et Activity.onRestoreInstanceState

En savoir plus sur le cycle de vie Activies peut être lu ici (Je ne sais pas ce que votre niveau de compréhension est) Maintenant, je ne sais pas ce qui se passe à l'extrême, si vous pouvez créer autant d'activités que Android ne sera plus en mesure de ramener ceux qu'il a tué. Je m'attendrais à ce qu'il y ait un mécanisme de protection en place pour empêcher cela, mais je ne sais pas ce que c'est.

trouvé cet article qui pourrait fournir encore plus d'information, ne sais pas si cela est l'information que vous recherchez bien: http://zerocredibility.wordpress.com/2009/08/24/why-android-swap-doesnt-make-sense/

Vive & Bonne chasse!

+0

Merci, James. Oui, j'ai réfléchi à ce que vous suggérez - en rafraîchissant simplement les données sur la même page. Ensuite, je dois remplacer le bouton Précédent et actualiser la page précédente si elle est pressée. Je pense que je peux utiliser votre deuxième suggestion - sauvegarder mon état dans onPause, et le restaurer dans onResume. Dans mon cas, "state" est simplement une valeur clé de toute façon, c'est super facile. De cette façon, le bouton Back fonctionne toujours sans travail supplémentaire de ma part, et je m'en ficherai si Android tue l'une de mes activités précédentes. – RMS2

0

Je préférerais remplacer le comportement du bouton de retour et utiliser par exemple un ViewFlipper pour faire le travail d'animation.C'est assez simple à faire:

// You could do simpler by overriding onBackPressed() if you 
    // don't need 1.6 compatibility 
    //-- 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
      if (currentPage>0) { 
       return super.onKeyDown(keyCode, event); 
      } else { 
       currentPage--; 
       showPage(currentPage); 
       return true; 
      } 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
Questions connexes