2010-07-13 12 views
15

Così ho la mia attività, e alla pressione di un pulsante "Esci" chiamo Activity.finish(). Questo chiude in modo efficace la mia domanda.Come uccidere la mia attività - nel modo più duro

Il problema: il processo Dalvik della mia applicazione è ancora in giro come uno zombie in background. Sembra che questo sia normale come altre applicazioni fanno lo stesso. Anche l'esempio di ciao-mondo si blocca nella memoria ..

Potrei vivere con questo, ma sfortunatamente questo comportamento rende lo sviluppo della mia applicazione un dolore. Ho un servizio remoto collegato alla mia attività e questo servizio non scaricherà fino a quando la mia attività non si scaricherà (cosa che, come detto, non funziona mai).

Tutto è in qualche modo tenuto in vita senza una buona ragione.

Come è possibile che io,, la mia attività venga rimossa dalla memoria, ?

Sto cercando qualcosa come la chiamata Activity.finish_and_kill_my_process_please() o qualcosa di simile.

risposta

8

Così ho la mia attività, e premendo un "Quit" pulsante mi chiamare Activity.finish(). Questo efficacemente chiude la mia domanda.

Please don't do this.

Il Dalvik-processo della mia candidatura è ancora in giro come uno zombie in sfondo.

Il processo viene tenuto in una cache, per il potenziale riutilizzo da parte di Android. Puoi tranquillamente ignorarlo.

Ho un servizio remoto collegato alla la mia attività, e questo servizio non sarà scarico fino a quando la mia attività scarica i (che come detto non lo fa mai).

probabilmente avete un bug nella vostra applicazione, ad esempio chiamando startService() e non riuscendo a chiamare stopService(), o chiamando bindService() e non riuscendo a chiamare unbindService().

6

provare a utilizzare il metodo di killBackgroundProcesses:

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

Sarà necessario aggiungere l'autorizzazione KILL_BACKGROUND_PROCESSES al file AndroidManifest.xml.

+0

Ok, sembra che questo metodo non faccia più parte della classe ActivityManager ?? – bugzy

+0

C'è una nuova API per Android 2.2 Froyo ma questa è una pessima idea. Queste autorizzazioni sono contrassegnate come PERICOLOSE e gli utenti vedranno che la tua app ha la capacità di uccidere altre app. – Tom

+0

Mentre terminare il processo di un'applicazione non è quasi mai una buona idea al di fuori di test oscuri durante lo sviluppo, questo è un modo inutilmente indiretto per farlo. Un processo può semplicemente uscire() o uccidere se stesso - non è necessario chiedere a ActivityManager di farlo. –

24
  1. Call finish(); sul pulsante cliccare
  2. Aggiungi questa linea al metodo di OnDestroy:

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

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

Per un'app rilasciata, KillProcess() non è una buona idea. Ma per la fase di sviluppo (accelerare la terminazione di un'app per scopi di debug) questo è un risparmiatore di vita. +1. – an00b

+0

Definitivamente utile durante lo sviluppo (per uso temporaneo) – Diljeet

+1

Questo è stato utile per aiutarmi a scaricare una lib nativa :-) – Miquel

3

Uccidendo il processo è possibile interrompere il completely.from applicazione all'ultima schermata sul pulsante indietro si può uccidere il processo:

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

Usando l'ActivityManager possiamo chiudere il anche altre applicazioni.

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

di utilizzare il codice di cui sopra dovrebbe avere le autorizzazioni in android.permission.RESTART_PACKAGE file manifesto.

+0

restartPackage è ora obsoleto. utilizzare invece killBackgroundProcesses. – rfinz

4

Beh, se non solo l'attività, ma anche l'applicazione che si desidera terminare, è possibile utilizzare

System.exit(0)

La gente dice che è deprecato o cattivo esempio, ma, beh è puro Java e funziona ...

+0

Sai perchè la gente dice queste cose? Ha qualcosa a che fare con il modo in cui l'applicazione "vive" all'interno dell'OSS Android? Questa è una tentazione da usare in una delle mie app ... ma mi piacerebbe conoscere prima la teoria dietro lo scoraggiamento. – snapfractalpop

+2

Beh, penso che lo dica perché Android può gestire le applicazioni stesse; quindi non dovremmo soffermarci il naso. Dico che è una balla * se: se è la mia applicazione, chi altri se non me può sapere quando terminarlo? :) –

0

System.exit() scarica i istantaneamente tutta la macchina virtuale con tutte le biblioteche, servizi nativi ed ecc

1

simile al System.exit (0) sul lato Java, è possibile anche chiamare un nativo metodo durante onD estroy che chiama exit (0) sul lato C/C++. Questo sembra forzare la lib per uscire completamente. Funziona per me!

Problemi correlati