2011-05-24 9 views
42

Secondo Android Activity Lifecycle, l'unica callback garantita per essere chiamata (se un'attività lascia lo stato di esecuzione, che in genere è previsto) è onPause().Perché implementare onDestroy() se non è garantito il richiamo?

Quindi, devo presumere che ci sono scenari in cui ha senso per implementare onStop() e onDestroy() anche se non sono in realtà garantito di essere chiamato.

Capisco che onStop() debba essere implementato quando è possibile che un'attività ritorni allo stato di esecuzione tramite lo stato Interrotto (perché dovrebbe farlo invece di restituire direttamente è una domanda diversa).

Ma la necessità di onDestroy(), quando riesco a inserire tutti i cleanup/state-saving in onPause(), non è chiara.

Puoi descrivere una situazione di app reale (cioè non analogica alla guida di un'auto, ecc.) In cui avrebbe senso implementare onDestroy()?

+0

Perché in circostanze normali, verrà chiamato onDestroy(). È solo che non è _garantito_ essere chiamato. Ad esempio, se il tuo processo viene ucciso dal oom killer. – Falmarri

+2

@Falmarri Ma un'app ben scritta dovrebbe essere progettata per lo scenario peggiore. Stai implicando un miglioramento delle prestazioni in circostanze normali? – uTubeFan

+0

Perché stai usando quel diagramma (2008 !?) invece di [quello ufficiale] (http://developer.android.com/images/activity_lifecycle.png)? Questa è una cosa che è cambiata un bel po 'dal 1.5. – dmon

risposta

25

onDestroy verrà chiamato se si chiama esplicitamente finish(); te stesso.

L'attività principale chiama startActivityForResult su un'attività della mappa.

Mappa attività con un LocationListener, l'utente fa clic sulla mappa e seleziona dire un ristorante locale.

L'attività quindi, imposta alcuni extra da inviare nuovamente all'attività principale, quindi chiama esplicitamente finish(); su se stesso e in onDestroy uccide il LocationListener e altre variabili che hai invocato.

appena trovato questo nella documentazione

OnDestroy() = La chiamata finale si riceve prima dell'attività è distrutto. Ciò può accadere o perché l'attività sta finendo (qualcuno ha chiamato finish() su di esso, o perché il sistema sta temporaneamente distruggendo questa istanza dell'attività per risparmiare spazio. Puoi distinguere tra questi due scenari con il metodo isFinishing().

+1

+1 per indicarlo. Questo significa che se non chiamo mai 'finish()', 'onDestroy()' non può essere implementato? – uTubeFan

+0

Puoi implementarlo. onDestroy verrà chiamato in altri punti (quando la tua app è in background e viene ucciso dal sistema operativo). – Blundell

+1

come dice @Poldie onDestroy viene anche chiamato quando l'attività viene uccisa e ricreata (quando l'attività passa da verticale a orizzontale sul telefono che viene spostato). – Blundell

Problemi correlati