2011-01-24 3 views
29

J'ai une activité qui, lorsqu'elle démarre, charge une image sur internet. Dans un effort pour économiser de la mémoire, lorsque l'activité est laissée par le bouton de retour appuyé, je veux que l'activité vider toutes les données, c'est-à-dire se débarrasser de toutes les chaînes et images qui s'y trouvent. J'ai pensé que la meilleure façon de le faire était de tuer l'activité.Comment tuer une activité lorsque le bouton Précédent est enfoncé?

Eh bien, je n'arrive pas à comprendre le rappel lorsque vous appuyez sur le bouton Précédent. Donc, j'ai essayé d'utiliser le onPause() et les rappels onStop() pour la tâche mais les deux façons forcent fermer mon application. Voici le code:

public void onPause() { 
    this.finish(); 
} 
public void onStop() { 
    finish(); 
} 

J'ai essayé plusieurs variantes de cela, mais aucune d'entre elles ne semblait fonctionner. Des idées?

+0

Que recherchez-vous exactement? Pour terminer l'activité en cours? Bouton –

Répondre

36

ajouter à votre activité

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    { 
     finish(); 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+1

À quoi cela sert-il? Appuyez sur le bouton retour pour descendre automatiquement la pile d'activité. 'finish()' s'assure juste que vous ne pouvez pas revenir en arrière. (Cela dit, la question est certes vague.) – EboMike

+2

bien sûr, mais l'activité est tuée n'est pas certain sur la touche de retour, donc pour tuer la finition est important et c'est ce qui a demandé en question, mais depuis la libération de la mémoire se fait automatiquement par OS – ingsaurabh

+2

Absolument pas. Si l'activité n'est pas en avant, elle peut être récupérée par le système d'exploitation. Terminé ou non. – EboMike

4

Eh bien, si vous étudiez la structure de la façon dont fonctionne l'application du cycle de vie, here, vous arriverez à savoir que onPause() est appelée quand un autre point sur les gains d'activité et onStop() est appelée lorsque l'activité n'est plus visible. D'après ce que j'ai appris, vous pouvez appeler finish() uniquement à partir de l'activité qui est active et/ou qui a le focus. Si vous appelez finish() à partir de la méthode onPause(), cela signifie que vous l'appelez lorsque l'activité n'est plus active. ainsi une exception est levée.

Lorsque vous appelez le finish() de onStop(), l'activité est envoyée en arrière-plan, elle ne sera donc plus visible, puis cette exception. Lorsque vous appuyez sur le bouton back, onStop() est appelée. Il est probable qu'Android fera automatiquement pour vous ce que vous voulez faire.

6

Tout d'abord, finish() ne détruit pas votre processus et libère de la mémoire. Il supprime simplement l'activité de la pile d'activité. Vous auriez besoin de tuer le processus, ce qui est répondu à un tas de questions (puisque cela est demandé à plusieurs reprises).

Mais la bonne réponse est - Ne le faites pas. Le système d'exploitation Android va automatiquement libérer de la mémoire lorsqu'il a besoin de mémoire. En ne libérant pas de mémoire, votre application démarrera plus rapidement si l'utilisateur y revient.

S'il vous plaît see here pour un excellent article sur le sujet.

+7

Si l'activité utilise beaucoup de ressources, alors pourquoi ne pas le tuer depuis l'intérieur de votre application plutôt que d'attendre le GC? C'est tout un processus qui devrait se dérouler, ralentissant ainsi le téléphone. Bonne gestion de la mémoire est de faire tous les efforts pour le gérer au sein du programme lui-même. C'est la raison pour laquelle la plupart des langages de programmation et des ide gérés automatiquement dans le programme, et c'est aussi la raison pour laquelle vous donnez le cycle de vie, afin que vous puissiez gérer la mémoire de votre mieux au sein de votre application. – Shaun

+1

Shaun a raison, une bonne gestion de la mémoire fait tout son possible pour le gérer dans le programme lui-même. – dns

61

simple Override onBackPressed Méthode:

@Override 
    public void onBackPressed() { 
      super.onBackPressed(); 
      this.finish(); 
    } 
13
public boolean onKeyDown(int keycode, KeyEvent event) { 
    if (keycode == KeyEvent.KEYCODE_BACK) { 
     moveTaskToBack(true); 
    } 
    return super.onKeyDown(keycode, event); 
} 

Mon application fermée avec le code ci-dessus.

+0

cela fonctionne, merci – Mohsen

+0

Son travail, mais l'application est toujours ouverte même page chaque fois que l'application n'est pas tué –

+0

, mais que vous voulez démarrer l'application dans l'activité Launcher –

Questions connexes