2013-06-06 10 views
5

Sto chiamando finish() se è soddisfatta una determinata condizione. Tuttavia, anche dopo finish() se tengo premuto il pulsante home, posso ancora vedere la mia app lì. Se uccidere il processo non è un'opzione auspicabile, cosa dovrei fare?perché la mia app è ancora visibile nel task manager dopo averla terminata

questo è dove io sto chiamando finish():

protected void onStart() { 
............. 
if(today.equals("...")) 
finish(); 

    }; 

so che fine farà terminare l'attività, ma perché è ancora visibile nel task manager? L'ho finito

+0

'finish()' uccide solo l'attività, non l'intera applicazione. Cosa stai cercando di fare? Perché hai bisogno che se ne vada? – dmon

+0

ma la mia app ha solo un'attività. Solo Main.java. – ARMAGEDDON

+0

Sì, ma c'è un processo che contiene tutte le attività che hai, anche se ne hai una sola, ed è quella che è ancora in esecuzione. – dmon

risposta

9

Premendo (e tenendo premuto) il pulsante HOME non si apre il task manager. Questa è una sorta di sezione "App recenti" che mostra le app aperte di recente. In realtà è un po 'più intelligente di quello - può ripristinare l'ultima attività visitata, ma dal momento che hai una sola attività, questo non dovrebbe essere davvero importante per te

Quindi in pratica anche se puoi vedere la tua app in questo elenco, non significa che sia effettivamente in esecuzione.

+0

L'unica risposta corretta ed esatta è quella con meno voti (almeno fino ad ora)! Hai il mio voto! – thiagolr

+0

Dopo aver cercato diversi modi per uscire da un'applicazione 'onDestroy()' o 'finish()' o 'android.os.Process.killProcess (android.os.Process.myPid()); super.onDestroy(); 'in' onDestroy() '... Tutti hanno portato a questo comportamento. Sono contento di vedere che l'attività non è in pila e si sta semplicemente nascondendo in un elenco di app recenti. Grazie! +1 – tricknology

+0

Mentre è vero che il recente non è esattamente un task manager, questo manca il punto principale fatto da Srikant, che è che finish() non è progettato per ottenere normalmente la chiusura del processo. –

5

finish() dice al sistema Android che hai finito. Spetta al sistema Android decidere quando effettivamente uccidere la tua applicazione. Manterrà la tua applicazione fino a quando il sistema operativo non richiede le risorse. Per il sistema operativo, mantenere l'applicazione nella RAM è più economico rispetto al riavvio dell'app. Questa strategia è vera per la maggior parte dei sistemi operativi moderni.

+0

Penso di aver capito l'idea. – ARMAGEDDON

+0

Anche come @Pavel ha menzionato Dudka, premendo a lungo il pulsante home non si apre il task manager, ma si apre semplicemente l'elenco delle app lanciate di recente (almeno sui telefoni che ho visto). –

5

Se uccidere il processo non è un'opzione auspicabile, cosa devo fare?

Niente, molto probabilmente.

So che il completamento terminerà l'attività ma perché è ancora visibile nel task manager?

In primo luogo, il processo è ancora in esecuzione. Questa è un'ottimizzazione, quindi se l'utente decide di tornare immediatamente alla tua app o qualcos'altro attiva il codice dell'app (ad es. AlarmManager), Android non deve sprecare CPU e batteria biforcandosi subito un altro processo. Android interromperà il tuo processo quando lo riterrà opportuno.

Si noti che a seconda di ciò che si considera il "task manager", l'app potrebbe apparire comunque, anche se il processo è terminato. Ad esempio, premendo a lungo HOME o premendo il pulsante RECENTS vengono visualizzate le "attività recenti", che includono le attività per le quali il processo è stato terminato.

è come non mostrare veramente professionale la barra di avanzamento all'interno della app nel task manager applicazione

Non ho idea del motivo per cui si potrebbe pensare che. Detto questo, siete invitati a override onCreateThumbnail() in your activities a restituire qualcos'altro da usare per l'immagine di anteprima.

1

processi rimangono in stato di S uspended:

PID USER  VSZ STAT COMMAND 
--- ----  --- ---- ------- 
5846 root   0 SW< [ksdioirqd/mmc1] 
5853 u0_a76 306m S {android.youtube} com.google.android.youtube 
5897 root  1852 S /sbin/sh - 
5922 u0_a79 286m S {om.me.mygdxgame} com.me.mygdxgame 
5947 u0_a49 278m S {roid.dspmanager} com.bel.android.dspmanager 
5965 root  1844 R ps -w 

Anche quando tutte le attività sono chiuse.

Non c'è niente di male nel tenere le cose caricate nella RAM quando c'è molto spazio. RAM volatile consuma energia, vuoto o pieno.I processi sospesi non incasinano la CPU. Questi processi saranno terminati quando lo spazio è richiesto. Fino ad allora, servono per essere rapidamente ripristinati e rendere il sistema operativo più veloce.

Le situazioni in cui avrete bisogno di cercare per l'esecuzione di processi sono:

  1. mal gestito le discussioni scappare. Si avvia una discussione che esegue un ciclo, non si sa che finirà mai, e in cima perderai tutti i riferimenti ad essa.
  2. Implementato male e molto spesso, trapelato Servizi. Registrazione del servizio con un gestore di sistema/servizio e dimenticanza di annullare la registrazione.
  3. I processi di sistema vengono eseguiti tramite Runtime.exec() e si dimentica di chiamare destroy() su di essi.

Se si tratta solo di componenti Android semplici e hanno implementato correttamente il loro ciclo di vita. Non hai mai bisogno di preoccuparti dei processi interni.

5

finishAndRemoveTask() è la nuova API di cui alla documentazione "Termina tutte le attività in questa attività e la rimuove dall'elenco delle attività recenti".

if(android.os.Build.VERSION.SDK_INT >= 21) 
{ 
    finishAndRemoveTask(); 
} 
else 
{ 
    finish(); 
} 
Problemi correlati