2010-07-13 3 views
15

J'ai donc mon activité, et en appuyant sur un bouton "Quitter" j'appelle Activity.finish(). Cela ferme effectivement mon application. Le problème: Le processus Dalvik de mon application traîne toujours en tant que zombie en arrière-plan. Il semble que ce soit normal car d'autres applications font de même. Même l'exemple de Bonjour-monde traîne dans la mémoire ..Comment tuer ma propre activité - la voie difficile

Je pourrais vivre avec cela, mais malheureusement ce comportement rend le développement de mon application une douleur. J'ai un service à distance connecté à mon activité, et ce service ne sera pas déchargé tant que mon activité ne sera pas déchargée (ce qui n'a jamais été le cas).

Tout est en quelque sorte maintenu en vie sans raison valable. Comment puis-je vraiment supprimer mon activité de la mémoire?

Je cherche quelque chose comme Activity.finish_and_kill_my_process_please() appel ou quelque chose de similaire.

Répondre

8

J'ai mon activité, et en appuyant sur un bouton « Quitter » j'appeler Activity.finish(). Cela effectivement ferme mon application.

Please don't do this.

Le Dalvik processus de ma demande est toujours traîner comme un zombie dans arrière-plan.

Le processus est conservé dans un cache, pour une réutilisation potentielle par Android. Vous pouvez l'ignorer en toute sécurité.

J'ai un service distant connecté à mon activité, et ce service ne sera pas jusqu'à ce que mon décharger l'activité éjecte (qui, comme dit ne jamais).

Vous avez probablement un bug dans votre application, comme appeler startService() et de ne pas appeler stopService(), ou en appelant bindService() et de ne pas appeler unbindService().

6

Essayez d'utiliser la méthode killBackgroundProcesses:

ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
activityManager.killBackgroundProcesses("name.of.your.package"); 

Vous devez ajouter l'autorisation KILL_BACKGROUND_PROCESSES à votre fichier AndroidManifest.xml.

+0

Ok, eh bien, il semble que cette méthode ne fait plus partie de la classe ActivityManager ?? – bugzy

+0

Il existe une nouvelle API pour Android 2.2 Froyo mais c'est une très mauvaise idée. Ces autorisations sont marquées comme DANGEREUSES et les utilisateurs verront que votre application a la capacité de tuer d'autres applications. – Tom

+0

Alors que terminer le processus d'une application n'est presque jamais une bonne idée en dehors des tests obscurs pendant le développement, c'est une façon inutilement détournée de le faire. Un processus peut simplement quitter() ou se tuer lui-même - il n'a pas besoin de demander à ActivityManager de le faire. –

24
  1. Appelez finish(); sur le bouton cliquez sur
  2. Ajouter cette ligne à la méthode OnDestroy:

android.os.Process.killProcess (android.os.Process.myPid());

public void onDestroy() { 
     super.onDestroy(); 
     android.os.Process.killProcess(android.os.Process.myPid()); 
    }  
+8

Pour une application publiée KillProcess() n'est pas une bonne idée. Mais pour la phase de développement (accélération de la terminaison d'une application à des fins de débogage), cela permet de sauver des vies. +1 – an00b

+0

Définitivement utile lors du développement (pour un usage temporaire) – Diljeet

+1

Cela m'a été utile pour m'aider à décharger une lib native :-) – Miquel

3

En tuant le processus, vous pouvez arrêter le completely.from d'application le dernier écran, appuyez sur le bouton retour, vous pouvez tuer le processus par:

public void onBackPressed() { 
     super.onBackPressed(); 
     int pid = android.os.Process.myPid(); 
     android.os.Process.killProcess(pid); } 
0

En utilisant le ActivityManager nous pouvons fermer la d'autres applications aussi.

private ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 
am.restartPackage("com.jimmy.appToBeClosed"); 

utiliser le code ci-dessus doit avoir les autorisations android.permission.RESTART_PACKAGE dans le fichier manifeste.

+0

restartPackage est maintenant obsolète. utilisez plutôt killBackgroundProcesses. – rfinz

4

Eh bien, si l'activité non seulement, mais aussi l'application que vous souhaitez mettre fin, vous pouvez utiliser

System.exit(0)

Les gens disent qu'il est par exemple dépréciée ou mauvais, mais, bien que c'est Java pur et fonctionne ...

+0

Savez-vous pourquoi les gens disent ces choses? Cela a-t-il quelque chose à voir avec la façon dont l'application «vit» dans Android O.S.? C'est tentant d'utiliser dans une de mes applications .. mais j'aimerais connaître la théorie derrière le découragement d'abord. – snapfractalpop

+2

Eh bien, je pense qu'ils le disent parce que Android peut gérer les applications lui-même; Je ne dis pas que c'est foutu. Mais si c'est mon application, qui d'autre que moi peut savoir quand la terminer? :) –

0

System.exit() instantanément éjecte machine virtuelle entière avec toutes les bibliothèques natives, services, etc

1

similaires à la System.exit (0) du côté Java, vous pouvez également appeler un natif méthode pendant onD estroy qui appelle exit (0) du côté C/C++. Cela semble forcer la lib à quitter complètement. Ça marche pour moi!

Questions connexes