2013-05-09 7 views
8

Creo un nuovo thread in un'attività e mi affido a onPause() per interrompere il thread. Se la mia app si arresta in modo anomalo o l'attività in qualche modo cessa di esistere, voglio che il thread venga ucciso.La chiamata onPause è garantita quando un'attività non è più in esecuzione?

È possibile chiamare Activity/Fragment.onPause() quando un'attività non è più in esecuzione? In caso contrario, come posso garantire che il thread in questione venga ucciso?

risposta

11

Se la mia applicazione si blocca

onPause() non si chiama qui, ma questo non deve preoccuparsi di come l'intero processo di applicazione cessa di esistere, comprensivo di tutte le discussioni che avete creato (UI o altro) .

attività cessa in qualche modo di esistere

onPause() sarà chiamato ogni volta che l'Activity viene spostato lo sfondo dal primo piano, che è fatto in tutti i modi possibili in cui la vostra attività può essere chiuso, ad eccezione per l'arresto anomalo dell'app. Tuttavia, come accennato in precedenza, l'arresto anomalo dell'applicazione interromperà automaticamente anche il thread.

onPause() viene essenzialmente chiamato ogni volta che l'attività non è più in primo piano. La tua attività potrebbe essere ancora viva e in memoria dopo che è stato chiamato il numero onPause(), ma non esiste uno scenario a cui possa pensare in cui la tua attività è attiva e in background senza chiamare onPause().

+0

cosa succede quando la memoria è bassa e il sistema deve recuperare la memoria per le operazioni correnti in quel caso le attività in pausa sono distrutte (a seconda della priorità)? – Raghunandan

4

Sì, onPause() verrà chiamato quando un'attività non è più in esecuzione. Supponiamo che un'attività venga chiusa, quindi la sequenza di eventi sarà onPause() ->onStop() ->onDestroy(). Anche se la tua attività scivola sullo sfondo quando inizia un'altra attività o quando lo schermo si spegne, viene sempre chiamato onPause() anche se gli altri due metodi non vengono chiamati. Quindi, anche se l'attività cessa, verrà chiamato onPause() e il tuo thread verrà ucciso.

Ma quando l'app si arresta in modo anomalo, insieme all'intera attività, anche il thread che è stato avviato verrà gestito da Android completando tutto.

1

Supponiamo di avere due attività A e B. Si naviga da A a B. L'attività A passa allo sfondo cioè l'attività A è in pausa. L'attività B prende fuoco cioè in primo piano. Quando si fa clic sul pulsante indietro, l'attività B viene estratta dallo stack posteriore e l'attività A si concentra sull'attività A riprende.

Quando si visualizza una finestra di dialogo in attività, l'attività in pausa e la finestra di dialogo vengono visualizzate al clic sul pulsante Indietro, la finestra di dialogo viene chiusa e l'attività riprende (in primo piano).

Quando l'attività non è più in esecuzione, è in background, quindi è in pausa. Sono d'accordo con Raghav Sood su cosa succede quando l'app si arresta in modo anomalo.

Di solito si deve usare il callback onPause() a:

animazioni in stop o altre azioni in corso che potrebbero consumare CPU. Applica modifiche non salvate, ma solo se gli utenti si aspettano che tali modifiche vengano salvate in modo permanente quando escono (come una bozza di email). Rilasciare le risorse di sistema, come ricevitori broadcast, handle per sensori (come il GPS) o qualsiasi risorsa che possa influire sulla durata della batteria mentre l'attività è in pausa e l'utente non ne ha bisogno.

Nota:

compiti multipli possono essere tenute in background in una sola volta. Tuttavia, se l'utente esegue contemporaneamente numerose attività in background, il sistema potrebbe iniziare a distruggere le attività in background per recuperare la memoria, causando la perdita degli stati di attività.

Problemi correlati